From: Leandro Lucarella Date: Sun, 18 Apr 2004 16:52:01 +0000 (+0000) Subject: Se agrega una bolsa de funciones (common) con emufs_common_get_file_size(). X-Git-Tag: svn_import_r684~365 X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/commitdiff_plain/381a5f98d66c8a3847d9918077a351b4813558fd?ds=sidebyside Se agrega una bolsa de funciones (common) con emufs_common_get_file_size(). --- diff --git a/emufs/Makefile b/emufs/Makefile index 7f9be14..a92896f 100644 --- a/emufs/Makefile +++ b/emufs/Makefile @@ -1,7 +1,7 @@ CFLAGS=-Wall -g -ansi -pedantic -DDEBUG LDFLAGS=-lm -EMUFS_COMMON=emufs.o tipo1.o tipo2.o tipo3.o idx.o did.o fsc.o +EMUFS_COMMON=emufs.o tipo1.o tipo2.o tipo3.o idx.o did.o fsc.o common.o all: libemufs.a tipo1_main tipo2_main tipo3_main diff --git a/emufs/common.c b/emufs/common.c new file mode 100644 index 0000000..f2dfc93 --- /dev/null +++ b/emufs/common.c @@ -0,0 +1,58 @@ +/* vim: set noexpandtab tabstop=4 shiftwidth=4 wrap: + *---------------------------------------------------------------------------- + * 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: dom abr 18 13:28:44 ART 2004 + * Autores: Leandro Lucarella + *---------------------------------------------------------------------------- + * + * $Id$ + * + */ + +/** \file + * + * Funciones para uso común de los tipos de archivo de EMUFS. + * + */ + +#include "common.h" +#include "error.h" +#include + +long emufs_common_get_file_size(const char* filename, int* err) +{ + FILE* file; + long file_size; + + if (!(file = fopen(filename, "ab"))) { + PERR("Error al abrir archivo"); + *err = EMUFS_ERROR_CANT_OPEN_FILE; + return 0; + } + file_size = ftell(file); + fclose(file); + if (file_size < 0) { + PERR("Error al obtener posición del archivo"); + *err = EMUFS_ERROR_TELL_FILE; + return 0; + } + return file_size; +} + diff --git a/emufs/common.h b/emufs/common.h new file mode 100644 index 0000000..4711ec5 --- /dev/null +++ b/emufs/common.h @@ -0,0 +1,44 @@ +/* vim: set noexpandtab tabstop=4 shiftwidth=4 wrap: + *---------------------------------------------------------------------------- + * 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: dom abr 18 13:28:44 ART 2004 + * Autores: Leandro Lucarella + *---------------------------------------------------------------------------- + * + * $Id$ + * + */ + +/** \file + * + * Funciones para uso común de los tipos de archivo de EMUFS. + * + */ + +#ifdef DEBUG + /** Imprime un mensaje de debug por pantalla. */ + #define PERR(msg) fprintf(stderr, "%s:%d> %s.\n",__FILE__, __LINE__, msg); +#else + #define PERR(msg) ; +#endif /* DEBUG */ + +/** Obtiene el tamaño del archivo de nombre \c filename. */ +long emufs_common_get_file_size(const char* filename, int* err); + diff --git a/emufs/did.c b/emufs/did.c index 556f07b..3470585 100644 --- a/emufs/did.c +++ b/emufs/did.c @@ -38,8 +38,8 @@ #include "did.h" #include "error.h" +#include "common.h" #include -#include #include int emufs_did_crear(EMUFS* efs) diff --git a/emufs/emufs.c b/emufs/emufs.c index 35c9cb3..9000fd6 100644 --- a/emufs/emufs.c +++ b/emufs/emufs.c @@ -39,6 +39,7 @@ */ #include "emufs.h" +#include "common.h" #include "tipo1.h" #include "tipo2.h" #include "tipo3.h" diff --git a/emufs/emufs.h b/emufs/emufs.h index 04b72f2..db36963 100644 --- a/emufs/emufs.h +++ b/emufs/emufs.h @@ -44,13 +44,6 @@ #include #include -#ifdef DEBUG - /** Imprime un mensaje de debug por pantalla. */ - #define PERR(msg) fprintf(stderr, "%s:%d> %s.\n",__FILE__, __LINE__, msg); -#else - #define PERR(msg) ; -#endif /* DEBUG */ - /** Tipo de archivo. */ typedef enum { T1, /**< Archivo de bloque parametrizado y registro variable. */ diff --git a/emufs/fsc.c b/emufs/fsc.c index 7520282..2d2932b 100644 --- a/emufs/fsc.c +++ b/emufs/fsc.c @@ -37,8 +37,8 @@ #include "fsc.h" #include "error.h" +#include "common.h" #include -#include #include /* Crea un archivo de Gaps o Espacio Libre en Bloque */ diff --git a/emufs/idx.c b/emufs/idx.c index bd20b63..fcaa7fc 100644 --- a/emufs/idx.c +++ b/emufs/idx.c @@ -38,6 +38,7 @@ #include "idx.h" #include "did.h" #include "error.h" +#include "common.h" #include #include #include diff --git a/emufs/tipo1.c b/emufs/tipo1.c index fbebc53..f672c19 100644 --- a/emufs/tipo1.c +++ b/emufs/tipo1.c @@ -39,9 +39,9 @@ #include "idx.h" #include "fsc.h" #include "did.h" +#include "common.h" #include "error.h" #include -#include #include #include #include @@ -75,9 +75,6 @@ static void* emufs_tipo1_leer_bloque(EMUFS*, EMUFS_BLOCK_ID, int*); static EMUFS_BLOCK_ID emufs_tipo1_grabar_bloque_fsc(EMUFS*, void*, EMUFS_BLOCK_ID, EMUFS_FREE, int*); -/** Obtiene el tamaño del archivo. */ -static long emufs_tipo1_get_file_size(EMUFS*, int*); - /*------------------ Funciones públicas ----------------------*/ int emufs_tipo1_inicializar(EMUFS* efs) @@ -484,10 +481,15 @@ EMUFS_Estadisticas emufs_tipo1_leer_estadisticas(EMUFS* efs) EMUFS_Estadisticas stats; memset(&stats, 0, sizeof(EMUFS_Estadisticas)); - stats.tam_archivo_bytes = emufs_tipo1_get_file_size(efs, &err); - if (err) { - PERR("no se pudo obtener el tamaño del archivo"); - return stats; + { /* obtengo tamaño del archivo en bytes */ + char name_f[255]; + strcpy(name_f, efs->nombre); + strcat(name_f, ".dat"); + stats.tam_archivo_bytes = emufs_common_get_file_size(name_f, &err); + if (err) { + PERR("no se pudo obtener el tamaño del archivo"); + return stats; + } } /* obtengo cantidad de bloques */ @@ -585,10 +587,20 @@ EMUFS_BLOCK_ID emufs_tipo1_grabar_bloque_fsc(EMUFS *efs, void *block, { FILE* file; char name_f[255]; + EMUFS_BLOCK_SIZE num_blocks; + + /* obtengo nombre del archivo */ + strcpy(name_f, efs->nombre); + strcat(name_f,".dat"); + /* obtengo cantidad de bloques */ - EMUFS_BLOCK_SIZE num_blocks = - (emufs_tipo1_get_file_size(efs, err) - emufs_tipo1_header_size()) + num_blocks = + (emufs_common_get_file_size(name_f, err) - emufs_tipo1_header_size()) / efs->tam_bloque; + if (*err) { + PERR("Error al obtener tamaño del archivo."); + return EMUFS_NOT_FOUND; + } /* abre archivo */ strcpy(name_f,efs->nombre); @@ -695,24 +707,6 @@ void emufs_tipo1_escribir_reg_chunk_en_memoria(char* dst, memcpy(dst, reg, reg_size); } -long emufs_tipo1_get_file_size(EMUFS* efs, int* err) -{ - long file_size; - FILE* file; - char name_f[255]; - - strcpy(name_f, efs->nombre); - strcat(name_f, ".dat"); - if ((file = fopen(name_f, "ab")) == NULL) { - PERR("Error al abrir archivo"); - *err = EMUFS_ERROR_CANT_OPEN_FILE; - return 0; - } - file_size = ftell(file); - fclose(file); - 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; diff --git a/emufs/tipo2.c b/emufs/tipo2.c index 0d3261c..40ff8d2 100644 --- a/emufs/tipo2.c +++ b/emufs/tipo2.c @@ -42,8 +42,8 @@ #include "fsc.h" #include "did.h" #include "error.h" +#include "common.h" #include -#include #include #include diff --git a/emufs/tipo3.c b/emufs/tipo3.c index 946186c..999bb6d 100644 --- a/emufs/tipo3.c +++ b/emufs/tipo3.c @@ -37,8 +37,8 @@ #include "tipo3.h" #include "error.h" +#include "common.h" #include -#include #include #include