X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/38e8783579e4b158b1fced1caec93e16ae05afc4..8eb8116159fc75f96c68bf3379a8aeec5994a97a:/emufs/emufs.c diff --git a/emufs/emufs.c b/emufs/emufs.c index a6a774c..b67ffaa 100644 --- a/emufs/emufs.c +++ b/emufs/emufs.c @@ -40,6 +40,7 @@ #include "emufs.h" #include "tipo1.h" +#include "tipo2.h" #include "tipo3.h" #include "did.h" #include "fsc.h" @@ -47,6 +48,7 @@ char *str_dup(const char *s); +/* Duplica una cadena de caracteres y devuelve la copia. */ char *str_dup(const char *s) { char *tmp; @@ -56,6 +58,7 @@ char *str_dup(const char *s) return tmp; } +/* Objetivo: Crea un archivo de nombre y extension dadas. */ int emufs_crear_archivo_auxiliar(const char* name, const char* ext) { FILE* f; @@ -78,22 +81,27 @@ int emufs_crear_archivo_auxiliar(const char* name, const char* ext) return 0; } - -EMUFS *emufs_crear(const char *filename, char tipo, unsigned long tam_bloque, unsigned long tam_reg) +/* Crea un archivo de tipo dado y devuelve una estructura con las rutinas de handling de dicho archivo. */ +EMUFS *emufs_crear(const char *filename, EMUFS_TYPE tipo, + EMUFS_BLOCK_SIZE tam_bloque, EMUFS_REG_SIZE tam_reg) { char name[255]; FILE *fp; EMUFS *efs; - /* Si no es un tipo conocido, sale */ + /* Si no es un tipo conocido, sale. */ if ((tipo != T1) && (tipo != T2) && (tipo != T3)) { return NULL; } /* Inicializa parámetros comunes. */ efs = (EMUFS*) malloc(sizeof(EMUFS)); + if (efs == NULL) { + return NULL; + } efs->tipo = tipo; efs->tam_bloque = tam_bloque; + efs->tam_reg = tam_reg; efs->nombre = str_dup(filename); /* Abre archivo de datos. */ @@ -108,7 +116,7 @@ EMUFS *emufs_crear(const char *filename, char tipo, unsigned long tam_bloque, un } /* Guarda cabecera común. */ - fwrite(&tipo, sizeof(char), 1, fp); /* FIXME no debería ser sizeof(EMUFS_TYPE) ? */ + fwrite(&tipo, sizeof(EMUFS_TYPE), 1, fp); /* Crea archivo de índice. */ if (emufs_idx_crear(efs)) { @@ -138,18 +146,19 @@ EMUFS *emufs_crear(const char *filename, char tipo, unsigned long tam_bloque, un switch (tipo) { case T1: - /* Asigna punteros a funciones. */ - efs->leer_bloque = emufs_tipo1_leer_bloque; - efs->leer_registro = emufs_tipo1_leer_registro; - efs->grabar_registro = emufs_tipo1_grabar_registro; - efs->borrar_registro = emufs_tipo1_borrar_registro; + emufs_tipo1_inicializar(efs); /* Guarda cabeceras propias. */ - fwrite(&tam_bloque, sizeof(unsigned long), 1, fp); + fwrite(&tam_bloque, sizeof(EMUFS_BLOCK_SIZE), 1, fp); break; case T2: + /* Asigna punteros a funciones. */ + efs->grabar_registro = emufs_tipo2_grabar_registro; + efs->borrar_registro = emufs_tipo2_borrar_registro; + efs->nombre = str_dup(filename); + /*efs->leer_registro = emufs_tipo2_leer_registro;*/ break; case T3: @@ -157,12 +166,11 @@ EMUFS *emufs_crear(const char *filename, char tipo, unsigned long tam_bloque, un efs->leer_bloque = emufs_tipo3_leer_bloque; efs->leer_registro = emufs_tipo3_leer_registro; efs->grabar_registro = emufs_tipo3_grabar_registro; - efs->borrar_registro = emufs_tipo3_borrar_registro; + /*efs->borrar_registro = emufs_tipo3_borrar_registro;*/ /* Guarda cabeceras propias. */ - fwrite(&tam_bloque, sizeof(unsigned int), 1, fp); - fwrite(&tam_reg, sizeof(unsigned int), 1, fp); - + fwrite(&tam_bloque, sizeof(EMUFS_BLOCK_SIZE), 1, fp); + fwrite(&tam_reg, sizeof(EMUFS_REG_SIZE), 1, fp); break; } @@ -171,9 +179,10 @@ EMUFS *emufs_crear(const char *filename, char tipo, unsigned long tam_bloque, un return efs; } +/* Realiza la apertura de un archivo dado, identifica el tipo de archivo y devuelve la estructura de handling. */ EMUFS *emufs_abrir(const char *filename) { - EMUFS *tmp; + EMUFS *efs; char name[255]; char tipo; FILE *fp; @@ -184,37 +193,57 @@ EMUFS *emufs_abrir(const char *filename) /* Trato de determinar el tipo de archivo */ fp = fopen(name, "r"); if (fp == NULL) return NULL; - fread(&tipo, sizeof(char), 1, fp); - if ((tipo < 0) || (tipo > 2)) { + fread(&tipo, sizeof(EMUFS_TYPE), 1, fp); + + /* Si no es un tipo conocido, sale. */ + if ((tipo != T1) && (tipo != T2) && (tipo != T3)) { fclose(fp); return NULL; } - tmp = (EMUFS *)malloc(sizeof(EMUFS)); - if (tmp == NULL) { + /* Inicializa parámetros comunes. */ + efs = (EMUFS*) malloc(sizeof(EMUFS)); + if (efs == NULL) { fclose(fp); return NULL; } + efs->tipo = tipo; + efs->nombre = str_dup(filename); switch (tipo) { case T1: - break; + emufs_tipo1_inicializar(efs); + /* Lee cabeceras propias. */ + if (!fread(&(efs->tam_bloque), sizeof(EMUFS_BLOCK_SIZE), 1, fp)) { + free(efs->nombre); + free(efs); + fclose(fp); + return NULL; + } + break; case T2: - break; + break; case T3: - tmp->tipo = tipo; - fread(&tmp->tam_bloque, sizeof(int), 1, fp); - 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); + if ((!fread(&(efs->tam_bloque), sizeof(EMUFS_BLOCK_SIZE), 1, fp)) || + (!fread(&(efs->tam_reg), sizeof(EMUFS_REG_SIZE), 1, fp))) + { + free(efs->nombre); + free(efs); + fclose(fp); + return NULL; + } + efs->leer_bloque = emufs_tipo3_leer_bloque; + efs->leer_registro = emufs_tipo3_leer_registro; + efs->grabar_registro = emufs_tipo3_grabar_registro; + /*efs->borrar_registro = emufs_tipo3_borrar_registro;*/ + break; } fclose(fp); - return tmp; + return efs; } +/* Objetivo: Rutina llamada al destruir la aplicacion para librerar */ int emufs_destruir(EMUFS *e) { if (e == NULL) return 1; @@ -223,6 +252,7 @@ int emufs_destruir(EMUFS *e) return 0; } +/* Visualiza espacios libres de un archivo?? */ int ver_archivo_FS(EMUFS *emu) { FILE *f_block_free; @@ -238,7 +268,7 @@ int ver_archivo_FS(EMUFS *emu) } fread(®,sizeof(reg),1,f_block_free); while ( !feof(f_block_free) ){ - printf(" Bloque = %d Espacio libre = %d\n",reg.block, reg.free_space); + printf(" Bloque = %li Espacio libre = %li\n",reg.n_Marker, reg.n_FreeSpace); fread(®,sizeof(reg),1,f_block_free); } @@ -253,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 %ld en bloque %d\n", r.id_reg, r.block); + 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);