From e7e2badf7ebc4b6aeaf03366ad6fe6b919713d54 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Nicol=C3=A1s=20Dimov?= Date: Thu, 8 Apr 2004 20:58:08 +0000 Subject: [PATCH] Comienzo a separar las cosas un poco, pero no compila porque hay una referencia a una funcion que se pierde en el camino y no encuentro el error, mirenlonsvn add did.c did.h idx.c idx.h --- emufs/did.c | 33 +++++++++++++++++++ emufs/did.h | 8 +++++ emufs/emufs.c | 16 ++++----- emufs/idx.c | 25 ++++++++++++++ emufs/idx.h | 7 ++++ emufs/tipo3.c | 90 ++++++++++++++++----------------------------------- emufs/tipo3.h | 24 ++++++++------ 7 files changed, 122 insertions(+), 81 deletions(-) create mode 100644 emufs/did.c create mode 100644 emufs/did.h create mode 100644 emufs/idx.c create mode 100644 emufs/idx.h diff --git a/emufs/did.c b/emufs/did.c new file mode 100644 index 0000000..0e3b79f --- /dev/null +++ b/emufs/did.c @@ -0,0 +1,33 @@ +#include "did.h" + +int emufs_did_get_last(EMUFS *emu) +{ + FILE * f_did; + int id, offset; + char name_f_did[255]; + + strcpy(name_f_did, emu->nombre); + strcat(name_f_did, ".did"); + + if ( (f_did = fopen(name_f_did,"r")) == NULL) return -1; /*ERROR*/ + fseek(f_did, 0, SEEK_END); + + if (ftell(f_did) > 0){ + /* si el archivo no esta vacio es porque hay un nro disponible*/ + fseek(f_did, -sizeof(int),SEEK_END); + /* leo el ultimo numero */ + fread(&id,sizeof(int),1,f_did); + /* voy al final */ + fseek(f_did, 0, SEEK_END); + /* mido el tamaño del archivo*/ + offset = ftell(f_did); + fclose(f_did); + /*lo trunco */ + truncate(name_f_did, offset - sizeof(int)); + } else { + fclose(f_did); + /* si el archivo esta vacio */ + id = -1; + } + return id; +} diff --git a/emufs/did.h b/emufs/did.h new file mode 100644 index 0000000..45d867f --- /dev/null +++ b/emufs/did.h @@ -0,0 +1,8 @@ +#ifndef _DID_H_ +#define _DID_H_ +#include "emufs.h" + +int emufs_did_get_last(EMUFS *); + + +#endif /* _DID_H */ diff --git a/emufs/emufs.c b/emufs/emufs.c index 28fc248..b62702b 100644 --- a/emufs/emufs.c +++ b/emufs/emufs.c @@ -73,10 +73,10 @@ EMUFS *emufs_crear(const char *filename, char tipo, unsigned int tam_bloque, uns case T3: tmp->tipo = T3; tmp->tam_bloque = tam_bloque; - tmp->leer_bloque = leer_bloque; - tmp->leer_registro = leer_registro; - tmp->grabar_registro = grabar_registro; - tmp->borrar_registro = borrar_registro; + tmp->leer_bloque = emufs_tipo3_leer_bloque; + tmp->leer_registro = emufs_tipo3_leer_registro; + tmp->grabar_registro = emufs_tipo3_grabar_registro; + tmp->borrar_registro = emufs_tipo3_borrar_registro; tmp->nombre = str_dup(filename); strcpy(name, filename); @@ -151,10 +151,10 @@ EMUFS *emufs_abrir(const char *filename) case T3: tmp->tipo = tipo; fread(&tmp->tam_bloque, sizeof(int), 1, fp); - tmp->leer_bloque = leer_bloque; - tmp->leer_registro = leer_registro; - tmp->grabar_registro = grabar_registro; - tmp->borrar_registro = borrar_registro; + tmp->leer_bloque = emufs_tipo3_leer_bloque; + tmp->leer_registro = emufs_tipo3_leer_registro; + tmp->grabar_registro = emufs_tipo3_grabar_registro; + tmp->borrar_registro = emufs_tipo3_borrar_registro; tmp->nombre = str_dup(filename); } diff --git a/emufs/idx.c b/emufs/idx.c new file mode 100644 index 0000000..52f3b59 --- /dev/null +++ b/emufs/idx.c @@ -0,0 +1,25 @@ +#include "idx.h" +#include "tipo3.h" + +int emufs_idx_buscar_mayor_id(EMUFS *emu) +{ + int id, max = -1; + FILE *f_idx; + BLOCK_REG_T reg; + char name_f_idx[255]; + + strcpy(name_f_idx,emu->nombre); + strcat(name_f_idx,".idx"); + + if ( (f_idx = fopen(name_f_idx,"r")) == NULL) return -1; /*ERROR*/ + while ( !feof(f_idx) ){ + /* Me aseguro de leer la cantidad de bytes correcta */ + if (fread(®,sizeof(BLOCK_REG_T),1,f_idx) != 1) continue; + if ( reg.id_reg >= max ) + max = reg.id_reg; + } + id = max+1; + fclose(f_idx); + + return id; +} diff --git a/emufs/idx.h b/emufs/idx.h new file mode 100644 index 0000000..28aadc4 --- /dev/null +++ b/emufs/idx.h @@ -0,0 +1,7 @@ +#ifndef _IDX_H +#define _IDX_H +#include "emufs.h" + +int emufs_idx_buscar_mayor_id(EMUFS *); + +#endif /* _IDX_H */ diff --git a/emufs/tipo3.c b/emufs/tipo3.c index ace5cbd..398b2b8 100644 --- a/emufs/tipo3.c +++ b/emufs/tipo3.c @@ -38,7 +38,7 @@ #include "tipo3.h" /** Leo un registro del archivo, devuelve cero si no lo encuentra.**/ -int leer_registro(EMUFS *emu, int ID, void *ptr, unsigned long tam_reg) +int emufs_tipo3_leer_registro(EMUFS *emu, int ID, void *ptr, unsigned long tam_reg) { FILE* f_block_reg; char* bloque; @@ -54,14 +54,14 @@ int leer_registro(EMUFS *emu, int ID, void *ptr, unsigned long tam_reg) /*si existe, lo busco en el archivo de bloques*/ - block = buscar_registro(emu,ID); /*me devuelve el nro de bloque al que pertenece el registro*/ + block = emufs_tipo3_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 (leer_bloque(emu, block, bloque)==-1) { + if (emufs_tipo3_leer_bloque(emu, block, bloque)==-1) { free(bloque); printf("no se pudo leer el bloque\n"); return -1; /*No se pudo leer el bloque*/ @@ -86,7 +86,7 @@ int leer_registro(EMUFS *emu, int ID, void *ptr, unsigned long tam_reg) /*busco el ID en el archivo xxxxx.did, para ver si puedo usar ese ID.*/ -int existe_registro(EMUFS *emu, int ID) +int emufs_tipo3_existe_registro(EMUFS *emu, int ID) { FILE* f_reg_exist; int reg; @@ -108,7 +108,7 @@ int existe_registro(EMUFS *emu, int ID) /*busca el registro ID en el archivo "block_reg.dat" y devuelve el nro de bloque en el que se encuentra*/ -int buscar_registro(EMUFS *emu, int ID) +int emufs_tipo3_buscar_registro(EMUFS *emu, int ID) { FILE* f_block_reg; BLOCK_REG_T reg; @@ -131,7 +131,7 @@ int buscar_registro(EMUFS *emu, int ID) /*leo el bloque "ID" del archivo que viene en "emu->nombre", y lo almaceno en "ptr"*/ -int leer_bloque(EMUFS *emu, int ID, void* ptr) +int emufs_tipo3_leer_bloque(EMUFS *emu, int ID, void* ptr) { FILE* file; char name_f[255]; @@ -149,7 +149,7 @@ int leer_bloque(EMUFS *emu, int ID, void* ptr) return 0; } -int grabar_registro(EMUFS *emu, void *ptr, unsigned long tam) +int emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, unsigned long tam) { int ID_aux, fs, num_bloque, cant; FILE *file; @@ -172,7 +172,7 @@ int grabar_registro(EMUFS *emu, void *ptr, unsigned long tam) if ( (file = fopen(name_f,"a+"))==NULL ) return -1; /*ERROR*/ /* me devuelve el ID del bloque donde quepa un registro y el espacio libre en "fs"*/ - num_bloque = buscar_lugar(emu, tam, &fs); + num_bloque = emufs_tipo3_buscar_lugar(emu, tam, &fs); printf("Lugar = %d bloque = %d\n", fs, num_bloque); /*si no hay bloques con suficiente espacio creo un bloque nuevo */ if (num_bloque == -1) { @@ -180,13 +180,13 @@ int grabar_registro(EMUFS *emu, void *ptr, unsigned long tam) bloque = (char*)malloc(emu->tam_bloque); /* grabar el registro al principio del bloque */ /*tengo que buscar un ID valido para el nuevo registro*/ - ID_aux = get_id(emu); + ID_aux = emufs_tipo3_get_id(emu); /*grabo el id en el bloque*/ memcpy(bloque,&ID_aux,sizeof(int)); /*grabo el registro en el bloque*/ memcpy(bloque+sizeof(int),ptr,tam); /* me paro al final del archivo */ - fseek(file, 0, SEEK_END); + fseek(file, 0, SEEK_END); /* grabo el bloque en el final del archivo */ fwrite(bloque,emu->tam_bloque,1,file); /*actualizo el archivo de espacios libres*/ @@ -211,21 +211,20 @@ int grabar_registro(EMUFS *emu, void *ptr, unsigned long tam) } else { /*cargo el bloque en "bloque"*/ bloque = (char*)malloc(emu->tam_bloque); - if ( leer_bloque(emu,num_bloque,bloque)== -1) { + if ( emufs_tipo3_leer_bloque(emu,num_bloque,bloque)== -1) { printf("Error: no se pudo leer 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*/ /*tengo que buscar un ID valido para el nuevo registro*/ - ID_aux = get_id(emu); - printf("id = %d\n",ID_aux); + ID_aux = emufs_tipo3_get_id(emu); /*grabo el id en el bloque*/ memcpy(bloque+emu->tam_bloque-fs,&ID_aux,sizeof(int)); /*grabo el registro en el bloque*/ memcpy(bloque+emu->tam_bloque-fs+sizeof(int),ptr,tam); /*guardo el bloque en el archivo*/ - if ( grabar_bloque(emu, bloque, num_bloque) != 0) { + if ( emufs_tipo3_grabar_bloque(emu, bloque, num_bloque) != 0) { printf("error al grabar bloque\n"); return -1; /* se produjo un error */ } @@ -261,10 +260,18 @@ int grabar_registro(EMUFS *emu, void *ptr, unsigned long tam) return ID_aux; } +/*Busco en el archivo de Id`s un Id valido para un nuevo registro*/ +int emufs_tipo3_get_id(EMUFS *emu) +{ + int id; + if ( (id = emufs_did_get_last(emu)) == -1 ) + id = emufs_idx_buscar_mayor_id(emu); + return id; +} /*Graba un bloque en el archivo*/ -int grabar_bloque(EMUFS *emu, void *ptr, int num) +int emufs_tipo3_grabar_bloque(EMUFS *emu, void *ptr, int num) { FILE* file; char name_f[255]; @@ -284,7 +291,7 @@ int grabar_bloque(EMUFS *emu, void *ptr, int num) /* me devuelve el ID del bloque donde quepa un registro, y guarda en fs el espacio libre que queda en el bloque */ -int buscar_lugar(EMUFS *emu, unsigned long tam, int *fs) +int emufs_tipo3_buscar_lugar(EMUFS *emu, unsigned long tam, int *fs) { FILE *f_block_free; BLOCK_FREE_T reg; @@ -316,51 +323,8 @@ int buscar_lugar(EMUFS *emu, unsigned long tam, int *fs) return reg.block; } -/*Busco en el archivo de Id`s un Id valido para un nuevo registro*/ -int get_id(EMUFS *emu) -{ - FILE *f_reg_exist, *f_block_reg; - BLOCK_REG_T reg; - int id, max = -1, offset; - char name_f_reg_exist[255]; - char name_f_block_reg[255]; - - strcpy(name_f_block_reg,emu->nombre); - strcat(name_f_block_reg,".idx"); - - strcpy(name_f_reg_exist,emu->nombre); - strcat(name_f_reg_exist,".did"); - - if ( (f_reg_exist = fopen(name_f_reg_exist,"r")) == NULL) return -1; /*ERROR*/ - fseek(f_reg_exist, 0, SEEK_END); - - if (ftell(f_reg_exist) > 0){ - /* si el archivo no esta vacio es porque hay un nro disponible*/ - fseek(f_reg_exist, -sizeof(int),SEEK_END); - fread(&id,sizeof(int),1,f_reg_exist); - fseek(f_reg_exist, 0, SEEK_END); - offset = ftell(f_reg_exist); - fclose(f_reg_exist); - truncate(name_f_reg_exist, offset - sizeof(int)); - }else{ - fclose(f_reg_exist); - /*si no, hay que buscar el mayor de los numeros*/ - id = -1; - if ( (f_block_reg = fopen(name_f_block_reg,"r")) == NULL) return -1; /*ERROR*/ - while ( !feof(f_block_reg) ){ - /* Me aseguro de leer la cantidad de bytes correcta */ - if (fread(®,sizeof(BLOCK_REG_T),1,f_block_reg) != 1) continue; - if ( reg.id_reg >= max ) - max = reg.id_reg; - } - id = max+1; - fclose(f_block_reg); - } - return id; -} - /*borra un registro de un bloque y acomoda los registros que quedan*/ -int borrar_registro(EMUFS *emu, int ID, int tam_reg) +int emufs_tipo3_borrar_registro(EMUFS *emu, int ID, int tam_reg) { int num_bloque, ptr_elim, ptr_mov, ID_aux, cant, i; long size; @@ -382,9 +346,9 @@ int borrar_registro(EMUFS *emu, int ID, int tam_reg) strcpy(name_f_block_free,emu->nombre); strcat(name_f_block_free,".fsc"); - num_bloque = buscar_registro(emu, ID); + num_bloque = emufs_tipo3_buscar_registro(emu, ID); bloque = (char*)malloc(emu->tam_bloque); - if ( leer_bloque(emu,num_bloque, bloque) == -1 ){ + if ( emufs_tipo3_leer_bloque(emu,num_bloque, bloque) == -1 ){ printf("No se encontro el bloque\n"); return -1; } @@ -408,7 +372,7 @@ int borrar_registro(EMUFS *emu, int ID, int tam_reg) } /*grabo el bloque en el archivo*/ - if ( grabar_bloque(emu, bloque, num_bloque) == -1 ){ + if ( emufs_tipo3_grabar_bloque(emu, bloque, num_bloque) == -1 ){ printf("No se pudo grabar el bloque\n"); return -1; } diff --git a/emufs/tipo3.h b/emufs/tipo3.h index 7c5bfe7..4d05c87 100644 --- a/emufs/tipo3.h +++ b/emufs/tipo3.h @@ -38,11 +38,14 @@ #ifndef _PARAM_CTE_H_ #define _PARAM_CTE_H_ -#include "emufs.h" #include #include #include #include +#include "emufs.h" +#include "did.h" +#include "idx.h" + typedef struct block_free_t { int block; @@ -54,22 +57,23 @@ typedef struct block_reg_t { long int id_reg; } BLOCK_REG_T; -int leer_registro(EMUFS *, int , void *, unsigned long); +int emufs_tipo3_leer_registro(EMUFS *, int , void *, unsigned long); + +int emufs_tipo3_leer_bloque(EMUFS *, int , void *); -int leer_bloque(EMUFS *, int , void *); +int emufs_tipo3_grabar_registro(EMUFS *, void *, unsigned long ); -int grabar_registro(EMUFS *, void *, unsigned long ); +int emufs_tipo3_grabar_bloque(EMUFS *, void *, int); -int existe_registro(EMUFS *, int); +int emufs_tipo3_get_id(EMUFS *); -int buscar_registro(EMUFS *, int); +int emufs_tipo3_existe_registro(EMUFS *, int); -int buscar_lugar(EMUFS *, unsigned long , int *); +int emufs_tipo3_buscar_registro(EMUFS *, int); -int get_id(EMUFS *); +int emufs_tipo3_buscar_lugar(EMUFS *, unsigned long , int *); -int grabar_bloque(EMUFS *, void *, int); +int emufs_tipo3_borrar_registro(EMUFS*, int, int); -int borrar_registro(EMUFS*, int, int); #endif /* _PARAM_CTE_H_ */ -- 2.43.0