From: Ricardo Markiewicz Date: Wed, 14 Apr 2004 17:58:29 +0000 (+0000) Subject: * Agrego leer_registro_raw en EMUFS y para tipo3 X-Git-Tag: svn_import_r684~491 X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/commitdiff_plain/5df9bdcff11e0a64b9c05ca5294d6edf0a62603f?ds=sidebyside * Agrego leer_registro_raw en EMUFS y para tipo3 * En tipo3 hago que cuando se crea un nuevo bloque se lo pone todo en 0 (asi la GUI se ve mejor). Tambien arreglo un bug en el que al borrar se estaba haciendo un desplazamiento de mas. --- diff --git a/emufs/emufs.c b/emufs/emufs.c index 293d556..33c114a 100644 --- a/emufs/emufs.c +++ b/emufs/emufs.c @@ -157,8 +157,9 @@ EMUFS *emufs_crear(const char *filename, EMUFS_Tipo tipo, EMUFS_BLOCK_SIZE tam_b case T3: /* Asigna punteros a funciones. */ - efs->leer_bloque = emufs_tipo3_leer_bloque; - efs->leer_registro = emufs_tipo3_leer_registro; + efs->leer_bloque = emufs_tipo3_leer_bloque; + efs->leer_registro = emufs_tipo3_leer_registro; + efs->leer_registro_raw = emufs_tipo3_leer_registro_raw; efs->grabar_registro = emufs_tipo3_grabar_registro; efs->borrar_registro = emufs_tipo3_borrar_registro; efs->leer_estadisticas = emufs_tipo3_leer_estadisticas; @@ -230,8 +231,9 @@ EMUFS *emufs_abrir(const char *filename) return NULL; } /* Asigna punteros a funciones. */ - efs->leer_bloque = emufs_tipo3_leer_bloque; - efs->leer_registro = emufs_tipo3_leer_registro; + efs->leer_bloque = emufs_tipo3_leer_bloque; + efs->leer_registro_raw = emufs_tipo3_leer_registro_raw; + efs->leer_registro = emufs_tipo3_leer_registro; efs->grabar_registro = emufs_tipo3_grabar_registro; efs->borrar_registro = emufs_tipo3_borrar_registro; efs->leer_estadisticas = emufs_tipo3_leer_estadisticas; diff --git a/emufs/emufs.h b/emufs/emufs.h index fd2c9ca..6ba63b3 100644 --- a/emufs/emufs.h +++ b/emufs/emufs.h @@ -117,6 +117,7 @@ typedef struct _emu_fs_t { EMUFS_REG_SIZE tam_reg; /**< Tamaño de registro. 0 Si son registros variables */ void* (*leer_bloque)(struct _emu_fs_t*, EMUFS_BLOCK_ID, int*); /**< Método para leer un bloque */ void* (*leer_registro)(struct _emu_fs_t*, EMUFS_REG_ID, EMUFS_REG_SIZE*, int*); /**< Método para leer un registro */ + void* (*leer_registro_raw)(struct _emu_fs_t*, EMUFS_REG_ID, EMUFS_REG_SIZE*, int *); /**< Método para leer un registro con todo su bloque asociado */ EMUFS_REG_ID (*grabar_registro)(struct _emu_fs_t*, void*, EMUFS_REG_SIZE, int*); /**< Método para grabar un registro */ EMUFS_REG_ID (*modificar_registro)(struct _emu_fs_t*, EMUFS_REG_ID, void*, EMUFS_REG_SIZE, int*); /**< Método para modificar un registro */ int (*borrar_registro)(struct _emu_fs_t*, EMUFS_REG_ID); /**< Método para borrar un registro */ diff --git a/emufs/tipo3.c b/emufs/tipo3.c index 24153cb..0e428e1 100644 --- a/emufs/tipo3.c +++ b/emufs/tipo3.c @@ -141,6 +141,7 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE t if ( (file = fopen(name_f,"a+"))==NULL ) return -1; /*ERROR*/ /*crear un nuevo bloque en memoria */ bloque = (char*)malloc(emu->tam_bloque); + memset(bloque, 0, emu->tam_bloque); /* grabar el registro al principio del bloque */ /*tengo que buscar un ID valido para el nuevo registro*/ ID_aux = emufs_idx_get_new_id(emu, err); @@ -250,8 +251,10 @@ int emufs_tipo3_borrar_registro(EMUFS *emu, EMUFS_REG_ID ID) /*apunto al registro que voy a mover*/ ptr_mov = ptr_elim + emu->tam_reg + sizeof(EMUFS_REG_ID); - while ( ptr_mov < emu->tam_bloque ){ + while ( (ptr_mov+sizeof(EMUFS_REG_ID)+emu->tam_reg) < emu->tam_bloque ){ memcpy(bloque+ptr_elim, bloque+ptr_mov, sizeof(EMUFS_REG_ID)+emu->tam_reg); + /* Blanqueo el area que movi */ + memset(bloque+ptr_mov, 0, sizeof(EMUFS_REG_ID)+emu->tam_reg); ptr_elim = ptr_mov; ptr_mov += sizeof(EMUFS_REG_ID) + emu->tam_reg; } @@ -308,3 +311,43 @@ EMUFS_REG_ID emufs_tipo3_modificar_registro(EMUFS *emu, EMUFS_REG_ID id, void *d return emufs_tipo3_grabar_registro(emu, data, size, error); } +void* emufs_tipo3_leer_registro_raw(EMUFS *emu, EMUFS_REG_ID ID, EMUFS_REG_SIZE *size, int *pos) +{ + char* bloque; + EMUFS_BLOCK_ID block; + EMUFS_REG_ID ID_aux; + EMUFS_BLOCK_SIZE iterador = 0; + int err; + + /*si existe, lo busco en el archivo de bloques*/ + block = emufs_idx_buscar_registro(emu,ID); /*me devuelve el nro de bloque al que pertenece el registro*/ + if ( block == EMUFS_NOT_FOUND ){ + PERR("No se encontro el bloque"); + return NULL; + } + if ((bloque = emufs_tipo3_leer_bloque(emu, block, &err)) == NULL) { + /* TODO Manejo de errores, queda en el codigo de error lo que devolvio + * emufs_tipo3_leer_bloque() */ + PERR("no se pudo leer el bloque"); + return NULL; /*No se pudo leer el bloque*/ + } + + ID_aux = -1; + iterador = 0; + /* Busco el offset desde el comienzo desde donde arranca el registro + * buscado, para luego resaltarlo en al GUI + */ + while ( iterador < emu->tam_bloque ) { + memcpy(&ID_aux, bloque+iterador, sizeof(EMUFS_REG_ID)); + if ( ID_aux == ID ){ + *pos = iterador; + *size = emu->tam_bloque; + break; + } + iterador += sizeof(EMUFS_REG_ID); + iterador += emu->tam_reg; + } + + return bloque; +} + diff --git a/emufs/tipo3.h b/emufs/tipo3.h index 5e9b547..7c85555 100644 --- a/emufs/tipo3.h +++ b/emufs/tipo3.h @@ -68,4 +68,6 @@ EMUFS_REG_ID emufs_tipo3_modificar_registro(EMUFS *emu, EMUFS_REG_ID, void*, EMU EMUFS_Estadisticas emufs_tipo3_leer_estadisticas(EMUFS *); +void* emufs_tipo3_leer_registro_raw(struct _emu_fs_t*, EMUFS_REG_ID, EMUFS_REG_SIZE*, int *); + #endif /* _EMUFS_TIPO3_H_ */