From ee8568afe20289bebd04904350c3f2563fc90e4a Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Fri, 9 Apr 2004 22:46:48 +0000 Subject: [PATCH] =?utf8?q?-=20Se=20agrega=20svn:ignore=20para=20que=20no?= =?utf8?q?=20salga=20la=20libemufs.a=20en=20el=20svn=20st.=20-=20Primer=20?= =?utf8?q?intento=20de=20tipo1;=20solo=20implementa=20leer=5Fregistro=20(y?= =?utf8?q?=20no=20esta=20probado).=20-=20Se=20generaliza=20emufs=5Fcrear()?= =?utf8?q?=20y=20se=20le=20agrega=20soporte=20para=20tipo1=20(falta=20prob?= =?utf8?q?ar).=20-=20Se=20agrega=20emufs=5Fcrear=5Farchivo=5Fauxiliar().?= =?utf8?q?=20-=20Se=20agregan=20los=20emufs=5Fxxx=5Fcrear()=20para=20crear?= =?utf8?q?=20archivos=20auxiliares=20espec=C3=ADficos.=20-=20Se=20actualiz?= =?utf8?q?a=20Makefile.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- emufs/Makefile | 8 +-- emufs/did.c | 8 ++- emufs/did.h | 3 ++ emufs/emufs.c | 142 ++++++++++++++++++++++++++++++++++--------------- emufs/emufs.h | 5 +- emufs/fsc.c | 6 +++ emufs/fsc.h | 3 ++ emufs/idx.c | 6 +++ emufs/idx.h | 3 ++ emufs/tipo1.c | 116 ++++++++++++++++++++++++++++++++++++++++ emufs/tipo1.h | 63 ++++++++++++++++++++++ 11 files changed, 313 insertions(+), 50 deletions(-) create mode 100644 emufs/tipo1.c create mode 100644 emufs/tipo1.h diff --git a/emufs/Makefile b/emufs/Makefile index aecd1e5..fc6b95a 100644 --- a/emufs/Makefile +++ b/emufs/Makefile @@ -1,13 +1,13 @@ CFLAGS=-Wall -g -ansi -pedantic -DDEBUG LDFLAGS= -EMUFS_COMMON=emufs.o idx.o did.o fsc.o +EMUFS_COMMON=emufs.o tipo1.o tipo3.o idx.o did.o fsc.o -all: tipo3_main libemufs.a +all: libemufs.a tipo3_main -tipo3_main: tipo3_main.o tipo3.o $(EMUFS_COMMON) +tipo3_main: tipo3_main.o $(EMUFS_COMMON) -libemufs.a: tipo3.o $(EMUFS_COMMON) +libemufs.a: $(EMUFS_COMMON) ar cru libemufs.a tipo3.o $(EMUFS_COMMON) clean: diff --git a/emufs/did.c b/emufs/did.c index 90a200b..407b123 100644 --- a/emufs/did.c +++ b/emufs/did.c @@ -20,6 +20,7 @@ *---------------------------------------------------------------------------- * Creado: jue abr 8 18:07:57 ART 2004 * Autores: Nicolás Dimov + * Leandro Lucarella *---------------------------------------------------------------------------- * * $Id$ @@ -39,6 +40,11 @@ #include #include +int emufs_did_crear(EMUFS* efs) +{ + return emufs_crear_archivo_auxiliar(efs->nombre, EMUFS_DID_EXT); +} + int emufs_did_get_last(EMUFS *emu) { FILE * f_did; @@ -46,7 +52,7 @@ int emufs_did_get_last(EMUFS *emu) char name_f_did[255]; strcpy(name_f_did, emu->nombre); - strcat(name_f_did, EMUFS_DID_EXT); + strcat(name_f_did, EMUFS_DID_EXT); if ( (f_did = fopen(name_f_did,"r")) == NULL) return -1; /*ERROR*/ fseek(f_did, 0, SEEK_END); diff --git a/emufs/did.h b/emufs/did.h index b50d630..e79b8ce 100644 --- a/emufs/did.h +++ b/emufs/did.h @@ -20,6 +20,7 @@ *---------------------------------------------------------------------------- * Creado: jue abr 8 18:09:31 ART 2004 * Autores: Nicolás Dimov + * Leandro Lucarella *---------------------------------------------------------------------------- * * $Id$ @@ -42,6 +43,8 @@ #define EMUFS_DID_EXT ".did" +int emufs_did_crear(EMUFS*); + int emufs_did_get_last(EMUFS *); int emufs_did_agregar(EMUFS *, int); diff --git a/emufs/emufs.c b/emufs/emufs.c index 6edd665..0c529ed 100644 --- a/emufs/emufs.c +++ b/emufs/emufs.c @@ -39,13 +39,12 @@ */ #include "emufs.h" +#include "tipo1.h" #include "tipo3.h" #include "did.h" #include "fsc.h" #include "idx.h" -/* Defino las extenciones que usan cada tipo de archivo */ - char *str_dup(const char *s); char *str_dup(const char *s) @@ -57,64 +56,119 @@ char *str_dup(const char *s) return tmp; } +int emufs_crear_archivo_auxiliar(const char* name, const char* ext) +{ + FILE* f; + char* filename; + + filename = (char*) malloc(sizeof(char) * (strlen(name) + strlen(ext) + 1)); + if (filename == NULL) { + /* TODO Manejo de errores */ + return -1; + } + strcpy(filename, name); + strcat(filename, ext); + f = fopen(filename, "w"); + free(filename); + if (f == NULL) { + /* TODO Manejo de errores */ + return -1; + } + fclose(f); + return 0; +} + -EMUFS *emufs_crear(const char *filename, char tipo, unsigned int tam_bloque, unsigned int tam_reg) +EMUFS *emufs_crear(const char *filename, char tipo, unsigned long tam_bloque, unsigned long tam_reg) { char name[255]; FILE *fp; - EMUFS *tmp = (EMUFS *)malloc(sizeof(EMUFS)); + EMUFS *efs; + + /* 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)); + efs->tipo = tipo; + efs->tam_bloque = tam_bloque; + efs->nombre = str_dup(filename); + + /* Abre archivo de datos. */ + strcpy(name, filename); + strcat(name, ".dat"); + fp = fopen(name, "w"); + if (fp == NULL) { + /* TODO ERROR */ + free(efs->nombre); + free(efs); + return NULL; + } + + /* Guarda cabecera común. */ + fwrite(&tipo, sizeof(char), 1, fp); /* FIXME no debería ser sizeof(EMUFS_TYPE) ? */ + + /* Crea archivo de índice. */ + if (emufs_idx_crear(efs)) { + /* TODO ERROR */ + free(efs->nombre); + free(efs); + return NULL; + } + /* Crea archivo de control de espacio libre. */ + if (emufs_fsc_crear(efs)) { + /* TODO ERROR */ + free(efs->nombre); + free(efs); + return NULL; + } + + /* Crea archivo de identificadores borrados (recuperables). */ + if (emufs_did_crear(efs)) { + /* TODO ERROR */ + free(efs->nombre); + free(efs); + return NULL; + } + + /* Termina de realizar el trabajo según el tipo de archivo. */ switch (tipo) { + case T1: - break; + /* 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; + + /* Guarda cabeceras propias. */ + fwrite(&tam_bloque, sizeof(unsigned long), 1, fp); + + break; + case T2: - break; + break; + case T3: - tmp->tipo = T3; - tmp->tam_bloque = tam_bloque; - 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); + /* Asigna punteros a funciones. */ + 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; - strcpy(name, filename); - strcat(name, ".dat"); - fp = fopen(name, "w"); - if (fp == NULL) { - /* ERROR */ - free(tmp->nombre); - free(tmp); - return NULL; - } - /* Guardo el Header */ - fwrite(&tipo, sizeof(char), 1, fp); + /* Guarda cabeceras propias. */ fwrite(&tam_bloque, sizeof(unsigned int), 1, fp); fwrite(&tam_reg, sizeof(unsigned int), 1, fp); - fclose(fp); - strcpy(name, filename); - strcat(name, EMUFS_IDX_EXT); - fp = fopen(name, "w"); - fclose(fp); + break; - strcpy(name, filename); - strcat(name, EMUFS_FSC_EXT); - fp = fopen(name, "w"); - fclose(fp); - - strcpy(name, filename); - strcat(name, EMUFS_DID_EXT); - fp = fopen(name, "w"); - fclose(fp); - - break; - default: - free(tmp); - return NULL; } - return tmp; + fclose(fp); + return efs; } EMUFS *emufs_abrir(const char *filename) diff --git a/emufs/emufs.h b/emufs/emufs.h index 0e469a9..f8a7067 100644 --- a/emufs/emufs.h +++ b/emufs/emufs.h @@ -78,6 +78,9 @@ typedef struct _emu_fs_t { char *nombre; /**< Nombre del archivo */ } EMUFS; +/** Crea un archivo auxiliar. */ +int emufs_crear_archivo_auxiliar(const char*, const char*); + /** Crea un nuevo archivo EMUFS. * * Un archivo EMUFS está compuesto por 4 archivos a nivel del sistema operativo. @@ -100,7 +103,7 @@ typedef struct _emu_fs_t { * \param tam_bloque Tamaño del bloque. * \param tam_reg Tamaño del registro. */ -EMUFS *emufs_crear(const char *filename, char tipo, unsigned int tam_bloque, unsigned int tam_reg); +EMUFS *emufs_crear(const char *filename, char tipo, unsigned long tam_bloque, unsigned long tam_reg); /** Abre un archivo EMUFS. * diff --git a/emufs/fsc.c b/emufs/fsc.c index 692d6d1..b67ce36 100644 --- a/emufs/fsc.c +++ b/emufs/fsc.c @@ -20,6 +20,7 @@ *---------------------------------------------------------------------------- * Creado: vie abr 9 16:17:50 ART 2004 * Autores: Nicolás Dimov + * Leandro Lucarella *---------------------------------------------------------------------------- * * $Id$ @@ -38,6 +39,11 @@ #include #include +int emufs_fsc_crear(EMUFS* efs) +{ + return emufs_crear_archivo_auxiliar(efs->nombre, EMUFS_FSC_EXT); +} + int emufs_fsc_agregar(EMUFS *emu, int num_bloque, int fs) { FILE *f_fsc; diff --git a/emufs/fsc.h b/emufs/fsc.h index 0a2df0d..9e44692 100644 --- a/emufs/fsc.h +++ b/emufs/fsc.h @@ -20,6 +20,7 @@ *---------------------------------------------------------------------------- * Creado: vie abr 9 16:17:50 ART 2004 * Autores: Nicolás Dimov + * Leandro Lucarella *---------------------------------------------------------------------------- * * $Id$ @@ -46,6 +47,8 @@ typedef struct emufs_fsc_t { int free_space; } EMUFS_FSC; +int emufs_fsc_crear(EMUFS*); + int emufs_fsc_agregar(EMUFS *, int, int); int emufs_fsc_actualizar(EMUFS *, int, int); diff --git a/emufs/idx.c b/emufs/idx.c index ea97102..cc88257 100644 --- a/emufs/idx.c +++ b/emufs/idx.c @@ -20,6 +20,7 @@ *---------------------------------------------------------------------------- * Creado: jue abr 8 18:10:35 ART 2004 * Autores: Nicolás Dimov + * Leandro Lucarella *---------------------------------------------------------------------------- * * $Id$ @@ -56,6 +57,11 @@ FILE* emufs_idx_abrir(EMUFS* efs, const char* mode) return f; } +int emufs_idx_crear(EMUFS *efs) +{ + return emufs_crear_archivo_auxiliar(efs->nombre, EMUFS_IDX_EXT); +} + int emufs_idx_buscar_mayor_id(EMUFS *emu) { int id, max = -1; diff --git a/emufs/idx.h b/emufs/idx.h index cb67b69..4055549 100644 --- a/emufs/idx.h +++ b/emufs/idx.h @@ -20,6 +20,7 @@ *---------------------------------------------------------------------------- * Creado: jue abr 8 18:11:46 ART 2004 * Autores: Nicolás Dimov + * Leandro Lucarella *---------------------------------------------------------------------------- * * $Id$ @@ -49,6 +50,8 @@ typedef struct emufs_idx_t { FILE* emufs_idx_abrir(EMUFS*, const char*); +int emufs_idx_crear(EMUFS*); + int emufs_idx_buscar_mayor_id(EMUFS *); int emufs_idx_buscar_registro(EMUFS *, int); diff --git a/emufs/tipo1.c b/emufs/tipo1.c new file mode 100644 index 0000000..d5a0a58 --- /dev/null +++ b/emufs/tipo1.c @@ -0,0 +1,116 @@ +/* vim: set noexpandtab tabstop=4 shiftwidth=4: + *---------------------------------------------------------------------------- + * emufs + *---------------------------------------------------------------------------- + * This file is part of emufs. + * + * emufs is free software; you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * emufs is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along + * with emufs; if not, write to the Free Software Foundation, Inc., 59 Temple + * Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------------- + * Creado: vie abr 9 16:47:32 ART 2004 + * Autores: Leandro Lucarella + *---------------------------------------------------------------------------- + * + * $Id$ + * + */ + +/** \file + * + * Archivo con bloque de longitud parametrizada, registro de longitud variable. + * + * Implementación del archivo con bloques de longitud parametrizada y registros + * de longitud variable. + * + */ + +#include "tipo1.h" +#include +#include +#include +#include +#include + +int emufs_tipo1_leer_registro(EMUFS* efs, int reg_id, void* reg_ptr, unsigned long reg_size) +{ + int block_id; /* id del bloque en donde esta el registro a leer */ + char* block; /* bloque leido (en donde está el registro a leer) */ + ptrdiff_t offset; /* offset del bloque a leido */ + unsigned long curr_reg_size; /* tamaño del registro leido secuencialmente */ + int curr_reg_id; /* id del registro leido secuencialmente */ + + block_id = emufs_idx_buscar_registro(efs, reg_id); + block = (char*) malloc(efs->tam_bloque); + if (block == NULL) { + /* TODO Manejo de errores */ + printf("No hay memoria.\n"); + return -1; + } + + if (emufs_tipo1_leer_bloque(efs, block_id, block) == -1) { + /* TODO Manejo de errores */ + free(block); + printf("no se pudo leer el bloque\n"); + return -1; + } + + /* Busco secuencialmente en el bloque el registro a leer */ + offset = 0; + do { + /* Copio el id del registro de la cabecera. */ + memcpy(&curr_reg_id, block + offset, sizeof(int)); + offset += sizeof(int); + /* Copio el tamaño del registro de la cabecera. */ + memcpy(&curr_reg_size, block + offset, sizeof(unsigned long)); + offset += sizeof(unsigned long); + if (curr_reg_id == reg_id) { + /* XXX Posible checkeo de reg_size == curr_reg_size */ + memcpy(reg_ptr, block + offset, curr_reg_size); + break; + } + /* Desplazo el offset */ + offset += curr_reg_size; + } while (offset < efs->tam_bloque); + + free(block); + return 0; +} + +int emufs_tipo1_leer_bloque(EMUFS *emu, int ID, void* ptr) +{ + return -1; /* FIXME Error */ +} + +int emufs_tipo1_grabar_registro(EMUFS *emu, void *ptr, unsigned long tam) +{ + return -1; /* FIXME Error */ +} + +/*Busco en el archivo de Id`s un Id valido para un nuevo registro*/ +int emufs_tipo1_get_id(EMUFS *emu) +{ + return -1; /* FIXME Error */ +} + +/*Graba un bloque en el archivo*/ +int emufs_tipo1_grabar_bloque(EMUFS *emu, void *ptr, int num) +{ + return -1; /* FIXME Error */ +} + +/*borra un registro de un bloque y acomoda los registros que quedan*/ +int emufs_tipo1_borrar_registro(EMUFS *emu, int ID, unsigned long tam_reg) +{ + return -1; /* FIXME Error */ +} diff --git a/emufs/tipo1.h b/emufs/tipo1.h new file mode 100644 index 0000000..113a66d --- /dev/null +++ b/emufs/tipo1.h @@ -0,0 +1,63 @@ +/* vim: set noexpandtab tabstop=4 shiftwidth=4: + *---------------------------------------------------------------------------- + * emufs + *---------------------------------------------------------------------------- + * This file is part of emufs. + * + * emufs is free software; you can redistribute it and/or modify it under the + * terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * emufs is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along + * with emufs; if not, write to the Free Software Foundation, Inc., 59 Temple + * Place, Suite 330, Boston, MA 02111-1307 USA + *---------------------------------------------------------------------------- + * Creado: vie abr 9 16:47:54 ART 2004 + * Autores: Leandro Lucarella + *---------------------------------------------------------------------------- + * + * $Id$ + * + */ + +/** \file + * + * Archivo con bloque de longitud parametrizada, registro de longitud variable. + * + * Interfaz del archivo con bloques de longitud parametrizada y registros de + * longitud variable. + * + */ + +#ifndef _EMUFS_TIPO1_H_ +#define _EMUFS_TIPO1_H_ + +#include "emufs.h" +#include "did.h" +#include "idx.h" +#include "fsc.h" + +int emufs_tipo1_leer_registro(EMUFS *, int , void *, unsigned long); + +int emufs_tipo1_leer_bloque(EMUFS *, int , void *); + +int emufs_tipo1_grabar_registro(EMUFS *, void *, unsigned long ); + +int emufs_tipo1_grabar_bloque(EMUFS *, void *, int); + +int emufs_tipo1_get_id(EMUFS *); + +int emufs_tipo1_buscar_registro(EMUFS *, int); + +int emufs_tipo1_buscar_lugar(EMUFS *, unsigned long , int *); + +int emufs_tipo1_borrar_registro(EMUFS*, int, unsigned long); + + +#endif /* _EMUFS_TIPO1_H_ */ -- 2.43.0