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)
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;
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 */