From: Ricardo Markiewicz Date: Wed, 14 Apr 2004 19:43:44 +0000 (+0000) Subject: * Agrego leer_registro_raw a tipo1 X-Git-Tag: svn_import_r684~487 X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/commitdiff_plain/ee1e9c0b0bf3af3579980b6cda4237efbc37e876?ds=inline * Agrego leer_registro_raw a tipo1 --- diff --git a/emufs/tipo1.c b/emufs/tipo1.c index 024839b..4ef7f76 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; } @@ -351,3 +352,42 @@ 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); + + return block; +} + diff --git a/emufs/tipo1.h b/emufs/tipo1.h index d61bcf2..830e60c 100644 --- a/emufs/tipo1.h +++ b/emufs/tipo1.h @@ -61,6 +61,8 @@ int emufs_tipo1_borrar_registro(EMUFS*, EMUFS_REG_ID); /** Método para modificar un registro */ EMUFS_REG_ID emufs_tipo1_modificar_registro(EMUFS *emu, EMUFS_REG_ID, void*, EMUFS_REG_SIZE, int*); +void* emufs_tipo1_leer_registro_raw(EMUFS *emu, EMUFS_REG_ID id, EMUFS_REG_SIZE *size, int *pos); + /* int emufs_tipo1_buscar_lugar(EMUFS *emu, EMUFS_REG_SIZE tam_reg, EMUFS_FREE *free_space);