X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/15bf403f66891d89987a3a429b83a632fca74c5b..80aa04fe7756cf1670b51e01238b166d95eb43e4:/emufs/tipo1.c diff --git a/emufs/tipo1.c b/emufs/tipo1.c index 024839b..769d7b2 100644 --- a/emufs/tipo1.c +++ b/emufs/tipo1.c @@ -64,6 +64,7 @@ int emufs_tipo1_inicializar(EMUFS* efs) efs->leer_registro = emufs_tipo1_leer_registro; efs->grabar_registro = emufs_tipo1_grabar_registro; efs->borrar_registro = emufs_tipo1_borrar_registro; + efs->leer_registro_raw = emufs_tipo1_leer_registro_raw; return 0; } @@ -175,6 +176,7 @@ EMUFS_REG_ID emufs_tipo1_grabar_registro(EMUFS* efs, void* reg, if (block_id == EMUFS_NOT_FOUND) { /* crear un nuevo bloque en memoria */ block = (char*) malloc(efs->tam_bloque); + memset(block, 0, efs->tam_bloque); if (block == NULL) { /* TODO Manejo de errores */ PERR("No hay memoria"); @@ -351,3 +353,43 @@ EMUFS_REG_ID emufs_tipo1_modificar_registro(EMUFS *emu, EMUFS_REG_ID id, void *d emufs_tipo1_borrar_registro(emu, id); return emufs_tipo1_grabar_registro(emu, data, size, error); } + +void* emufs_tipo1_leer_registro_raw(EMUFS *efs, EMUFS_REG_ID id, EMUFS_REG_SIZE *size, int *pos) +{ + char* block; /* bloque leido (en donde está el registro a leer) */ + EMUFS_BLOCK_ID block_id; /* id del bloque en donde esta el registro a leer */ + EMUFS_BLOCK_SIZE offset; /* offset del bloque leído */ + EMUFS_BLOCK_SIZE block_size; /* tamaño del bloque leído */ + EMUFS_REG_SIZE curr_reg_size; /* tamaño del registro leído secuencialmente */ + EMUFS_REG_ID curr_reg_id; /* id del registro leído secuencialmente */ + int err; + + block_id = emufs_idx_buscar_registro(efs, id); + if (block_id == EMUFS_NOT_FOUND) { + return NULL; + } + if (!(block = (char*) emufs_tipo1_leer_bloque(efs, block_id, &err))) { + return NULL; + } + + /* Busco secuencialmente en el bloque el registro a leer */ + offset = 0; + do { + /* Copio el id del registro de la cabecera. */ + memcpy(&curr_reg_id, block + offset, sizeof(EMUFS_REG_ID)); + offset += sizeof(EMUFS_REG_ID); + /* Copio el tamaño del registro de la cabecera. */ + memcpy(&curr_reg_size, block + offset, sizeof(EMUFS_REG_SIZE)); + offset += sizeof(EMUFS_REG_SIZE); + if (curr_reg_id == id) { + *pos = offset-sizeof(EMUFS_REG_ID)-sizeof(EMUFS_REG_SIZE); + break; + } + /* Desplazo el offset */ + offset += curr_reg_size; + } while (offset < block_size); + + (*size) = efs->tam_bloque; + return block; +} +