X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/3283f75e5ca5fe1193054dfacd5f3a131f17b74d..71026445ea6cd499c9f8d194ddbdc9607665a719:/emufs/tipo1.c diff --git a/emufs/tipo1.c b/emufs/tipo1.c index 6e35771..5d8dfff 100644 --- a/emufs/tipo1.c +++ b/emufs/tipo1.c @@ -68,6 +68,13 @@ static void emufs_tipo1_escribir_reg_en_memoria(char*, EMUFS_TIPO1_REG_HEADER, static void emufs_tipo1_escribir_reg_chunk_en_memoria(char* dst, EMUFS_TIPO1_REG_HEADER header, char* reg, EMUFS_REG_SIZE reg_size); +/** Lee el bloque \param num_bloque y lo almacena en \c ptr. */ +static void* emufs_tipo1_leer_bloque(EMUFS*, EMUFS_BLOCK_ID, int*); + +/** Graba el bloque apuntado por \c ptr en el archivo. */ +static EMUFS_BLOCK_ID emufs_tipo1_grabar_bloque(EMUFS*, void*, EMUFS_BLOCK_ID, + int*); + /*------------------ Funciones públicas ----------------------*/ int emufs_tipo1_inicializar(EMUFS* efs) @@ -364,7 +371,6 @@ int emufs_tipo1_borrar_registro(EMUFS* efs, EMUFS_REG_ID reg_id) do { /* Copio la cabecera del registro actual. */ memcpy(&curr_reg_header, block + offset, sizeof(EMUFS_TIPO1_REG_HEADER)); - offset += sizeof(EMUFS_TIPO1_REG_HEADER); if (curr_reg_header.id == reg_id) { /* identificador del bloque actual */ EMUFS_BLOCK_ID curr_block_id = block_id; @@ -417,10 +423,30 @@ int emufs_tipo1_borrar_registro(EMUFS* efs, EMUFS_REG_ID reg_id) return err; } - /* TODO desplazar a izquierda registros */ + /* desplazo registros a izquierda */ + { /* offset del fin del registro a borrar */ + EMUFS_BLOCK_SIZE offset_reg_end = offset + + sizeof(EMUFS_TIPO1_REG_HEADER) + curr_reg_header.size; + /* si es necesario desplazar */ + if (offset < offset_reg_end) { + /* muevo la porción de bloque a izquierda */ + memcpy(block + offset, block + offset_reg_end, + efs->tam_bloque - offset_reg_end); + } + } + /* guardo el bloque en disco */ + emufs_tipo1_grabar_bloque(efs, block, curr_block_id, &err); + if (err) { + /* TODO Manejo de errores */ + PERR("no se pudo grabar bloque en disco"); + free(block); + return err; + } + + break; /* salgo del loop, ya hice todo lo que tenía que hacer */ } /* desplazo el offset */ - offset += curr_reg_header.size; + offset += sizeof(EMUFS_TIPO1_REG_HEADER) + curr_reg_header.size; /* esto no debería ser nunca false porque sé positivamente que el */ } while (offset < efs->tam_bloque); /* registro está en el bloque */