From 2c6bdf99d8de44452bdca921bf12bd1cc9350757 Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Sat, 17 Apr 2004 22:12:09 +0000 Subject: [PATCH] Se agrega funcion emufs_fsc_buscar_n_lugares() para buscar bloques consecutivos con espacio para registros multibloque. --- emufs/fsc.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++ emufs/fsc.h | 21 ++++++++++++++++--- 2 files changed, 78 insertions(+), 3 deletions(-) diff --git a/emufs/fsc.c b/emufs/fsc.c index cc634c5..9063c81 100644 --- a/emufs/fsc.c +++ b/emufs/fsc.c @@ -355,6 +355,66 @@ EMUFS_BLOCK_ID emufs_fsc_buscar_lugar(EMUFS *emu, EMUFS_FREE reg_size, EMUFS_FRE return reg.marker; } +/** Busca n lugares consecutivos devolviendo el id del primer bloque. */ +EMUFS_BLOCK_ID emufs_fsc_buscar_n_lugares(EMUFS* efs, size_t n, + EMUFS_FREE reg_size, EMUFS_FREE *freespace, int* err) +{ + FILE *f_fsc; + EMUFS_FSC reg; + char name_f_fsc[255]; + + /* chequeo que al menos se busque un lugar */ + if (!n) { + PERR("Se debe buscar al menos un lugar"); + *err = 13; /* EMUFS_ERROR_WRONG_ARGUMENT */ + return EMUFS_NOT_FOUND; + } + + /* abre archivo */ + strcpy(name_f_fsc, efs->nombre); + strcat(name_f_fsc, EMUFS_FSC_EXT); + if (!(f_fsc = fopen(name_f_fsc, "rb"))) { + PERR("No se puede abrir archivo"); + *err = 4; /* EMUFS_ERROR_CANT_OPEN_FILE */ + return EMUFS_NOT_FOUND; + } + + /* busca el espacio libre */ + while(!feof(f_fsc)) { + if ((fread(®, sizeof(EMUFS_FSC), 1, f_fsc) != 1)) { + if (feof(f_fsc)) break; + PERR("No se puede leer el archivo"); + *err = 3; /* EMUFS_ERROR_FILE_READ */ + return EMUFS_NOT_FOUND; + } + if (reg.freespace >= reg_size) { + int found = 1; + EMUFS_BLOCK_ID first_id = reg.marker; + *freespace = reg.freespace; + while (--n) { + if (fread(®, sizeof(EMUFS_FSC), 1, f_fsc) != 1) { + if (feof(f_fsc)) break; + PERR("No se puede leer el archivo"); + *err = 3; /* EMUFS_ERROR_FILE_READ */ + return EMUFS_NOT_FOUND; + } + /* no hay otro lugar consecutivo */ + if (reg.freespace < reg_size) { + found = 0; + break; + } + } + if (found) { + fclose(f_fsc); + return first_id; + } + } + } + /* no se encontró espacio libre */ + *freespace = efs->tam_bloque; + return EMUFS_NOT_FOUND; +} + /* Devuelve el espacio libre de un Bloque o Gap dado */ EMUFS_FREE emufs_fsc_get_fs(EMUFS *emu, EMUFS_BLOCK_ID marker) { diff --git a/emufs/fsc.h b/emufs/fsc.h index 6e10be1..8a228f9 100644 --- a/emufs/fsc.h +++ b/emufs/fsc.h @@ -65,11 +65,25 @@ int emufs_fsc_actualizar_gap(EMUFS *emu, EMUFS_OFFSET off, EMUFS_FREE fs); /** Actualiza un registro de espacio libre de acorde al FType */ int emufs_fsc_actualizar(EMUFS *emu, EMUFS_BLOCK_ID block, EMUFS_FREE fs); -/** Me devuelve el ID del bloque u Offset del Gap donde quepa un registro, - * y guarda en \param n_freespace el espacio libre actualizado - */ +/** Busca un bloque o gap en donde quepa un registro. + * + * Si encuentra el lugar buscado, devuelve en \c freespace el espacio libre en + * ese bloque o gap. + */ EMUFS_BLOCK_ID emufs_fsc_buscar_lugar(EMUFS *emu, EMUFS_FREE reg_size, EMUFS_FREE *n_freespace); +/** Busca una una serie de bloques consecutivos con espacio libre. + * + * De encontrarlo devuelve el identificador del primer bloque de la serie y el + * espacio libre en él. + * + * \note Considera el fin de archivo como espacio libre. Es decir, si buscamos 3 + * bloques libres y encuentra uno al final del archivo, lo devuelve porque + * asume que podemos seguir agregando bloques al final. + */ +EMUFS_BLOCK_ID emufs_fsc_buscar_n_lugares(EMUFS*, size_t, EMUFS_FREE, + EMUFS_FREE*, int*); + /** Devuelve el espacio libre de un Bloque o Gap dado */ EMUFS_FREE emufs_fsc_get_fs(EMUFS *emu, EMUFS_BLOCK_ID block); @@ -87,4 +101,5 @@ int emufs_fsc_truncate(EMUFS *emu, EMUFS_BLOCK_ID block); /** Devuelve la cantidad de bloques vacios en el archivo*/ int emufs_fsc_get_cant_bloques_vacios(EMUFS *emu); + #endif /* _EMUFS_FSC_H */ -- 2.43.0