From 6effd0769b012b1ac78cfeda307cec54802f9b58 Mon Sep 17 00:00:00 2001 From: Alan Kennedy Date: Thu, 15 Apr 2004 05:37:43 +0000 Subject: [PATCH] emufs.h comente los campos de stats en doxy, fsc.h/c agregue la funcion para obtener la media de FSC (Nico usa esa y saca lo tuyo interno) y tambien la descomente/probe la funcion get_max_min_fsc que hizo nico. Me faltan de stats solo cantidad de registros y bytes de info de control (sale con la cant de registros). Pendiente porque cambia el API de IDX y al pedo hacerlo con lo de ahora. --- emufs/emufs.h | 17 +++++++++-------- emufs/fsc.c | 30 ++++++++++++++++++++++++++---- emufs/fsc.h | 6 +++--- emufs/tipo2.c | 40 +++++++++++++++++++++++++++++++++++++++- emufs/tipo2.h | 7 +++++++ emufs/tipo2_main.c | 16 ++++++++++------ 6 files changed, 94 insertions(+), 22 deletions(-) diff --git a/emufs/emufs.h b/emufs/emufs.h index 6ba63b3..9d8b17c 100644 --- a/emufs/emufs.h +++ b/emufs/emufs.h @@ -42,6 +42,7 @@ #include #include +#include #ifdef DEBUG /** Imprime un mensaje de debug por pantalla. */ @@ -83,14 +84,14 @@ typedef unsigned long EMUFS_OFFSET; /** Estadisticas de archivo */ typedef struct _emufs_est_t { - unsigned long tam_archivo; - unsigned long tam_archivo_bytes; - unsigned long info_control; - EMUFS_FREE media_fs; - EMUFS_FREE total_fs; - EMUFS_FREE max_fs; - EMUFS_FREE min_fs; - int cant_bloques; + unsigned long tam_archivo; /**< Cantidad de Registros en el archivo */ + unsigned long tam_archivo_bytes;/**< Size del archivo en bytes */ + unsigned long info_control;/**< Cantidad de bytes en info de control */ + unsigned long media_fs;/**< Media del espacio libre en el archivo de datos */ + unsigned long total_fs;/**< Cantidad total de espacio libre en el archivo de datos */ + unsigned long max_fs;/**< Cantidad de maxima libre (gap o fs en bloque) en el archivo de datos */ + unsigned long min_fs;/**< Cantidad de minima libre (gap o fs en bloque) en el archivo de datos */ + unsigned long cant_bloques; /**< Cantidad de bloques en el archivo de datos */ } EMUFS_Estadisticas; /** Tipo Abstracto para menajo de archivos. diff --git a/emufs/fsc.c b/emufs/fsc.c index 17a7244..a3aad0e 100644 --- a/emufs/fsc.c +++ b/emufs/fsc.c @@ -342,8 +342,8 @@ EMUFS_FREE emufs_fsc_get_total_fs(EMUFS *emu) fclose(f_fsc); return total; } -/* -EMUFS_FREE emufs_fsc_get_max_min_fs(EMUFS *emu, int *min, int *max) + +int emufs_fsc_get_max_min_fs(EMUFS *emu, EMUFS_FREE *min, EMUFS_FREE *max) { FILE *f_fsc; EMUFS_FSC reg; @@ -352,7 +352,7 @@ EMUFS_FREE emufs_fsc_get_max_min_fs(EMUFS *emu, int *min, int *max) strcpy(name_f_fsc,emu->nombre); strcat(name_f_fsc, EMUFS_FSC_EXT); - *min = emu->tam_bloque; + *min = ULONG_MAX; *max = 0; if ( (f_fsc = fopen(name_f_fsc,"r"))==NULL ) return -1; @@ -367,4 +367,26 @@ EMUFS_FREE emufs_fsc_get_max_min_fs(EMUFS *emu, int *min, int *max) fclose(f_fsc); return 0; } -*/ + +EMUFS_FREE emufs_fsc_get_media_fs(EMUFS *emu) +{ + FILE *f_fsc; + EMUFS_FSC reg; + char name_f_fsc[255]; + EMUFS_FREE total_fs = 0; + EMUFS_REG_ID gap_count = 0; + + strcpy(name_f_fsc,emu->nombre); + strcat(name_f_fsc, EMUFS_FSC_EXT); + + if ( (f_fsc = fopen(name_f_fsc,"r"))==NULL ) return -1; + + while ( !feof(f_fsc) ){ + fread(®, sizeof(EMUFS_FSC), 1, f_fsc); + total_fs += reg.freespace; + ++gap_count; + } + + fclose(f_fsc); + return total_fs/gap_count; +} diff --git a/emufs/fsc.h b/emufs/fsc.h index e331b18..27ee1cc 100644 --- a/emufs/fsc.h +++ b/emufs/fsc.h @@ -45,7 +45,7 @@ typedef struct emufs_fsc_t { unsigned long int marker; unsigned long int freespace; -}EMUFS_FSC; +} EMUFS_FSC; int emufs_fsc_crear(EMUFS*); int emufs_fsc_agregar(EMUFS *, EMUFS_BLOCK_ID, EMUFS_FREE); @@ -55,8 +55,8 @@ int emufs_fsc_actualizar_gap(EMUFS *, EMUFS_OFFSET, EMUFS_FREE); int emufs_fsc_actualizar(EMUFS *, EMUFS_BLOCK_ID, EMUFS_FREE); EMUFS_BLOCK_ID emufs_fsc_buscar_lugar(EMUFS *, EMUFS_FREE, EMUFS_FREE *); EMUFS_FREE emufs_fsc_get_fs(EMUFS *, EMUFS_BLOCK_ID); -/*Devuelve el total de espacio libre que queda en el .dat*/ EMUFS_FREE emufs_fsc_get_total_fs(EMUFS *); -/*EMUFS_FREE emufs_fsc_get_max_min_fs(EMUFS *, int *, int *);*/ +EMUFS_FREE emufs_fsc_get_media_fs(EMUFS *); +int emufs_fsc_get_max_min_fs(EMUFS *, EMUFS_FREE *, EMUFS_FREE *); #endif /* _EMUFS_FSC_H */ diff --git a/emufs/tipo2.c b/emufs/tipo2.c index 7047e45..e640cf6 100644 --- a/emufs/tipo2.c +++ b/emufs/tipo2.c @@ -46,9 +46,10 @@ int emufs_tipo2_inicializar(EMUFS* efs) { efs->grabar_registro = emufs_tipo2_grabar_registro; - efs->borrar_registro = emufs_tipo2_borrar_registro; + efs->borrar_registro = emufs_tipo2_borrar_registro; efs->leer_registro = emufs_tipo2_leer_registro; efs->modificar_registro = emufs_tipo2_modificar_registro; + efs->leer_estadisticas = emufs_tipo2_leer_estadisticas; return 0; } @@ -230,8 +231,45 @@ int emufs_tipo2_dummyfill(EMUFS *efs, EMUFS_OFFSET reg_pos, EMUFS_REG_SIZE amoun return (0); } +/* Realiza la actualizacin de un registro ya existente */ EMUFS_REG_ID emufs_tipo2_modificar_registro(EMUFS *emu, EMUFS_REG_ID id, void *data, EMUFS_REG_SIZE size, int *error) { emufs_tipo2_borrar_registro(emu, id); return emufs_tipo2_grabar_registro(emu, data, size, error); } + +/* Recompila y devuelve ciertas estadisticas del archivo indicado */ +EMUFS_Estadisticas emufs_tipo2_leer_estadisticas(EMUFS *emu) +{ + EMUFS_Estadisticas stats; + char name_f[255]; + FILE *file; + + strcpy(name_f,emu->nombre); + strcat(name_f,".dat"); + + /* Inicializo las stats por si hay error somewhere */ + stats.tam_archivo = 0; + stats.tam_archivo_bytes = 0; + stats.info_control = 0; + stats.media_fs = 0; + stats.total_fs = 0; + stats.max_fs = 0; + stats.min_fs = 0; + stats.cant_bloques = 0; + + /* Obtengo las stats de FSC */ + stats.total_fs = emufs_fsc_get_total_fs(emu); + stats.media_fs = emufs_fsc_get_media_fs(emu); + emufs_fsc_get_max_min_fs(emu,&stats.min_fs,&stats.max_fs); + + /* Faltan stats pero como cambia el API Idx, espero... */ + if ( (file = fopen(name_f,"ab")) == NULL){ + PERR("No se pudo abrir el archivo"); + return stats; + } + stats.tam_archivo_bytes = ftell(file); + fclose(file); + + return(stats); +} diff --git a/emufs/tipo2.h b/emufs/tipo2.h index f8885ec..8e1857a 100644 --- a/emufs/tipo2.h +++ b/emufs/tipo2.h @@ -119,4 +119,11 @@ int emufs_tipo2_dummyfill(EMUFS *efs, EMUFS_OFFSET reg_pos, EMUFS_REG_SIZE amoun /** Método para modificar un registro */ EMUFS_REG_ID emufs_tipo2_modificar_registro(EMUFS *emu, EMUFS_REG_ID id, void *data, EMUFS_REG_SIZE size, int *error); +/** Método para recolectar/obtener la estadisticas del archivo tipo 2 + * + * \param efs Estructura que realiza el handling de archivos de cualquier tipo. + * \return \b EMUFS_Estadisticas Estructura que alberga las stats recolectadas. + */ +EMUFS_Estadisticas emufs_tipo2_leer_estadisticas(EMUFS *emu); + #endif /* _EMUFS_TIPO2_H_ */ diff --git a/emufs/tipo2_main.c b/emufs/tipo2_main.c index 9778593..77c22b0 100644 --- a/emufs/tipo2_main.c +++ b/emufs/tipo2_main.c @@ -49,7 +49,7 @@ int main(int argc, char *argv[]) char h[63]; char i[43]; int err = 0; - EMUFS_FREE totalfsc = 0; + EMUFS_Estadisticas stats; strcpy(a, "1234567890"); strcpy(b, "REGISTRO NUMERO 2. ESTE REGISTRO ES MUCHO MAS LARGO QUE EL UNO"); @@ -91,16 +91,20 @@ int main(int argc, char *argv[]) n8 = efs->grabar_registro(efs, d, 8, &err); printf("tipo2_main.c >> Id recuperado: %lu\n",n8); - - totalfsc = emufs_fsc_get_total_fs(efs); - printf("tipo2_main.c >> Total de espacio libre en el .dat: %lu\n",totalfsc); - + + /* Levanto un registro */ registro = efs->leer_registro(efs,n2,®_size,&err); if (err == 0) { printf("tipo2_main.c >>Registro: %lu Size: %lu Content: %s\n\n",n2,reg_size,registro); - printf("Total de espacio libre en el .dat: %lu\n",totalfsc); } + /* Obtengo stats */ + stats = efs->leer_estadisticas(efs); + printf("Size del Archivo de datos: %lu\n",stats.tam_archivo_bytes); + printf("Total de espacio libre en el .dat: %lu\n",stats.total_fs); + printf("Minimo espacio libre en bloque o gap: %lu\n",stats.min_fs); + printf("Maximo espacio libre en bloque o gap: %lu\n",stats.max_fs); + emufs_destruir(efs); return 0; -- 2.43.0