X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/3399f7642a12387eb7704b550e52bb1fce93e8a9..d4f0853a534fc4283fa38cf4bb4a70cc614283ec:/emufs/tipo1.c diff --git a/emufs/tipo1.c b/emufs/tipo1.c index 18d3cb9..f3fe8ee 100644 --- a/emufs/tipo1.c +++ b/emufs/tipo1.c @@ -39,11 +39,13 @@ #include "idx.h" #include "fsc.h" #include "did.h" +#include "error.h" +#include +#include #include #include #include #include -#include #ifndef MIN # define MIN(x, y) (((x) > (y)) ? (y) : (x)) @@ -63,9 +65,6 @@ static int emufs_tipo1_header_jump(FILE*); static int emufs_tipo1_block_jump(EMUFS*, FILE*, EMUFS_BLOCK_ID); -static void emufs_tipo1_escribir_reg_en_memoria(char*, EMUFS_TIPO1_REG_HEADER, - char*); - static void emufs_tipo1_escribir_reg_chunk_en_memoria(char* dst, EMUFS_TIPO1_REG_HEADER header, char* reg, EMUFS_REG_SIZE reg_size); @@ -88,10 +87,11 @@ int emufs_tipo1_inicializar(EMUFS* efs) * mala */ if (efs->tam_bloque < (sizeof(EMUFS_TIPO1_REG_HEADER) * 2)) { PERR("bloque demasiado chico"); - return 1000; /* EMUFS_ERROR_BLOCK_SIZE_TOO_SMALL */ + return EMUFS_ERROR_BLOCK_TOO_SMALL; } /* Asigna punteros a funciones. */ efs->leer_bloque = emufs_tipo1_leer_bloque; + efs->leer_bloque_raw = emufs_tipo1_leer_bloque_raw; efs->grabar_registro = emufs_tipo1_grabar_registro; efs->borrar_registro = emufs_tipo1_borrar_registro; efs->leer_registro = emufs_tipo1_leer_registro; @@ -120,7 +120,7 @@ void* emufs_tipo1_leer_registro(EMUFS* efs, EMUFS_REG_ID reg_id, if (!(block = (char*) emufs_tipo1_leer_bloque(efs, block_id, err))) { /* TODO Manejo de errores */ PERR("no se pudo reservar memoria"); - *err = 2; /* EMUFS_ERROR_OUT_OF_MEMORY */ + *err = EMUFS_ERROR_OUT_OF_MEMORY; return NULL; } @@ -145,7 +145,7 @@ void* emufs_tipo1_leer_registro(EMUFS* efs, EMUFS_REG_ID reg_id, /* TODO Manejo de errores */ free(block); PERR("No hay memoria"); - *err = 2; /* EMUFS_ERROR_OUT_OF_MEMORY */ + *err = EMUFS_ERROR_OUT_OF_MEMORY; return NULL; } while (1) { @@ -162,7 +162,7 @@ void* emufs_tipo1_leer_registro(EMUFS* efs, EMUFS_REG_ID reg_id, /* TODO Manejo de errores */ free(registro); PERR("no se pudo reservar memoria"); - *err = 2; /* EMUFS_ERROR_OUT_OF_MEMORY */ + *err = EMUFS_ERROR_OUT_OF_MEMORY; return NULL; } } else { /* se terminó de leer */ @@ -256,7 +256,7 @@ void* emufs_tipo1_leer_registro_raw(EMUFS *efs, EMUFS_REG_ID id, EMUFS_REG_SIZE return registro; } -void* emufs_tipo1_leer_bloque(EMUFS* efs, EMUFS_BLOCK_ID block_id, int *err) +void* emufs_tipo1_leer_bloque(EMUFS* efs, EMUFS_BLOCK_ID block_id, int* err) { FILE* file; char* block; /* bloque leido (en donde está el registro a leer) */ @@ -267,24 +267,21 @@ void* emufs_tipo1_leer_bloque(EMUFS* efs, EMUFS_BLOCK_ID block_id, int *err) if ((file = fopen(name_f, "r")) == NULL) { PERR("No se puede abrir archivo"); - *err = 4; /* EMUFS_ERROR_CANT_OPEN_FILE */ - return NULL; /* FIXME ERROR */ + *err = EMUFS_ERROR_CANT_OPEN_FILE; + return NULL; } emufs_tipo1_header_jump(file); /* salta cabeceras */ emufs_tipo1_block_jump(efs, file, block_id); /* salta bloques */ - /* FIXME: verificar que no se pase de fin de archivo*/ block = (char*) malloc(efs->tam_bloque); if (block == NULL) { - /* TODO Manejo de errores */ PERR("No hay memoria"); - *err = 2; /* EMUFS_ERROR_OUT_OF_MEMORY */ + *err = EMUFS_ERROR_OUT_OF_MEMORY; return NULL; } if (fread(block, efs->tam_bloque, 1, file) != 1) { - /* TODO Manejo de errores */ free(block); PERR("Error al leer bloque"); - *err = 3; /* EMUFS_ERROR_FILE_READ */ + *err = EMUFS_ERROR_FILE_READ; return NULL; } fclose(file); @@ -328,7 +325,7 @@ EMUFS_REG_ID emufs_tipo1_grabar_registro(EMUFS* efs, void* reg, if (block == NULL) { /* TODO Manejo de errores */ PERR("No hay memoria"); - *err = 2; /* EMUFS_ERROR_OUT_OF_MEMORY */ + *err = EMUFS_ERROR_OUT_OF_MEMORY; return EMUFS_NOT_FOUND; } memset(block, 0, efs->tam_bloque); /* inicializa bloque */ @@ -616,7 +613,7 @@ EMUFS_BLOCK_ID emufs_tipo1_grabar_bloque_fsc(EMUFS *efs, void *block, if ((file = fopen(name_f, "r+b")) == NULL) { /* TODO Manejo de errores */ PERR("Error al abrir archivo"); - *err = 4; /* EMUFS_ERROR_CANT_OPEN_FILE */ + *err = EMUFS_ERROR_CANT_OPEN_FILE; return EMUFS_NOT_FOUND; } /* Si es NOT_FOUND o mayor a la cantidad de bloques presentes, @@ -627,7 +624,7 @@ EMUFS_BLOCK_ID emufs_tipo1_grabar_bloque_fsc(EMUFS *efs, void *block, /* TODO Manejo de errores */ PERR("No se pudo hacer fseek()"); fclose(file); - *err = 8; /* EMUFS_ERROR_SEEK_FILE */ + *err = EMUFS_ERROR_SEEK_FILE; return EMUFS_NOT_FOUND; } /* Obtengo ID del bloque nuevo */ @@ -657,7 +654,7 @@ EMUFS_BLOCK_ID emufs_tipo1_grabar_bloque_fsc(EMUFS *efs, void *block, } /* si me lo solicitan, actualizo el .fsc */ if (fs != EMUFS_NOT_FOUND) { - if ((err = emufs_fsc_actualizar(efs, block_id, fs))) { + if ((*err = emufs_fsc_actualizar(efs, block_id, fs))) { /* TODO Manejo de errores */ PERR("no se pudo actualizar .fsc"); fclose(file); @@ -669,7 +666,7 @@ EMUFS_BLOCK_ID emufs_tipo1_grabar_bloque_fsc(EMUFS *efs, void *block, if (fwrite(block, efs->tam_bloque, 1, file) != 1) { PERR("No se pudo escribir el archivo"); fclose(file); - *err = 6; /* EMUFS_ERROR_WRITE_FILE */ + *err = EMUFS_ERROR_WRITE_FILE; return EMUFS_NOT_FOUND; } @@ -677,11 +674,11 @@ EMUFS_BLOCK_ID emufs_tipo1_grabar_bloque_fsc(EMUFS *efs, void *block, return block_id; } -EMUFS_REG_ID emufs_tipo1_modificar_registro(EMUFS *emu, EMUFS_REG_ID id, - void *data, EMUFS_REG_SIZE size, int *error) +EMUFS_REG_ID emufs_tipo1_modificar_registro(EMUFS* efs, EMUFS_REG_ID id, + void *data, EMUFS_REG_SIZE size, int* err) { - emufs_tipo1_borrar_registro(emu, id); - return emufs_tipo1_grabar_registro(emu, data, size, error); + emufs_tipo1_borrar_registro(efs, id); + return emufs_tipo1_grabar_registro(efs, data, size, err); } size_t emufs_tipo1_header_size(void) @@ -693,24 +690,18 @@ int emufs_tipo1_header_jump(FILE* fp) { if (fseek(fp, emufs_tipo1_header_size(), SEEK_CUR)) { PERR("No se pudo hacer fseek()"); - return 8; /* EMUFS_ERROR_SEEK_FILE */ + return EMUFS_ERROR_SEEK_FILE; } - return 0; /* EMUFS_OK */ + return EMUFS_OK; } int emufs_tipo1_block_jump(EMUFS* efs, FILE* fp, EMUFS_BLOCK_ID block_count) { if (fseek(fp, block_count * efs->tam_bloque, SEEK_CUR)) { PERR("No se pudo hacer fseek()"); - return 8; /* EMUFS_ERROR_SEEK_FILE */ + return EMUFS_ERROR_SEEK_FILE; } - return 0; /* EMUFS_OK */ -} - -void emufs_tipo1_escribir_reg_en_memoria(char* dst, EMUFS_TIPO1_REG_HEADER header, - char* reg) -{ - emufs_tipo1_escribir_reg_chunk_en_memoria(dst, header, reg, header.size); + return EMUFS_OK; } void emufs_tipo1_escribir_reg_chunk_en_memoria(char* dst, @@ -733,9 +724,8 @@ long emufs_tipo1_get_file_size(EMUFS* efs, int* err) strcpy(name_f, efs->nombre); strcat(name_f, ".dat"); if ((file = fopen(name_f, "ab")) == NULL) { - /* TODO Manejo de errores */ PERR("Error al abrir archivo"); - *err = 4; /* EMUFS_ERROR_CANT_OPEN_FILE */ + *err = EMUFS_ERROR_CANT_OPEN_FILE; return 0; } file_size = ftell(file); @@ -743,3 +733,12 @@ long emufs_tipo1_get_file_size(EMUFS* efs, int* err) return file_size; } +void emufs_tipo1_leer_bloque_raw(EMUFS *efs, EMUFS_BLOCK_ID id, char **actual, char **anterior, char **siguiente, EMUFS_BLOCK_SIZE *size1, EMUFS_BLOCK_SIZE *size2, EMUFS_BLOCK_SIZE *size3) +{ + int err = 0; + (*actual) = emufs_tipo1_leer_bloque(efs, id, &err); + (*anterior) = emufs_tipo1_leer_bloque(efs, id-1, &err); + (*siguiente) = emufs_tipo1_leer_bloque(efs, id+1, &err); + (*size1) = (*size2) = (*size3) = efs->tam_bloque; +} +