From c831082edc6038351f9ec6c2e55b85ef41d213f4 Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Sat, 10 Apr 2004 21:20:26 +0000 Subject: [PATCH] - Se hace que leer_registro() y leer_bloque() devuelvan un puntero al fragmento de memoria alocada para almacenar el registro/bloque a leer. Para reportar errores, reciben un puntero a un entero como parametro. - Se corrige prototipo de emufs_tipo3_grabar_registro(). - Se arregla test3_main.c para que compile. - Se agrega una constante EMUFS_NOT_FOUND (== (unsigned long) -1 == ULONG_MAX) para que sea mas legible el codigo (para usar en vez del -1). --- emufs/emufs.c | 4 +-- emufs/emufs.h | 10 +++++-- emufs/tipo1.c | 66 ++++++++++++++++++++++++++--------------- emufs/tipo1.h | 16 +++++----- emufs/tipo3.c | 73 +++++++++++++++++++++++++++++----------------- emufs/tipo3.h | 6 ++-- emufs/tipo3_main.c | 10 +++++-- 7 files changed, 117 insertions(+), 68 deletions(-) diff --git a/emufs/emufs.c b/emufs/emufs.c index b67ffaa..5ea76a1 100644 --- a/emufs/emufs.c +++ b/emufs/emufs.c @@ -268,7 +268,7 @@ int ver_archivo_FS(EMUFS *emu) } fread(®,sizeof(reg),1,f_block_free); while ( !feof(f_block_free) ){ - printf(" Bloque = %li Espacio libre = %li\n",reg.n_Marker, reg.n_FreeSpace); + printf(" Bloque = %li Espacio libre = %li\n",reg.n_marker, reg.n_freespace); fread(®,sizeof(reg),1,f_block_free); } @@ -283,7 +283,7 @@ int ver_archivo_FS(EMUFS *emu) f_block_free = fopen(name_f_block_free, "r"); fread(&r, sizeof(EMUFS_IDX), 1, f_block_free); while (!feof(f_block_free)) { - printf("ID %li en bloque %li\n", r.n_IdReg, r.n_Location); + printf("ID %li en bloque %li\n", r.n_idreg, r.n_location); fread(&r, sizeof(EMUFS_IDX), 1, f_block_free); } fclose(f_block_free); diff --git a/emufs/emufs.h b/emufs/emufs.h index 280b72a..882453c 100644 --- a/emufs/emufs.h +++ b/emufs/emufs.h @@ -68,6 +68,12 @@ typedef unsigned long EMUFS_FREE; /** Tipo de offset. */ typedef unsigned long EMUFS_OFFSET; +/** Constante para indicar el valor especial de un ID inválido. + * + * El uso típico es para indicar que no se encontró el ID en una búsqueda. + */ +#define EMUFS_NOT_FOUND -1ul + /** Tipo Abstracto para menajo de archivos. * * Esta estructura es utilizada para acceder a cualquier tipo de archivo. @@ -90,8 +96,8 @@ typedef struct _emu_fs_t { EMUFS_TYPE tipo; EMUFS_BLOCK_SIZE tam_bloque; /**< Tamaño de bloque. 0 Si no tiene bloques */ EMUFS_REG_SIZE tam_reg; /**< Tamaño de registro. 0 Si son registros variables */ - int (*leer_bloque)(struct _emu_fs_t*, EMUFS_BLOCK_ID, void*); /**< Método para leer un bloque */ - int (*leer_registro)(struct _emu_fs_t*, EMUFS_REG_ID, void *); /**< Método para leer un registro */ + 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, int*); /**< Método para leer un registro */ EMUFS_REG_ID (*grabar_registro)(struct _emu_fs_t*, void*, EMUFS_REG_SIZE); /**< Método para grabar un registro */ int (*borrar_registro)(struct _emu_fs_t*, EMUFS_REG_ID); /**< Método para borrar un registro */ char *nombre; /**< Nombre del archivo */ diff --git a/emufs/tipo1.c b/emufs/tipo1.c index d68095f..666206d 100644 --- a/emufs/tipo1.c +++ b/emufs/tipo1.c @@ -54,29 +54,28 @@ int emufs_tipo1_inicializar(EMUFS* efs) return 0; } -int emufs_tipo1_leer_registro(EMUFS* efs, EMUFS_REG_ID reg_id, void* reg_ptr, - EMUFS_REG_SIZE reg_size) +void* emufs_tipo1_leer_registro(EMUFS* efs, EMUFS_REG_ID reg_id, int *err) { char* block; /* bloque leido (en donde está el registro a leer) */ + char* registro; /* 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 */ + *err = 0; block_id = emufs_idx_buscar_registro(efs, reg_id); - block = (char*) malloc(efs->tam_bloque); - if (block == NULL) { + if (block_id == EMUFS_NOT_FOUND) { /* TODO Manejo de errores */ - printf("No hay memoria.\n"); - return -1; + printf("Registro no encontrado.\n"); + *err = (int) EMUFS_NOT_FOUND; + return NULL; } - - if (emufs_tipo1_leer_bloque(efs, block_id, block) == -1) { + if (!(block = emufs_tipo1_leer_bloque(efs, block_id, err))) { /* TODO Manejo de errores */ - free(block); printf("no se pudo leer el bloque\n"); - return -1; + return NULL; } /* Busco secuencialmente en el bloque el registro a leer */ @@ -89,8 +88,15 @@ int emufs_tipo1_leer_registro(EMUFS* efs, EMUFS_REG_ID reg_id, void* reg_ptr, memcpy(&curr_reg_size, block + offset, sizeof(EMUFS_REG_SIZE)); offset += sizeof(EMUFS_REG_SIZE); if (curr_reg_id == reg_id) { - /* XXX Posible checkeo de reg_size == curr_reg_size */ - memcpy(reg_ptr, block + offset, curr_reg_size); + registro = (char*) malloc(curr_reg_size); + if (registro == NULL) { + /* TODO Manejo de errores */ + free(block); + printf("No hay memoria.\n"); + *err = 2; /* EMUFS_ERROR_OUT_OF_MEMORY */ + return NULL; + } + memcpy(registro, block + offset, curr_reg_size); break; } /* Desplazo el offset */ @@ -98,20 +104,21 @@ int emufs_tipo1_leer_registro(EMUFS* efs, EMUFS_REG_ID reg_id, void* reg_ptr, } while (offset < block_size); free(block); - return 0; + return registro; } -int emufs_tipo1_leer_bloque(EMUFS* efs, EMUFS_BLOCK_ID block_id, void *block) +void* emufs_tipo1_leer_bloque(EMUFS* efs, EMUFS_BLOCK_ID block_id, int *err) { FILE* file; - char name_f[255]; - long cant; - + char* block; /* bloque leido (en donde está el registro a leer) */ + char name_f[255]; + strcpy(name_f,efs->nombre); strcat(name_f,".dat"); - - if ( (file = fopen(name_f,"r"))==NULL ) { - return -1; /* FIXME ERROR */ + + if ((file = fopen(name_f, "r")) == NULL) { + *err = 4; /* EMUFS_ERROR_CANT_OPEN_FILE */ + return NULL; /* FIXME ERROR */ } fseek(file, sizeof(EMUFS_TYPE) + /* Cabecera tipo */ @@ -119,12 +126,25 @@ int emufs_tipo1_leer_bloque(EMUFS* efs, EMUFS_BLOCK_ID block_id, void *block) SEEK_SET); /* FIXME: verificar que no se pase de fin de archivo*/ fseek(file, block_id * efs->tam_bloque, SEEK_CUR); - cant = fread(block, sizeof(char), efs->tam_bloque, file); + block = (char*) malloc(efs->tam_bloque); + if (block == NULL) { + /* TODO Manejo de errores */ + printf("No hay memoria.\n"); + *err = 2; /* EMUFS_ERROR_OUT_OF_MEMORY */ + return NULL; + } + if (fread(block, efs->tam_bloque, 1, file) != 1) { + /* TODO Manejo de errores */ + free(block); + printf("Error al leer bloque.\n"); + *err = 3; /* EMUFS_ERROR_FILE_READ */ + return NULL; + } fclose(file); - return cant; + return block; } -EMUFS_REG_ID emufs_tipo1_grabar_registro(EMUFS* emu, void* ptr, +EMUFS_REG_ID emufs_tipo1_grabar_registro(EMUFS* efs, void* reg_ptr, EMUFS_REG_SIZE reg_size) { return -1; /* FIXME Error */ diff --git a/emufs/tipo1.h b/emufs/tipo1.h index efd68c9..4bc6a7e 100644 --- a/emufs/tipo1.h +++ b/emufs/tipo1.h @@ -43,24 +43,22 @@ int emufs_tipo1_inicializar(EMUFS*); /** Lee el registro \param id_reg y lo almacena en \param ptr */ -int emufs_tipo1_leer_registro(EMUFS *emu, EMUFS_REG_ID id_reg, void *ptr, - EMUFS_REG_SIZE tam_reg); +void* emufs_tipo1_leer_registro(EMUFS*, EMUFS_REG_ID, int*); /** Lee el bloque \param num_bloque y lo almacena en \param ptr */ -int emufs_tipo1_leer_bloque(EMUFS *emu, EMUFS_BLOCK_ID num_bloque, void *ptr); +void* emufs_tipo1_leer_bloque(EMUFS*, EMUFS_BLOCK_ID, int*); /** Graba el registro apuntado por \param ptr en el archivo */ -EMUFS_REG_ID emufs_tipo1_grabar_registro(EMUFS* emu, void* ptr, EMUFS_REG_SIZE); +EMUFS_REG_ID emufs_tipo1_grabar_registro(EMUFS*, void*, EMUFS_REG_SIZE); /** Graba el bloque apuntado por \param ptr en el archivo */ -int emufs_tipo1_grabar_bloque(EMUFS *emu, void *ptr, EMUFS_BLOCK_ID num_bloque); +int emufs_tipo1_grabar_bloque(EMUFS*, void*, EMUFS_BLOCK_ID); -EMUFS_REG_ID emufs_tipo1_get_id(EMUFS *emu); +EMUFS_REG_ID emufs_tipo1_get_id(EMUFS*); -int emufs_tipo1_buscar_registro(EMUFS *emu, EMUFS_REG_ID id_reg); +int emufs_tipo1_buscar_registro(EMUFS*, EMUFS_REG_ID); -int emufs_tipo1_borrar_registro(EMUFS *emu, EMUFS_REG_ID id_reg, - EMUFS_REG_SIZE tam_reg); +int emufs_tipo1_borrar_registro(EMUFS*, EMUFS_REG_ID, EMUFS_REG_SIZE); /* int emufs_tipo1_buscar_lugar(EMUFS *emu, EMUFS_REG_SIZE tam_reg, diff --git a/emufs/tipo3.c b/emufs/tipo3.c index 5ccb519..601d3df 100644 --- a/emufs/tipo3.c +++ b/emufs/tipo3.c @@ -38,25 +38,21 @@ #include "tipo3.h" /** Leo un registro del archivo, devuelve cero si no lo encuentra.**/ -int emufs_tipo3_leer_registro(EMUFS *emu, EMUFS_REG_ID ID, void *ptr) +void* emufs_tipo3_leer_registro(EMUFS *emu, EMUFS_REG_ID ID, int* err) { char* bloque; + char* registro; /* registro a leer */ EMUFS_BLOCK_ID block; EMUFS_REG_ID ID_aux; EMUFS_BLOCK_SIZE iterador = 0; /*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*/ - bloque = (char*)malloc(emu->tam_bloque); - if (bloque == NULL) { - printf("No hay memoria.\n"); - return -1; - } - - if (emufs_tipo3_leer_bloque(emu, block, bloque)==-1) { - free(bloque); + 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() */ printf("no se pudo leer el bloque\n"); - return -1; /*No se pudo leer el bloque*/ + return NULL; /*No se pudo leer el bloque*/ } ID_aux = -1; @@ -65,36 +61,61 @@ int emufs_tipo3_leer_registro(EMUFS *emu, EMUFS_REG_ID ID, void *ptr) memcpy(&ID_aux, bloque+iterador, sizeof(EMUFS_REG_ID)); iterador += sizeof(EMUFS_REG_ID); if ( ID_aux == ID ){ - memcpy(ptr,bloque+iterador,emu->tam_reg); + registro = (char*) malloc(emu->tam_reg); + if (registro == NULL) { + /* TODO Manejo de errores */ + free(bloque); + printf("No hay memoria.\n"); + *err = 2; /* EMUFS_ERROR_OUT_OF_MEMORY */ + return NULL; + } + memcpy(registro,bloque+iterador,emu->tam_reg); break; } iterador += emu->tam_reg; } free(bloque); - return 0; + return registro; } /*leo el bloque "ID" del archivo que viene en "emu->nombre", y lo almaceno en "ptr"*/ -int emufs_tipo3_leer_bloque(EMUFS *emu, EMUFS_REG_ID ID, void* ptr) +void* emufs_tipo3_leer_bloque(EMUFS *emu, EMUFS_REG_ID ID, int* err) { FILE* file; + char* block; /* bloque leido (en donde está el registro a leer) */ char name_f[255]; strcpy(name_f,emu->nombre); strcat(name_f,".dat"); - if ( (file = fopen(name_f,"r"))==NULL ) return -1; /*ERROR*/ + if ((file = fopen(name_f, "r")) == NULL) { + *err = 4; /* EMUFS_ERROR_CANT_OPEN_FILE */ + return NULL; /* FIXME ERROR */ + } fseek(file,sizeof(EMUFS_TYPE)+sizeof(EMUFS_BLOCK_SIZE)+sizeof(EMUFS_REG_SIZE),SEEK_SET); /*FIXME: verificar que no se pase de fin de archivo*/ fseek(file,ID*emu->tam_bloque,SEEK_CUR); - if (fread(ptr,emu->tam_bloque,1,file)!=1) return -1; + block = (char*) malloc(emu->tam_bloque); + if (block == NULL) { + /* TODO Manejo de errores */ + printf("No hay memoria.\n"); + *err = 2; /* EMUFS_ERROR_OUT_OF_MEMORY */ + return NULL; + } + if (fread(block, emu->tam_bloque, 1, file) != 1) { + /* TODO Manejo de errores */ + free(block); + printf("Error al leer bloque.\n"); + *err = 3; /* EMUFS_ERROR_FILE_READ */ + return NULL; + } fclose(file); - return 0; + return block; } -EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr) +EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE tam) { EMUFS_REG_ID ID_aux; EMUFS_FREE fs; @@ -103,6 +124,7 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr) FILE *file; char name_f[255]; char* bloque; + int err = 0; strcpy(name_f,emu->nombre); strcat(name_f,".dat"); @@ -142,10 +164,10 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr) } } else { /*cargo el bloque en "bloque"*/ - bloque = (char*)malloc(emu->tam_bloque); - if ( emufs_tipo3_leer_bloque(emu,num_bloque,bloque)== -1) { - printf("Error: no se pudo leer bloque\n"); - return -1; + if (!(bloque = emufs_tipo3_leer_bloque(emu, num_bloque, &err))) { + /* TODO Manejo de errores */ + printf("no se pudo leer el bloque\n"); + return -1; } /*El error puede haberse producido porque la funcion leer_bloque devolvio -1, el cual es un bloque invalido*/ /*insertar el registro en el bloque*/ @@ -155,7 +177,6 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr) memcpy(bloque+emu->tam_bloque-fs,&ID_aux,sizeof(EMUFS_REG_ID)); /*grabo el registro en el bloque*/ memcpy(bloque+emu->tam_bloque-fs+sizeof(EMUFS_REG_ID),ptr,emu->tam_reg); - /*guardo el bloque en el archivo*/ if ( emufs_tipo3_grabar_bloque(emu, bloque, num_bloque) != 0) { printf("error al grabar bloque\n"); return -1; /* se produjo un error */ @@ -216,12 +237,12 @@ int emufs_tipo3_borrar_registro(EMUFS *emu, EMUFS_REG_ID ID) EMUFS_REG_ID ID_aux; EMUFS_FREE fs; char *bloque; + int err = 0; num_bloque = emufs_idx_buscar_registro(emu, ID); - bloque = (char*)malloc(emu->tam_bloque); - if ( emufs_tipo3_leer_bloque(emu,num_bloque, bloque) == -1 ) { - printf("No se encontro el bloque\n"); - free(bloque); + if (!(bloque = emufs_tipo3_leer_bloque(emu, num_bloque, &err))) { + /* TODO Manejo de errores */ + printf("no se pudo leer el bloque\n"); return -1; } diff --git a/emufs/tipo3.h b/emufs/tipo3.h index e52986a..d325543 100644 --- a/emufs/tipo3.h +++ b/emufs/tipo3.h @@ -48,13 +48,13 @@ #include "fsc.h" /** Lee el registro \param id_reg y lo almacena en \param ptr */ -int emufs_tipo3_leer_registro(EMUFS *emu, EMUFS_REG_ID id_reg, void *ptr); +void* emufs_tipo3_leer_registro(EMUFS*, EMUFS_REG_ID, int*); /** Lee el bloque \param num_bloque y lo almacena en \param ptr */ -int emufs_tipo3_leer_bloque(EMUFS *emu, EMUFS_BLOCK_ID num_bloque, void *ptr); +void* emufs_tipo3_leer_bloque(EMUFS*, EMUFS_BLOCK_ID, int*); /** Graba el registro apuntado por \param ptr en el archivo */ -EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr); +EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE); /** Graba el bloque apuntado por \param ptr en el archivo */ int emufs_tipo3_grabar_bloque(EMUFS *emu, void *ptr, EMUFS_BLOCK_ID num_bloque); diff --git a/emufs/tipo3_main.c b/emufs/tipo3_main.c index 2fc5dcf..4dcdf42 100644 --- a/emufs/tipo3_main.c +++ b/emufs/tipo3_main.c @@ -50,6 +50,8 @@ int main(int argc, char *argv[]) char g[100]; char h[100]; char i[100]; + char* b_ptr; + int err; if (argc != 2) { printf("Modo de uso : %s tam_bloque\n", argv[0]); @@ -93,10 +95,12 @@ int main(int argc, char *argv[]) fp->borrar_registro(fp, n2, 100); fp->borrar_registro(fp, n6, 100);*/ fp->borrar_registro(fp, n1); - printf("borre el registro de id = %d\n",n1); - fp->leer_registro(fp, n2, b, 100); + printf("borre el registro de id = %lu\n",n1); + b_ptr = fp->leer_registro(fp, n2, &err); - printf("Recuperado : %s\n", b); + printf("Recuperado : %s\n", b_ptr); + + free(b_ptr); ver_archivo_FS(fp); -- 2.43.0