From 6c5fe1e15e441c27ba01b22b91bf1e5843ae53f2 Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Fri, 9 Apr 2004 19:27:56 +0000 Subject: [PATCH 01/16] Se emprolija un poco los archivos de indices. --- emufs/did.c | 8 ++++-- emufs/did.h | 8 +++--- emufs/emufs.c | 5 +--- emufs/fsc.c | 74 ++++++++++++++++++++++++++++++++++++++++----------- emufs/fsc.h | 45 +++++++++++++++++++++++++++---- emufs/idx.c | 30 ++++++++++++--------- emufs/idx.h | 6 ++--- emufs/tipo3.h | 17 +++--------- 8 files changed, 133 insertions(+), 60 deletions(-) diff --git a/emufs/did.c b/emufs/did.c index 939493b..f193025 100644 --- a/emufs/did.c +++ b/emufs/did.c @@ -36,6 +36,10 @@ */ #include "did.h" +#include +#include + +#define EMUFS_DID_EXT ".did" int emufs_did_get_last(EMUFS *emu) { @@ -44,7 +48,7 @@ int emufs_did_get_last(EMUFS *emu) char name_f_did[255]; strcpy(name_f_did, emu->nombre); - strcat(name_f_did, ".did"); + 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); @@ -76,7 +80,7 @@ int emufs_did_agregar(EMUFS *emu, int ID) char name_f_did[255]; strcpy(name_f_did, emu->nombre); - strcat(name_f_did, ".did"); + strcat(name_f_did, EMUFS_DID_EXT); if ( (f_did = fopen(name_f_did,"a+")) == NULL) return -1; fwrite(&ID, sizeof(int), 1, f_did); diff --git a/emufs/did.h b/emufs/did.h index 46a7867..94770dd 100644 --- a/emufs/did.h +++ b/emufs/did.h @@ -35,15 +35,13 @@ * */ -#ifndef _DID_H_ -#define _DID_H_ +#ifndef _EMUFS_DID_H_ +#define _EMUFS_DID_H_ -#include -#include #include "emufs.h" int emufs_did_get_last(EMUFS *); int emufs_did_agregar(EMUFS *, int); -#endif /* _DID_H */ +#endif /* _EMUFS_DID_H */ diff --git a/emufs/emufs.c b/emufs/emufs.c index b62702b..9934374 100644 --- a/emufs/emufs.c +++ b/emufs/emufs.c @@ -24,7 +24,7 @@ * Leandro Lucarella *---------------------------------------------------------------------------- * - * $Id: command.cpp 220 2003-11-19 23:10:40Z luca $ + * $Id$ * */ @@ -42,10 +42,7 @@ #include "tipo3.h" /* Defino las extenciones que usan cada tipo de archivo */ -#define EXT_TIPO3_ID ".idx" #define EXT_TIPO3_DATA ".dat" -#define EXT_TIPO3_DISP ".fsc" -#define EXT_TIPO3_IDS ".did" char *str_dup(const char *s); diff --git a/emufs/fsc.c b/emufs/fsc.c index f5d6d06..c0c026f 100644 --- a/emufs/fsc.c +++ b/emufs/fsc.c @@ -1,21 +1,65 @@ +/* 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:17:50 ART 2004 + * Autores: Nicolás Dimov + *---------------------------------------------------------------------------- + * + * $Id$ + * + */ + +/** \file + * + * Archivo para administrar el espacio libre disponible. + * + * Implementación del archivo para administrar el espacio libre disponible. + * + */ + #include "fsc.h" -#include "tipo3.h" +#include +#include + +#define EMUFS_FSC_EXT ".fsc" + +typedef struct emufs_fsc_t { + int block; + int free_space; +} EMUFS_FSC; int emufs_fsc_agregar(EMUFS *emu, int num_bloque, int fs) { FILE *f_fsc; - BLOCK_FREE_T reg; + EMUFS_FSC reg; char name_f_fsc[255]; strcpy(name_f_fsc,emu->nombre); - strcat(name_f_fsc,".fsc"); + strcat(name_f_fsc, EMUFS_FSC_EXT); /*cargo el registro*/ reg.block = num_bloque; reg.free_space = fs; /*lo guardo en el archivo al final "a+"*/ if ( (f_fsc = fopen(name_f_fsc,"a+"))==NULL ) return -1; - fwrite(®,sizeof(BLOCK_FREE_T),1,f_fsc); + fwrite(®,sizeof(EMUFS_FSC),1,f_fsc); fclose(f_fsc); return 0; } @@ -24,20 +68,20 @@ int emufs_fsc_agregar(EMUFS *emu, int num_bloque, int fs) int emufs_fsc_actualizar(EMUFS *emu, int num_bloque, int fs) { FILE *f_fsc; - BLOCK_FREE_T reg; + EMUFS_FSC reg; char name_f_fsc[255]; strcpy(name_f_fsc,emu->nombre); - strcat(name_f_fsc,".fsc"); + strcat(name_f_fsc, EMUFS_FSC_EXT); /*busco el bloque que modifique*/ if ( (f_fsc = fopen(name_f_fsc,"r+")) == NULL) return -1; while ( !feof(f_fsc) ){ - if ( fread(®,sizeof(BLOCK_FREE_T),1,f_fsc) != 1) continue; + if ( fread(®,sizeof(EMUFS_FSC),1,f_fsc) != 1) continue; if ( reg.block == num_bloque ){ reg.free_space = fs; - fseek(f_fsc,-sizeof(BLOCK_FREE_T),SEEK_CUR); - fwrite(®,sizeof(BLOCK_FREE_T),1,f_fsc); + fseek(f_fsc,-sizeof(EMUFS_FSC),SEEK_CUR); + fwrite(®,sizeof(EMUFS_FSC),1,f_fsc); break; } } @@ -49,11 +93,11 @@ int emufs_fsc_actualizar(EMUFS *emu, int num_bloque, int fs) int emufs_fsc_buscar_lugar(EMUFS *emu, unsigned long tam, int *fs) { FILE *f_fsc; - BLOCK_FREE_T reg; + EMUFS_FSC reg; char name_f_fsc[255]; strcpy(name_f_fsc,emu->nombre); - strcat(name_f_fsc,".fsc"); + strcat(name_f_fsc, EMUFS_FSC_EXT); if ( (f_fsc = fopen(name_f_fsc,"r"))==NULL ) return -1; @@ -63,7 +107,7 @@ int emufs_fsc_buscar_lugar(EMUFS *emu, unsigned long tam, int *fs) reg.block = -1; *fs = emu->tam_bloque; while( !feof(f_fsc) ){ - if (fread(®,sizeof(BLOCK_FREE_T),1,f_fsc) != 1) continue; + if (fread(®,sizeof(EMUFS_FSC),1,f_fsc) != 1) continue; if ( reg.free_space >= tam+sizeof(int)) break; else { @@ -81,16 +125,16 @@ int emufs_fsc_buscar_lugar(EMUFS *emu, unsigned long tam, int *fs) int emufs_fsc_get_fs(EMUFS *emu, int num_bloque) { FILE *f_fsc; - BLOCK_FREE_T reg; + EMUFS_FSC reg; char name_f_fsc[255]; strcpy(name_f_fsc,emu->nombre); - strcat(name_f_fsc,".fsc"); + strcat(name_f_fsc, EMUFS_FSC_EXT); if ( (f_fsc = fopen(name_f_fsc,"r"))==NULL ) return -1; while ( !feof(f_fsc) ){ - if ( fread(®,sizeof(BLOCK_FREE_T),1,f_fsc) != 1 ) continue; + if ( fread(®,sizeof(EMUFS_FSC),1,f_fsc) != 1 ) continue; if ( reg.block == num_bloque ) break; } diff --git a/emufs/fsc.h b/emufs/fsc.h index 354273a..0216094 100644 --- a/emufs/fsc.h +++ b/emufs/fsc.h @@ -1,7 +1,42 @@ -#ifndef _FSC_H -#define _FSC_H -#include -#include +/* 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:17:50 ART 2004 + * Autores: Nicolás Dimov + *---------------------------------------------------------------------------- + * + * $Id$ + * + */ + +/** \file + * + * Archivo para administrar el espacio libre disponible. + * + * Interfaz del archivo para administrar el espacio libre disponible. + * + */ + +#ifndef _EMUFS_FSC_H +#define _EMUFS_FSC_H + #include "emufs.h" int emufs_fsc_agregar(EMUFS *, int, int); @@ -12,4 +47,4 @@ int emufs_fsc_buscar_lugar(EMUFS *, unsigned long, int *); int emufs_fsc_get_fs(EMUFS *, int); -#endif /* _FSC_H */ +#endif /* _EMUFS_FSC_H */ diff --git a/emufs/idx.c b/emufs/idx.c index a9efcaa..093c2ac 100644 --- a/emufs/idx.c +++ b/emufs/idx.c @@ -35,23 +35,29 @@ */ #include "idx.h" -#include "tipo3.h" + +#define EMUFS_IDX_EXT ".idx" + +typedef struct emufs_idx_t { + int block; + long int id_reg; +} EMUFS_IDX; int emufs_idx_buscar_mayor_id(EMUFS *emu) { int id, max = -1; FILE *f_idx; - BLOCK_REG_T reg; - char name_f_idx[255]; + EMUFS_IDX reg; + char name_f_idx[255]; /* TODO usar malloc para no limitar el tamaño de nombre de archivo */ strcpy(name_f_idx,emu->nombre); - strcat(name_f_idx,".idx"); + strcat(name_f_idx, EMUFS_IDX_EXT); if ( (f_idx = fopen(name_f_idx,"r")) == NULL) return -1; /*ERROR*/ id = -1; 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 (fread(®,sizeof(EMUFS_IDX),1,f_idx) != 1) continue; if ( reg.id_reg >= max ) max = reg.id_reg; } @@ -65,14 +71,14 @@ int emufs_idx_buscar_mayor_id(EMUFS *emu) int emufs_idx_buscar_registro(EMUFS *emu, int ID) { FILE* f_idx; - BLOCK_REG_T reg; + EMUFS_IDX reg; char name_f_idx[255]; strcpy(name_f_idx,emu->nombre); - strcat(name_f_idx,".idx"); + strcat(name_f_idx, EMUFS_IDX_EXT); if ( (f_idx = fopen(name_f_idx,"r")) == NULL) return -1; /*ERROR*/ while ( !feof(f_idx) ){ - if (fread(®,sizeof(BLOCK_REG_T),1,f_idx) != 1) continue; + if (fread(®,sizeof(EMUFS_IDX),1,f_idx) != 1) continue; if ( reg.id_reg == ID ){ fclose(f_idx); return reg.block; @@ -84,20 +90,20 @@ int emufs_idx_buscar_registro(EMUFS *emu, int ID) } /* agrega un registro al final del archivo */ -emufs_idx_agregar(EMUFS *emu, int num_bloque, int ID_aux) +int emufs_idx_agregar(EMUFS *emu, int num_bloque, int ID_aux) { FILE *f_idx; - BLOCK_REG_T reg; + EMUFS_IDX reg; char name_f_idx[255]; strcpy(name_f_idx,emu->nombre); - strcat(name_f_idx,".idx"); + strcat(name_f_idx, EMUFS_IDX_EXT); if ( (f_idx = fopen(name_f_idx,"ab+"))==NULL ) return -1; reg.block = num_bloque; reg.id_reg = ID_aux; - fwrite(®,sizeof(BLOCK_REG_T),1,f_idx); + fwrite(®,sizeof(EMUFS_IDX),1,f_idx); fclose(f_idx); return 0; } diff --git a/emufs/idx.h b/emufs/idx.h index a2c9736..2ccef85 100644 --- a/emufs/idx.h +++ b/emufs/idx.h @@ -34,8 +34,8 @@ * */ -#ifndef _IDX_H -#define _IDX_H +#ifndef _EMUFS_IDX_H +#define _EMUFS_IDX_H #include #include "emufs.h" @@ -46,4 +46,4 @@ int emufs_idx_buscar_registro(EMUFS *, int); int emufs_idx_agregar(EMUFS *, int , int); -#endif /* _IDX_H */ +#endif /* _EMUFS_IDX_H */ diff --git a/emufs/tipo3.h b/emufs/tipo3.h index 0476666..9b64976 100644 --- a/emufs/tipo3.h +++ b/emufs/tipo3.h @@ -35,8 +35,8 @@ * */ -#ifndef _PARAM_CTE_H_ -#define _PARAM_CTE_H_ +#ifndef _EMUFS_TIPO3_H_ +#define _EMUFS_TIPO3_H_ #include #include @@ -47,17 +47,6 @@ #include "idx.h" #include "fsc.h" - -typedef struct block_free_t { - int block; - int free_space; -} BLOCK_FREE_T; - -typedef struct block_reg_t { - int block; - long int id_reg; -} BLOCK_REG_T; - int emufs_tipo3_leer_registro(EMUFS *, int , void *, unsigned long); int emufs_tipo3_leer_bloque(EMUFS *, int , void *); @@ -75,4 +64,4 @@ int emufs_tipo3_buscar_lugar(EMUFS *, unsigned long , int *); int emufs_tipo3_borrar_registro(EMUFS*, int, int); -#endif /* _PARAM_CTE_H_ */ +#endif /* _EMUFS_TIPO3_H_ */ -- 2.43.0 From a7a781b6b1a260c882ad779a9ecdaa517d1a6846 Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Fri, 9 Apr 2004 19:42:02 +0000 Subject: [PATCH 02/16] * Se arregla el codigo para que compile. * Se pasan cosas de los .c a los .h que son de dominio publico ya sea usadas para debug u otros motivos. --- emufs/did.c | 2 -- emufs/did.h | 2 ++ emufs/emufs.c | 22 ++++++++++++---------- emufs/fsc.c | 7 ------- emufs/fsc.h | 7 +++++++ emufs/idx.c | 7 ------- emufs/idx.h | 7 +++++++ 7 files changed, 28 insertions(+), 26 deletions(-) diff --git a/emufs/did.c b/emufs/did.c index f193025..90a200b 100644 --- a/emufs/did.c +++ b/emufs/did.c @@ -39,8 +39,6 @@ #include #include -#define EMUFS_DID_EXT ".did" - int emufs_did_get_last(EMUFS *emu) { FILE * f_did; diff --git a/emufs/did.h b/emufs/did.h index 94770dd..b50d630 100644 --- a/emufs/did.h +++ b/emufs/did.h @@ -40,6 +40,8 @@ #include "emufs.h" +#define EMUFS_DID_EXT ".did" + int emufs_did_get_last(EMUFS *); int emufs_did_agregar(EMUFS *, int); diff --git a/emufs/emufs.c b/emufs/emufs.c index 9934374..6edd665 100644 --- a/emufs/emufs.c +++ b/emufs/emufs.c @@ -40,9 +40,11 @@ #include "emufs.h" #include "tipo3.h" +#include "did.h" +#include "fsc.h" +#include "idx.h" /* Defino las extenciones que usan cada tipo de archivo */ -#define EXT_TIPO3_DATA ".dat" char *str_dup(const char *s); @@ -77,7 +79,7 @@ EMUFS *emufs_crear(const char *filename, char tipo, unsigned int tam_bloque, uns tmp->nombre = str_dup(filename); strcpy(name, filename); - strcat(name, EXT_TIPO3_DATA); + strcat(name, ".dat"); fp = fopen(name, "w"); if (fp == NULL) { /* ERROR */ @@ -92,17 +94,17 @@ EMUFS *emufs_crear(const char *filename, char tipo, unsigned int tam_bloque, uns fclose(fp); strcpy(name, filename); - strcat(name, EXT_TIPO3_ID); + strcat(name, EMUFS_IDX_EXT); fp = fopen(name, "w"); fclose(fp); strcpy(name, filename); - strcat(name, EXT_TIPO3_DISP); + strcat(name, EMUFS_FSC_EXT); fp = fopen(name, "w"); fclose(fp); strcpy(name, filename); - strcat(name, EXT_TIPO3_IDS); + strcat(name, EMUFS_DID_EXT); fp = fopen(name, "w"); fclose(fp); @@ -123,7 +125,7 @@ EMUFS *emufs_abrir(const char *filename) FILE *fp; strcpy(name, filename); - strcat(name, EXT_TIPO3_DATA); + strcat(name, ".dat"); /* Trato de determinar el tipo de archivo */ fp = fopen(name, "r"); @@ -170,7 +172,7 @@ int emufs_destruir(EMUFS *e) int ver_archivo_FS(EMUFS *emu) { FILE *f_block_free; - BLOCK_FREE_T reg; + EMUFS_FSC reg; char name_f_block_free[255]; strcpy(name_f_block_free,emu->nombre); @@ -192,12 +194,12 @@ int ver_archivo_FS(EMUFS *emu) strcpy(name_f_block_free,emu->nombre); strcat(name_f_block_free,".idx"); { - BLOCK_REG_T r; + EMUFS_IDX r; f_block_free = fopen(name_f_block_free, "r"); - fread(&r, sizeof(BLOCK_REG_T), 1, f_block_free); + 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); - fread(&r, sizeof(BLOCK_REG_T), 1, f_block_free); + fread(&r, sizeof(EMUFS_IDX), 1, f_block_free); } fclose(f_block_free); } diff --git a/emufs/fsc.c b/emufs/fsc.c index c0c026f..0a5ba22 100644 --- a/emufs/fsc.c +++ b/emufs/fsc.c @@ -38,13 +38,6 @@ #include #include -#define EMUFS_FSC_EXT ".fsc" - -typedef struct emufs_fsc_t { - int block; - int free_space; -} EMUFS_FSC; - 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 0216094..0a2df0d 100644 --- a/emufs/fsc.h +++ b/emufs/fsc.h @@ -39,6 +39,13 @@ #include "emufs.h" +#define EMUFS_FSC_EXT ".fsc" + +typedef struct emufs_fsc_t { + int block; + int free_space; +} EMUFS_FSC; + 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 093c2ac..9979070 100644 --- a/emufs/idx.c +++ b/emufs/idx.c @@ -36,13 +36,6 @@ #include "idx.h" -#define EMUFS_IDX_EXT ".idx" - -typedef struct emufs_idx_t { - int block; - long int id_reg; -} EMUFS_IDX; - int emufs_idx_buscar_mayor_id(EMUFS *emu) { int id, max = -1; diff --git a/emufs/idx.h b/emufs/idx.h index 2ccef85..ca509c7 100644 --- a/emufs/idx.h +++ b/emufs/idx.h @@ -40,6 +40,13 @@ #include #include "emufs.h" +#define EMUFS_IDX_EXT ".idx" + +typedef struct emufs_idx_t { + int block; + long int id_reg; +} EMUFS_IDX; + int emufs_idx_buscar_mayor_id(EMUFS *); int emufs_idx_buscar_registro(EMUFS *, int); -- 2.43.0 From eab099a18ebaf8397f54955c8e740037bcee2f56 Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Fri, 9 Apr 2004 20:14:28 +0000 Subject: [PATCH 03/16] Agrego emufs_idx_abrir() para abrir mas facil un archivo de indices (compila pero no probado). --- emufs/idx.c | 20 ++++++++++++++++++++ emufs/idx.h | 2 ++ 2 files changed, 22 insertions(+) diff --git a/emufs/idx.c b/emufs/idx.c index 9979070..be142f7 100644 --- a/emufs/idx.c +++ b/emufs/idx.c @@ -35,6 +35,26 @@ */ #include "idx.h" +#include +#include + +FILE* emufs_idx_abrir(EMUFS* efs, const char* mode) +{ + FILE* f; + char* filename; + + filename = (char*) malloc(sizeof(char) * (strlen(efs->nombre) + + strlen(EMUFS_IDX_EXT) + 1)); + if (filename == NULL) { + /* TODO Manejo de errores */ + return NULL; + } + strcpy(filename, efs->nombre); + strcat(filename, EMUFS_IDX_EXT); + f = fopen(filename, mode); + free(filename); + return f; +} int emufs_idx_buscar_mayor_id(EMUFS *emu) { diff --git a/emufs/idx.h b/emufs/idx.h index ca509c7..cb67b69 100644 --- a/emufs/idx.h +++ b/emufs/idx.h @@ -47,6 +47,8 @@ typedef struct emufs_idx_t { long int id_reg; } EMUFS_IDX; +FILE* emufs_idx_abrir(EMUFS*, const char*); + int emufs_idx_buscar_mayor_id(EMUFS *); int emufs_idx_buscar_registro(EMUFS *, int); -- 2.43.0 From a73a4c8cb85f03d9863db77f85adb4db42a91286 Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Fri, 9 Apr 2004 20:31:36 +0000 Subject: [PATCH 04/16] * Limpio el codigo de tipo3 * borrar_registro esta muerta por ahora, despues la completo. * Cosas raras en la GUI, al ejecutar me tira un excepcion de punto flotante!! --- emufs/fsc.c | 5 +-- emufs/idx.c | 10 +++--- emufs/tipo3.c | 77 ++++++++----------------------------------- emufs/tipo3_main.c | 5 +-- emufs_gui/articulos.c | 31 +++++++++-------- emufs_gui/articulos.h | 1 - emufs_gui/form.h | 2 -- emufs_gui/gui.c | 7 ++-- 8 files changed, 47 insertions(+), 91 deletions(-) diff --git a/emufs/fsc.c b/emufs/fsc.c index 0a5ba22..692d6d1 100644 --- a/emufs/fsc.c +++ b/emufs/fsc.c @@ -101,9 +101,9 @@ int emufs_fsc_buscar_lugar(EMUFS *emu, unsigned long tam, int *fs) *fs = emu->tam_bloque; while( !feof(f_fsc) ){ if (fread(®,sizeof(EMUFS_FSC),1,f_fsc) != 1) continue; - if ( reg.free_space >= tam+sizeof(int)) + if (reg.free_space >= tam) { break; - else { + } else { reg.block = -1; *fs = emu->tam_bloque; } @@ -135,3 +135,4 @@ int emufs_fsc_get_fs(EMUFS *emu, int num_bloque) fclose(f_fsc); return reg.free_space; } + diff --git a/emufs/idx.c b/emufs/idx.c index be142f7..cfb798e 100644 --- a/emufs/idx.c +++ b/emufs/idx.c @@ -90,16 +90,17 @@ int emufs_idx_buscar_registro(EMUFS *emu, int ID) strcat(name_f_idx, EMUFS_IDX_EXT); if ( (f_idx = fopen(name_f_idx,"r")) == NULL) return -1; /*ERROR*/ + reg.id_reg = -1; + reg.block = -1; while ( !feof(f_idx) ){ if (fread(®,sizeof(EMUFS_IDX),1,f_idx) != 1) continue; if ( reg.id_reg == ID ){ - fclose(f_idx); - return reg.block; + break; } } fclose(f_idx); - return -1; /*no existe el registro*/ + return reg.block; } /* agrega un registro al final del archivo */ @@ -112,7 +113,7 @@ int emufs_idx_agregar(EMUFS *emu, int num_bloque, int ID_aux) strcpy(name_f_idx,emu->nombre); strcat(name_f_idx, EMUFS_IDX_EXT); - if ( (f_idx = fopen(name_f_idx,"ab+"))==NULL ) return -1; + if ( (f_idx = fopen(name_f_idx,"a+"))==NULL ) return -1; reg.block = num_bloque; reg.id_reg = ID_aux; @@ -120,3 +121,4 @@ int emufs_idx_agregar(EMUFS *emu, int num_bloque, int ID_aux) fclose(f_idx); return 0; } + diff --git a/emufs/tipo3.c b/emufs/tipo3.c index ac3e7ee..e758226 100644 --- a/emufs/tipo3.c +++ b/emufs/tipo3.c @@ -40,19 +40,10 @@ /** Leo un registro del archivo, devuelve cero si no lo encuentra.**/ int emufs_tipo3_leer_registro(EMUFS *emu, int ID, void *ptr, unsigned long tam_reg) { - FILE* f_block_reg; char* bloque; - char name_f_block_reg[255]; int block, ID_aux; int iterador = 0; - strcpy(name_f_block_reg,emu->nombre); - strcat(name_f_block_reg,".idx"); - - - if ( (f_block_reg = fopen(name_f_block_reg,"a+")) == NULL ) - return -1; /*ERROR*/ - /*si existe, lo busco en el archivo de bloques*/ block = emufs_idx_buscar_registro(emu,ID); /*me devuelve el nro de bloque al que pertenece el registro*/ bloque = (char*)malloc(emu->tam_bloque); @@ -79,7 +70,6 @@ int emufs_tipo3_leer_registro(EMUFS *emu, int ID, void *ptr, unsigned long tam_r iterador += tam_reg; } - fclose(f_block_reg); free(bloque); return 0; } @@ -113,12 +103,11 @@ int emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, unsigned long tam) strcpy(name_f,emu->nombre); strcat(name_f,".dat"); - 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 = emufs_fsc_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) { + if ( (file = fopen(name_f,"a+"))==NULL ) return -1; /*ERROR*/ /*crear un nuevo bloque en memoria */ bloque = (char*)malloc(emu->tam_bloque); /* grabar el registro al principio del bloque */ @@ -129,7 +118,7 @@ int emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, unsigned long tam) /*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*/ @@ -147,7 +136,7 @@ int emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, unsigned long tam) } } else { /*cargo el bloque en "bloque"*/ - bloque = (char*)malloc(emu->tam_bloque); + bloque = (char*)malloc(emu->tam_bloque); if ( emufs_tipo3_leer_bloque(emu,num_bloque,bloque)== -1) { printf("Error: no se pudo leer bloque\n"); return -1; @@ -202,8 +191,9 @@ int emufs_tipo3_grabar_bloque(EMUFS *emu, void *ptr, int num) strcat(name_f,".dat"); if ( (file = fopen(name_f,"r+"))==NULL ) return -1; /*ERROR*/ - fseek(file,sizeof(char)+sizeof(int)*2,SEEK_SET); - fseek(file,num*emu->tam_bloque,SEEK_CUR); + /* Salto el header del archivo */ + fseek(file, sizeof(char)+sizeof(int)*2, SEEK_SET); + fseek(file, num*emu->tam_bloque, SEEK_CUR); fwrite(ptr, emu->tam_bloque, 1, file); fclose(file); @@ -213,20 +203,12 @@ int emufs_tipo3_grabar_bloque(EMUFS *emu, void *ptr, int num) /*borra un registro de un bloque y acomoda los registros que quedan*/ int emufs_tipo3_borrar_registro(EMUFS *emu, int ID, int tam_reg) { - int num_bloque, ptr_elim, ptr_mov, ID_aux, cant, i, fs; - long size; + int num_bloque, ptr_elim, ptr_mov, ID_aux, fs; char *bloque; - FILE *f_block_reg; - BLOCK_REG_T reg_b; - BLOCK_REG_T buffer[10]; - char name_f_block_reg[255]; - - strcpy(name_f_block_reg,emu->nombre); - strcat(name_f_block_reg,".idx"); num_bloque = emufs_idx_buscar_registro(emu, ID); bloque = (char*)malloc(emu->tam_bloque); - if ( emufs_tipo3_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; } @@ -264,51 +246,18 @@ int emufs_tipo3_borrar_registro(EMUFS *emu, int ID, int tam_reg) /*actualizo archivo .idx*/ /*busco el registro que tengo que eliminar*/ - if ( (f_block_reg = fopen(name_f_block_reg,"r+")) == NULL ) return -1; + /* GAZER VER */ +/* if ( (f_block_reg = fopen(name_f_block_reg,"r+")) == NULL ) return -1; while ( !feof(f_block_reg) ){ if ( fread(®_b,sizeof(BLOCK_REG_T),1,f_block_reg) != 1 ) continue; if ( reg_b.id_reg == ID ) break; - } - fseek(f_block_reg, -sizeof(BLOCK_REG_T), SEEK_CUR); + }*/ +/* fseek(f_block_reg, -sizeof(BLOCK_REG_T), SEEK_CUR);*/ /* Estoy parado sobre el punto id/registro que debo borrar */ - printf("registro borrado= %ld en bloque = %d\n",reg_b.id_reg,reg_b.block); /*justifico en archivo a la izquieda*/ - /* GAZER : aca hago una prueba */ - { - long final, actual; - actual = ftell(f_block_reg); /* Guardo la posicion actual */ - fseek(f_block_reg, 0, SEEK_END); /* me voy al final */ - final = ftell(f_block_reg); /* veo cuando ocupa el archivo */ - fseek(f_block_reg, actual, SEEK_SET); /* vuelvo al lugar desde donde quiero justificar */ - - cant = (final-actual)/sizeof(BLOCK_REG_T); - for(i=0; iborrar_registro(fp, n4, 100); + /*fp->borrar_registro(fp, n4, 100); fp->borrar_registro(fp, n2, 100); - fp->borrar_registro(fp, n6, 100); + fp->borrar_registro(fp, n6, 100);*/ n8 = fp->grabar_registro(fp, i, 100); + printf("Grabe Ok\n"); fp->leer_registro(fp, n8, b, 100); printf("Recuperado : %s\n", b); diff --git a/emufs_gui/articulos.c b/emufs_gui/articulos.c index 2751be3..6226225 100644 --- a/emufs_gui/articulos.c +++ b/emufs_gui/articulos.c @@ -10,14 +10,10 @@ t_LstArticulos *art_cargar(const char *filename) xmlDocPtr document; xmlNode *node, *inicio; int cant; - t_Articulo art; - t_LstArticulos *tmp = (t_LstArticulos *)malloc(sizeof(t_LstArticulos)); - if (tmp == NULL) return NULL; document = xmlReadFile(filename, "ISO-8859-1",0); if (document == NULL) { - free(tmp); return NULL; } @@ -43,10 +39,13 @@ t_LstArticulos *art_cargar(const char *filename) } } } + t_LstArticulos *tmp = (t_LstArticulos *)malloc(sizeof(t_LstArticulos)); + if (tmp == NULL) return NULL; tmp->cant = cant; tmp->array = (t_Reg_Articulo *)malloc(sizeof(t_Reg_Articulo)*cant); if (tmp->array == NULL) { + printf("Fallo malloc\n"); xmlFreeDoc(document); xmlCleanupParser(); free(tmp); @@ -56,25 +55,27 @@ t_LstArticulos *art_cargar(const char *filename) /* leo los datos y los guardo en el archivo*/ cant = 0; /* FIXME : por ahora hago que entren 2 bloques y me sobre algo de espacio*/ - tmp->fp = emufs_crear("articulos", T3, sizeof(t_Articulo)*2+50, sizeof(t_Articulo)); + tmp->fp = emufs_crear("articulos", T3, sizeof(t_Articulo)*2, sizeof(t_Articulo)); for (node=inicio ; node ; node = node->next) { if (node->type == XML_ELEMENT_NODE) { if (strcmp(node->name, "ARTICULO") == 0) { - art.numero = atoi(xmlGetProp(node, "NroArtículo")); - strncpy(art.desc, xmlGetProp(node, "Descripción"), 50); + t_Articulo art; + /* art.numero = atoi(xmlGetProp(node, "NroArtículo"));*/ + /* strncpy(art.desc, xmlGetProp(node, "Descripción"), 50); strncpy(art.presentacion, xmlGetProp(node, "Presentación"), 30); - strncpy(art.existencia, xmlGetProp(node, "Existencia"), 8); -// / strncpy(tmp->array[cant].ubicacion, xmlGetProp(node, "Ubicacion"), 30); + strncpy(art.existencia, xmlGetProp(node, "Existencia"), 8);*/ + /* strncpy(tmp->array[cant].ubicacion, xmlGetProp(node, "Ubicacion"), 30);*/ strncpy(art.pvu, xmlGetProp(node, "PVU"), 8); - strncpy(art.emin, xmlGetProp(node, "Emín"), 8); + /* strncpy(art.emin, xmlGetProp(node, "Emín"), 8); */ /* Ya leido el articulo ahora paso a guardarlo en el archivo y agregarlo a la lista */ - tmp->array[cant].numero = art.numero; tmp->array[cant].num_reg = tmp->fp->grabar_registro(tmp->fp, &art, sizeof(t_Articulo)); /* REGISTRO CTE! */ + tmp->array[cant].numero = art.numero; ++cant; } } } + printf("1\n"); xmlFreeDoc(document); xmlCleanupParser(); @@ -99,7 +100,7 @@ int art_liberar(t_LstArticulos *l) t_Articulo *art_obtener(t_LstArticulos *lst, const char *numero) { /* FIXME : NO ME GUSTA :-/ */ - static t_Articulo art; + t_Articulo *art; int i; int n = atoi(numero); @@ -107,9 +108,10 @@ t_Articulo *art_obtener(t_LstArticulos *lst, const char *numero) for(i=0; icant; i++) { if (n == lst->array[i].numero) { + art = (t_Articulo *)malloc(sizeof(t_Articulo)); /* Ya se cual tengo que retornar. Ahora veo si lo cargo desde el archivo */ - lst->fp->leer_registro(lst->fp, lst->array[i].num_reg, &art, sizeof(t_Articulo)); - return &art; + lst->fp->leer_registro(lst->fp, lst->array[i].num_reg, art, sizeof(t_Articulo)); + return art; } } @@ -157,6 +159,7 @@ void art_modificar(char *s) /* TODO : Actualizar registro */ form_destruir(form); + free(articulo); } werase(win); diff --git a/emufs_gui/articulos.h b/emufs_gui/articulos.h index 5ac8ce0..2ea23ca 100644 --- a/emufs_gui/articulos.h +++ b/emufs_gui/articulos.h @@ -6,7 +6,6 @@ #include #include #include -#include "malloc_debug.h" #include "form.h" #include "emufs.h" diff --git a/emufs_gui/form.h b/emufs_gui/form.h index 8316e85..be9da37 100644 --- a/emufs_gui/form.h +++ b/emufs_gui/form.h @@ -7,8 +7,6 @@ #include #include -#include "malloc_debug.h" - /** Tipos de Widgets válidos */ typedef enum {INPUT, RADIO} t_Campo; diff --git a/emufs_gui/gui.c b/emufs_gui/gui.c index 22475cd..3727e40 100644 --- a/emufs_gui/gui.c +++ b/emufs_gui/gui.c @@ -25,6 +25,11 @@ int main(int argc, char *argv[]) return 1; } + art_cargar(argv[1]); + + art_liberar(NULL); + return 1; + /* Inicio Curses */ signal(SIGINT, finish); initscr(); @@ -84,8 +89,6 @@ int main(int argc, char *argv[]) art_liberar(NULL); - - MD_Listar(); return 0; } -- 2.43.0 From e47297a011fb5230c79464af7cd72e78b266fc48 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Nicol=C3=A1s=20Dimov?= Date: Fri, 9 Apr 2004 20:57:50 +0000 Subject: [PATCH 05/16] un picolo cambio --- emufs/emufs.h | 4 ++-- emufs/idx.c | 2 +- emufs/tipo3.c | 2 +- emufs/tipo3.h | 21 +++++++++++++-------- emufs/tipo3_main.c | 1 + 5 files changed, 18 insertions(+), 12 deletions(-) diff --git a/emufs/emufs.h b/emufs/emufs.h index 7cc89e0..0e469a9 100644 --- a/emufs/emufs.h +++ b/emufs/emufs.h @@ -24,7 +24,7 @@ * Leandro Lucarella *---------------------------------------------------------------------------- * - * $Id: command.cpp 220 2003-11-19 23:10:40Z luca $ + * $Id$ * */ @@ -74,7 +74,7 @@ typedef struct _emu_fs_t { int (*leer_bloque)(struct _emu_fs_t *, int, void *); /**< Método para leer un bloque */ int (*leer_registro)(struct _emu_fs_t *, int, void *, unsigned long); /**< Método para leer un registro */ int (*grabar_registro)(struct _emu_fs_t *, void *, unsigned long ); /**< Método para grabar un registro */ - int (*borrar_registro)(struct _emu_fs_t *, int, int); /**< Método para borrar un registro */ + int (*borrar_registro)(struct _emu_fs_t *, int, unsigned long ); /**< Método para borrar un registro */ char *nombre; /**< Nombre del archivo */ } EMUFS; diff --git a/emufs/idx.c b/emufs/idx.c index cfb798e..ea97102 100644 --- a/emufs/idx.c +++ b/emufs/idx.c @@ -80,7 +80,7 @@ int emufs_idx_buscar_mayor_id(EMUFS *emu) return id; } -/*busca el registro ID en el archivo "block_reg.dat" y devuelve el nro de bloque en el que se encuentra*/ +/*busca el registro ID en el archivo ".idx" y devuelve el nro de bloque en el que se encuentra*/ int emufs_idx_buscar_registro(EMUFS *emu, int ID) { FILE* f_idx; diff --git a/emufs/tipo3.c b/emufs/tipo3.c index e758226..05d8bad 100644 --- a/emufs/tipo3.c +++ b/emufs/tipo3.c @@ -201,7 +201,7 @@ int emufs_tipo3_grabar_bloque(EMUFS *emu, void *ptr, int num) } /*borra un registro de un bloque y acomoda los registros que quedan*/ -int emufs_tipo3_borrar_registro(EMUFS *emu, int ID, int tam_reg) +int emufs_tipo3_borrar_registro(EMUFS *emu, int ID, unsigned long tam_reg) { int num_bloque, ptr_elim, ptr_mov, ID_aux, fs; char *bloque; diff --git a/emufs/tipo3.h b/emufs/tipo3.h index 9b64976..ad84d81 100644 --- a/emufs/tipo3.h +++ b/emufs/tipo3.h @@ -47,21 +47,26 @@ #include "idx.h" #include "fsc.h" -int emufs_tipo3_leer_registro(EMUFS *, int , void *, unsigned long); -int emufs_tipo3_leer_bloque(EMUFS *, int , void *); +/** Lee el registro \param id_reg y lo almacena en \param ptr */ +int emufs_tipo3_leer_registro(EMUFS *emu, int id_reg, void *ptr, unsigned long tam_reg); -int emufs_tipo3_grabar_registro(EMUFS *, void *, unsigned long ); +/** Lee el bloque \param num_bloque y lo almacena en \param ptr */ +int emufs_tipo3_leer_bloque(EMUFS *emu, int num_bloque, void *ptr); -int emufs_tipo3_grabar_bloque(EMUFS *, void *, int); +/** Graba el registro apuntado por \param ptr en el archivo */ +int emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, unsigned long tam_reg); -int emufs_tipo3_get_id(EMUFS *); +/** Graba el bloque apuntado por \param ptr en el archivo */ +int emufs_tipo3_grabar_bloque(EMUFS *emu, void *ptr, int num_bloque); -int emufs_tipo3_buscar_registro(EMUFS *, int); +int emufs_tipo3_get_id(EMUFS *emu); -int emufs_tipo3_buscar_lugar(EMUFS *, unsigned long , int *); +int emufs_tipo3_buscar_registro(EMUFS *emu, int id_reg); -int emufs_tipo3_borrar_registro(EMUFS*, int, int); +int emufs_tipo3_buscar_lugar(EMUFS *emu, unsigned long tam_reg, int *free_space); + +int emufs_tipo3_borrar_registro(EMUFS *emu, int id_reg, unsigned long tam_reg); #endif /* _EMUFS_TIPO3_H_ */ diff --git a/emufs/tipo3_main.c b/emufs/tipo3_main.c index c5e1883..cdde077 100644 --- a/emufs/tipo3_main.c +++ b/emufs/tipo3_main.c @@ -36,6 +36,7 @@ #include #include "emufs.h" + int main(int argc, char *argv[]) { EMUFS *fp; -- 2.43.0 From e0b2f02fb7880eb26e4fc28e85253dc56b6c6aab Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Fri, 9 Apr 2004 21:05:39 +0000 Subject: [PATCH 06/16] * Ahi la GUI carga bien y no se producen los problemas de memoria. Para resolverlo tuve que poner el campo array de t_LstArticulos estatico (100 elementos), asi que tengo que ver que es lo que hace que cuando uso malloc se caga todo. --- emufs_gui/articulos.c | 20 ++++++++++++-------- emufs_gui/articulos.h | 2 +- emufs_gui/gui.c | 5 ----- 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/emufs_gui/articulos.c b/emufs_gui/articulos.c index 6226225..6e6f950 100644 --- a/emufs_gui/articulos.c +++ b/emufs_gui/articulos.c @@ -10,6 +10,7 @@ t_LstArticulos *art_cargar(const char *filename) xmlDocPtr document; xmlNode *node, *inicio; int cant; + lst_articulos = NULL; document = xmlReadFile(filename, "ISO-8859-1",0); @@ -40,9 +41,11 @@ t_LstArticulos *art_cargar(const char *filename) } } t_LstArticulos *tmp = (t_LstArticulos *)malloc(sizeof(t_LstArticulos)); + printf("%p\n", tmp); if (tmp == NULL) return NULL; tmp->cant = cant; - tmp->array = (t_Reg_Articulo *)malloc(sizeof(t_Reg_Articulo)*cant); +/* tmp->array = (t_Reg_Articulo *)malloc(sizeof(t_Reg_Articulo)*tmp->cant);*/ + printf("%p\n", tmp->array); if (tmp->array == NULL) { printf("Fallo malloc\n"); @@ -60,22 +63,23 @@ t_LstArticulos *art_cargar(const char *filename) if (node->type == XML_ELEMENT_NODE) { if (strcmp(node->name, "ARTICULO") == 0) { t_Articulo art; - /* art.numero = atoi(xmlGetProp(node, "NroArtículo"));*/ - /* strncpy(art.desc, xmlGetProp(node, "Descripción"), 50); + art.numero = 1; atoi(xmlGetProp(node, "NroArtículo")); + strncpy(art.desc, xmlGetProp(node, "Descripción"), 50); strncpy(art.presentacion, xmlGetProp(node, "Presentación"), 30); - strncpy(art.existencia, xmlGetProp(node, "Existencia"), 8);*/ - /* strncpy(tmp->array[cant].ubicacion, xmlGetProp(node, "Ubicacion"), 30);*/ + strncpy(art.existencia, xmlGetProp(node, "Existencia"), 8); + /*strncpy(tmp->array[cant].ubicacion, xmlGetProp(node, "Ubicacion"), 30);*/ strncpy(art.pvu, xmlGetProp(node, "PVU"), 8); - /* strncpy(art.emin, xmlGetProp(node, "Emín"), 8); */ + strncpy(art.emin, xmlGetProp(node, "Emín"), 8); /* Ya leido el articulo ahora paso a guardarlo en el archivo y agregarlo a la lista */ - tmp->array[cant].num_reg = tmp->fp->grabar_registro(tmp->fp, &art, sizeof(t_Articulo)); /* REGISTRO CTE! */ + tmp->array[cant].num_reg = tmp->fp->grabar_registro(tmp->fp, &art, sizeof(t_Articulo)); tmp->array[cant].numero = art.numero; + printf("tmp->arra[%d].numero = 1\n", cant); ++cant; } } } - printf("1\n"); + printf("%d\n", cant); xmlFreeDoc(document); xmlCleanupParser(); diff --git a/emufs_gui/articulos.h b/emufs_gui/articulos.h index 2ea23ca..da3a3d5 100644 --- a/emufs_gui/articulos.h +++ b/emufs_gui/articulos.h @@ -40,7 +40,7 @@ typedef struct _reg_articulo_ { } t_Reg_Articulo; typedef struct _lista_articulos_ { - t_Reg_Articulo *array; + t_Reg_Articulo array[100]; unsigned int cant; EMUFS *fp; /* Filepointer al archivo donde estan los datos */ } t_LstArticulos; diff --git a/emufs_gui/gui.c b/emufs_gui/gui.c index 3727e40..eae06e4 100644 --- a/emufs_gui/gui.c +++ b/emufs_gui/gui.c @@ -25,11 +25,6 @@ int main(int argc, char *argv[]) return 1; } - art_cargar(argv[1]); - - art_liberar(NULL); - return 1; - /* Inicio Curses */ signal(SIGINT, finish); initscr(); -- 2.43.0 From 6dbdcda18bbe3ad978b4d531eaf83d350dc7ad7c Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Fri, 9 Apr 2004 21:16:46 +0000 Subject: [PATCH 07/16] * Faltaban un par de cosas y ahora el GUI recupera con exito desde el archivo. --- emufs_gui/articulos.c | 5 +++-- emufs_gui/gui.c | 7 +++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/emufs_gui/articulos.c b/emufs_gui/articulos.c index 6e6f950..8719bb5 100644 --- a/emufs_gui/articulos.c +++ b/emufs_gui/articulos.c @@ -63,7 +63,7 @@ t_LstArticulos *art_cargar(const char *filename) if (node->type == XML_ELEMENT_NODE) { if (strcmp(node->name, "ARTICULO") == 0) { t_Articulo art; - art.numero = 1; atoi(xmlGetProp(node, "NroArtículo")); + art.numero = atoi(xmlGetProp(node, "NroArtículo")); strncpy(art.desc, xmlGetProp(node, "Descripción"), 50); strncpy(art.presentacion, xmlGetProp(node, "Presentación"), 30); strncpy(art.existencia, xmlGetProp(node, "Existencia"), 8); @@ -74,11 +74,12 @@ t_LstArticulos *art_cargar(const char *filename) /* Ya leido el articulo ahora paso a guardarlo en el archivo y agregarlo a la lista */ tmp->array[cant].num_reg = tmp->fp->grabar_registro(tmp->fp, &art, sizeof(t_Articulo)); tmp->array[cant].numero = art.numero; - printf("tmp->arra[%d].numero = 1\n", cant); + printf("ID(%d) -> (%d,%d)\n", cant, art.numero, tmp->array[cant].num_reg); ++cant; } } } + tmp->cant = cant; printf("%d\n", cant); xmlFreeDoc(document); xmlCleanupParser(); diff --git a/emufs_gui/gui.c b/emufs_gui/gui.c index eae06e4..f6c2ece 100644 --- a/emufs_gui/gui.c +++ b/emufs_gui/gui.c @@ -25,6 +25,13 @@ int main(int argc, char *argv[]) return 1; } +/* art_cargar(argv[1]); + + art_obtener(NULL, "438"); + + art_liberar(NULL); + return 1; +*/ /* Inicio Curses */ signal(SIGINT, finish); initscr(); -- 2.43.0 From 6fefa3f2c58e5b3e604e1c2c896a9e7d7fde6b9c Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Fri, 9 Apr 2004 21:35:34 +0000 Subject: [PATCH 08/16] * Ahora los registros que se dan de alta desde la GUI son guardados en el archivo! --- emufs_gui/articulos.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/emufs_gui/articulos.c b/emufs_gui/articulos.c index 8719bb5..f6f4fed 100644 --- a/emufs_gui/articulos.c +++ b/emufs_gui/articulos.c @@ -74,7 +74,6 @@ t_LstArticulos *art_cargar(const char *filename) /* Ya leido el articulo ahora paso a guardarlo en el archivo y agregarlo a la lista */ tmp->array[cant].num_reg = tmp->fp->grabar_registro(tmp->fp, &art, sizeof(t_Articulo)); tmp->array[cant].numero = art.numero; - printf("ID(%d) -> (%d,%d)\n", cant, art.numero, tmp->array[cant].num_reg); ++cant; } } @@ -202,6 +201,7 @@ void art_agregar(char *s) { WINDOW *win; t_Form *form; + t_Articulo art; win = newwin(8, 68, 13, 1); box(win, 0, 0); @@ -216,8 +216,19 @@ void art_agregar(char *s) form_agregar_widget(form, INPUT, "Stock Mínimo", 8, ""); form_ejecutar(form, 1,1); - /* TODO : Agregar el nuevo elemento */ + art.numero = atoi(form_obtener_valor_char(form, "Numero de Artículo")); + strcpy(art.desc, form_obtener_valor_char(form, "Descripción")); + strcpy(art.presentacion, form_obtener_valor_char(form, "Presentación")); + strcpy(art.existencia, form_obtener_valor_char(form, "Stock Actual")); + /*strncpy(tmp->array[cant].ubicacion, xmlGetProp(node, "Ubicacion"), 30);*/ + strcpy(art.pvu, form_obtener_valor_char(form, "PVU")); + strcpy(art.emin, form_obtener_valor_char(form, "Stock Mínimo")); + /* Ya leido el articulo ahora paso a guardarlo en el archivo y agregarlo a la lista */ + lst_articulos->array[lst_articulos->cant].num_reg = lst_articulos->fp->grabar_registro(lst_articulos->fp, &art, sizeof(t_Articulo)); + lst_articulos->array[lst_articulos->cant].numero = art.numero; + lst_articulos->cant++; + form_destruir(form); werase(win); -- 2.43.0 From ee8568afe20289bebd04904350c3f2563fc90e4a Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Fri, 9 Apr 2004 22:46:48 +0000 Subject: [PATCH 09/16] =?utf8?q?-=20Se=20agrega=20svn:ignore=20para=20que?= =?utf8?q?=20no=20salga=20la=20libemufs.a=20en=20el=20svn=20st.=20-=20Prim?= =?utf8?q?er=20intento=20de=20tipo1;=20solo=20implementa=20leer=5Fregistro?= =?utf8?q?=20(y=20no=20esta=20probado).=20-=20Se=20generaliza=20emufs=5Fcr?= =?utf8?q?ear()=20y=20se=20le=20agrega=20soporte=20para=20tipo1=20(falta?= =?utf8?q?=20probar).=20-=20Se=20agrega=20emufs=5Fcrear=5Farchivo=5Fauxili?= =?utf8?q?ar().=20-=20Se=20agregan=20los=20emufs=5Fxxx=5Fcrear()=20para=20?= =?utf8?q?crear=20archivos=20auxiliares=20espec=C3=ADficos.=20-=20Se=20act?= =?utf8?q?ualiza=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 From 38e8783579e4b158b1fced1caec93e16ae05afc4 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Nicol=C3=A1s=20Dimov?= Date: Fri, 9 Apr 2004 23:10:50 +0000 Subject: [PATCH 10/16] no encuentro el error, el archivo idx en vez de achicarse crece.... fijense si lo desculan --- emufs/emufs.c | 1 + emufs/idx.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++ emufs/idx.h | 3 +++ emufs/tipo3.c | 4 ++++ emufs/tipo3_main.c | 12 +++++------ 5 files changed, 65 insertions(+), 6 deletions(-) diff --git a/emufs/emufs.c b/emufs/emufs.c index 0c529ed..a6a774c 100644 --- a/emufs/emufs.c +++ b/emufs/emufs.c @@ -245,6 +245,7 @@ int ver_archivo_FS(EMUFS *emu) fclose(f_block_free); /* Imprimo la lista de bloques/registros */ + printf("BLOQUES Y REGISTROS\n"); strcpy(name_f_block_free,emu->nombre); strcat(name_f_block_free,".idx"); { diff --git a/emufs/idx.c b/emufs/idx.c index cc88257..56fa4fc 100644 --- a/emufs/idx.c +++ b/emufs/idx.c @@ -128,3 +128,54 @@ int emufs_idx_agregar(EMUFS *emu, int num_bloque, int ID_aux) return 0; } +int emufs_idx_borrar(EMUFS *emu, int ID) +{ + FILE *f_idx; + EMUFS_IDX reg, buffer; + char name_f_idx[255]; + long actual, final, cant, i, tam; + + strcpy(name_f_idx,emu->nombre); + strcat(name_f_idx, EMUFS_IDX_EXT); + + if ( (f_idx = fopen(name_f_idx,"a+"))==NULL ) return -1; + + while ( !feof(f_idx) ){ + /*busco cual tengo que borrar*/ + if ( fread(®, sizeof(EMUFS_IDX), 1, f_idx) != 1 ) continue; + if ( reg.id_reg == ID ) + break; + } + + /* me paro en el que tengo que borrar */ + actual = fseek(f_idx, -sizeof(EMUFS_IDX), SEEK_CUR); + /*actual = ftell(f_idx); /* Guardo la posicion actual */ + printf("ACTUAL = %ld\n", actual/sizeof(EMUFS_IDX)); + fseek(f_idx, 0, SEEK_END); /* me voy al final */ + final = ftell(f_idx); /* veo cuando ocupa el archivo */ + printf("tamanio del archivo de bloques y registros = %d\n", final/sizeof(EMUFS_IDX)); + fseek(f_idx, actual, SEEK_SET); /* vuelvo al lugar desde donde quiero justificar */ + + cant = (final-actual)/sizeof(EMUFS_IDX); + printf("cant = %d\n", cant); + for(i=0; i +#include #include "emufs.h" #define EMUFS_IDX_EXT ".idx" @@ -58,4 +59,6 @@ int emufs_idx_buscar_registro(EMUFS *, int); int emufs_idx_agregar(EMUFS *, int , int); +int emufs_idx_borrar(EMUFS *emu, int ID); + #endif /* _EMUFS_IDX_H */ diff --git a/emufs/tipo3.c b/emufs/tipo3.c index 05d8bad..5ba6af2 100644 --- a/emufs/tipo3.c +++ b/emufs/tipo3.c @@ -245,6 +245,10 @@ int emufs_tipo3_borrar_registro(EMUFS *emu, int ID, unsigned long tam_reg) if ( emufs_did_agregar(emu, ID) != 0 ) return -1; /*actualizo archivo .idx*/ + + if ( emufs_idx_borrar(emu, ID) != 0 ) return -1; + + /*busco el registro que tengo que eliminar*/ /* GAZER VER */ /* if ( (f_block_reg = fopen(name_f_block_reg,"r+")) == NULL ) return -1; diff --git a/emufs/tipo3_main.c b/emufs/tipo3_main.c index cdde077..559a3c9 100644 --- a/emufs/tipo3_main.c +++ b/emufs/tipo3_main.c @@ -74,12 +74,12 @@ int main(int argc, char *argv[]) n1 = fp->grabar_registro(fp, a, 100); n2 = fp->grabar_registro(fp, c, 100); - n3 = fp->grabar_registro(fp, d, 100); + /*n3 = fp->grabar_registro(fp, d, 100); n4 = fp->grabar_registro(fp, e, 100); n5 = fp->grabar_registro(fp, f, 100); n6 = fp->grabar_registro(fp, g, 100); n7 = fp->grabar_registro(fp, h, 100); - + n8 = fp->grabar_registro(fp, i, 100);*/ printf("ID0 = %d\n", n1); printf("ID1 = %d\n", n2); printf("ID2 = %d\n", n3); @@ -88,13 +88,13 @@ int main(int argc, char *argv[]) printf("ID5 = %d\n", n6); printf("ID6 = %d\n", n7); - +ver_archivo_FS(fp); /*fp->borrar_registro(fp, n4, 100); fp->borrar_registro(fp, n2, 100); fp->borrar_registro(fp, n6, 100);*/ - n8 = fp->grabar_registro(fp, i, 100); - printf("Grabe Ok\n"); - fp->leer_registro(fp, n8, b, 100); + fp->borrar_registro(fp, n1, 100); + printf("borre el registro de id = %d\n",n1); + fp->leer_registro(fp, n2, b, 100); printf("Recuperado : %s\n", b); -- 2.43.0 From 0a8c25d48c0fa1602556582885e33426cb2e05fa Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Sat, 10 Apr 2004 02:06:23 +0000 Subject: [PATCH 11/16] Agreguo los nuevos tipos de datos: EMUFS_REG_ID EMUFS_REG_SIZE EMUFS_BLOCK_ID EMUFS_BLOCK_SIZE EMUFS_FREE EMUFS_OFFSET /* este hay que ver si vuela y hacemos un mismo tipo para BLOCK y OFFSET */ En tipo3 hay cosas no convertidas porque no estaba seguro de que tipo de dato tenia que guardar (nico por favor mira los sizeof(int) o similares). Agrego un test del tipo1 que no anda. --- emufs/Makefile | 4 ++- emufs/did.c | 4 +-- emufs/did.h | 4 +-- emufs/emufs.c | 74 +++++++++++++++++++++++++++----------------- emufs/emufs.h | 46 +++++++++++++++++++-------- emufs/fsc.c | 8 ++--- emufs/fsc.h | 8 ++--- emufs/idx.c | 10 +++--- emufs/idx.h | 8 ++--- emufs/tipo1.c | 77 ++++++++++++++++++++++++++++++++++++---------- emufs/tipo1.h | 29 ++++++++++------- emufs/tipo1_test.c | 31 +++++++++++++++++++ emufs/tipo3.c | 60 +++++++++++++++++++++--------------- emufs/tipo3.h | 21 +++++++------ 14 files changed, 260 insertions(+), 124 deletions(-) create mode 100644 emufs/tipo1_test.c diff --git a/emufs/Makefile b/emufs/Makefile index fc6b95a..5ec4767 100644 --- a/emufs/Makefile +++ b/emufs/Makefile @@ -3,7 +3,9 @@ LDFLAGS= EMUFS_COMMON=emufs.o tipo1.o tipo3.o idx.o did.o fsc.o -all: libemufs.a tipo3_main +all: libemufs.a tipo1_test tipo3_main + +tipo1_test: tipo1_test.o $(EMUFS_COMMON) tipo3_main: tipo3_main.o $(EMUFS_COMMON) diff --git a/emufs/did.c b/emufs/did.c index 407b123..8492aa7 100644 --- a/emufs/did.c +++ b/emufs/did.c @@ -45,7 +45,7 @@ int emufs_did_crear(EMUFS* efs) return emufs_crear_archivo_auxiliar(efs->nombre, EMUFS_DID_EXT); } -int emufs_did_get_last(EMUFS *emu) +EMUFS_REG_ID emufs_did_get_last(EMUFS *emu) { FILE * f_did; int id, offset; @@ -78,7 +78,7 @@ int emufs_did_get_last(EMUFS *emu) } /*agrego un elemento al archivo */ -int emufs_did_agregar(EMUFS *emu, int ID) +int emufs_did_agregar(EMUFS *emu, EMUFS_REG_ID ID) { FILE *f_did; char name_f_did[255]; diff --git a/emufs/did.h b/emufs/did.h index e79b8ce..5b71019 100644 --- a/emufs/did.h +++ b/emufs/did.h @@ -45,8 +45,8 @@ int emufs_did_crear(EMUFS*); -int emufs_did_get_last(EMUFS *); +EMUFS_REG_ID emufs_did_get_last(EMUFS *); -int emufs_did_agregar(EMUFS *, int); +int emufs_did_agregar(EMUFS *, EMUFS_REG_ID); #endif /* _EMUFS_DID_H */ diff --git a/emufs/emufs.c b/emufs/emufs.c index a6a774c..7ddd4bd 100644 --- a/emufs/emufs.c +++ b/emufs/emufs.c @@ -79,22 +79,26 @@ int emufs_crear_archivo_auxiliar(const char* name, const char* ext) } -EMUFS *emufs_crear(const char *filename, char tipo, unsigned long tam_bloque, unsigned long tam_reg) +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)); - efs->tipo = tipo; + if (efs == NULL) { + return NULL; + } + efs->tipo = tipo; efs->tam_bloque = tam_bloque; - efs->nombre = str_dup(filename); + efs->nombre = str_dup(filename); /* Abre archivo de datos. */ strcpy(name, filename); @@ -108,7 +112,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,14 +142,10 @@ 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; @@ -160,8 +160,8 @@ EMUFS *emufs_crear(const char *filename, char tipo, unsigned long tam_bloque, un 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; @@ -173,7 +173,7 @@ EMUFS *emufs_crear(const char *filename, char tipo, unsigned long tam_bloque, un EMUFS *emufs_abrir(const char *filename) { - EMUFS *tmp; + EMUFS *efs; char name[255]; char tipo; FILE *fp; @@ -184,35 +184,53 @@ 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)) { + free(efs->nombre); + free(efs); + fclose(fp); + return NULL; + } + /* FIXME no falta leer el tamaño del registro???? */ + 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; } int emufs_destruir(EMUFS *e) diff --git a/emufs/emufs.h b/emufs/emufs.h index f8a7067..cd25bb5 100644 --- a/emufs/emufs.h +++ b/emufs/emufs.h @@ -50,6 +50,24 @@ typedef enum { T3 /**< Archivo de bloque parametrizado y registro fijo. */ } EMUFS_TYPE; +/** Tipo de identificador de registro. */ +typedef unsigned long EMUFS_REG_ID; + +/** Tipo de tamaño de registro. */ +typedef unsigned long EMUFS_REG_SIZE; + +/** Tipo de identificador de bloque. */ +typedef unsigned long EMUFS_BLOCK_ID; + +/** Tipo de tamaño de bloque. */ +typedef unsigned long EMUFS_BLOCK_SIZE; + +/** Tipo de espacio libre. */ +typedef unsigned long EMUFS_FREE; + +/** Tipo de offset. */ +typedef unsigned long EMUFS_OFFSET; + /** Tipo Abstracto para menajo de archivos. * * Esta estructura es utilizada para acceder a cualquier tipo de archivo. @@ -70,11 +88,11 @@ typedef enum { */ typedef struct _emu_fs_t { EMUFS_TYPE tipo; - unsigned long tam_bloque; /**< Tamaño de bloque. 0 Si no tiene bloques */ - int (*leer_bloque)(struct _emu_fs_t *, int, void *); /**< Método para leer un bloque */ - int (*leer_registro)(struct _emu_fs_t *, int, void *, unsigned long); /**< Método para leer un registro */ - int (*grabar_registro)(struct _emu_fs_t *, void *, unsigned long ); /**< Método para grabar un registro */ - int (*borrar_registro)(struct _emu_fs_t *, int, unsigned long ); /**< Método para borrar un registro */ + EMUFS_BLOCK_SIZE tam_bloque; /**< Tamaño de bloque. 0 Si no tiene bloques */ + int (*leer_bloque)(struct _emu_fs_t*, EMUFS_BLOCK_ID, void*); /**< Método para leer un bloque */ + int (*leer_registro)(struct _emu_fs_t*, EMUFS_REG_ID, void *, EMUFS_REG_SIZE); /**< Método para leer un registro */ + EMUFS_REG_ID (*grabar_registro)(struct _emu_fs_t*, void*, EMUFS_REG_SIZE); /**< Método para grabar un registro */ + int (*borrar_registro)(struct _emu_fs_t*, EMUFS_REG_ID, unsigned long ); /**< Método para borrar un registro */ /* XXX QUE CATSO ES EL unsigned long ??? */ char *nombre; /**< Nombre del archivo */ } EMUFS; @@ -83,27 +101,31 @@ 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. - * Un archivo principal con extensión .dat y 3 archivos auxiliares para manejo interno. + * Un archivo EMUFS está compuesto por 4 archivos a nivel del SO. + * Un archivo principal con extensión .dat y 3 archivos auxiliares para + * manejo interno. * - * El parámetro filename que recive esta función en el nombre virtual que se utilizará, ya - * que las extensiones serán puestas automáticamente for EMUFS. + * El parámetro filename que recive esta función en el nombre virtual que se + * utilizará, ya que las extensiones serán puestas automáticamente for EMUFS. * * Un ejemplo: * \code * EMUFS *fp emufs_crear("archivo", T3, 100, 100); * \endcode * - * En el ejemplo anterior se tiene que nuestro filesystem virtual se llamará archivo. + * En el ejemplo anterior se tiene que nuestro filesystem virtual se llamará + * archivo. * - * Los últimos 2 parámetros serán ignorados si el tipo de archivo no utiliza dicho parámetro. + * Los últimos 2 parámetros serán ignorados si el tipo de archivo no utiliza + * dicho parámetro. * * \param filename Nombre del archivo virtual. * \param tipo Tipo de archivo. * \param tam_bloque Tamaño del bloque. * \param tam_reg Tamaño del registro. */ -EMUFS *emufs_crear(const char *filename, char tipo, unsigned long tam_bloque, unsigned long tam_reg); +EMUFS *emufs_crear(const char *filename, EMUFS_TYPE tipo, + EMUFS_BLOCK_SIZE tam_bloque, EMUFS_REG_SIZE tam_reg); /** Abre un archivo EMUFS. * diff --git a/emufs/fsc.c b/emufs/fsc.c index b67ce36..05218a6 100644 --- a/emufs/fsc.c +++ b/emufs/fsc.c @@ -44,7 +44,7 @@ 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) +int emufs_fsc_agregar(EMUFS *emu, EMUFS_BLOCK_ID num_bloque, EMUFS_FREE fs) { FILE *f_fsc; EMUFS_FSC reg; @@ -64,7 +64,7 @@ int emufs_fsc_agregar(EMUFS *emu, int num_bloque, int fs) } /* busca el bloque y le resta fs de espacio libre */ -int emufs_fsc_actualizar(EMUFS *emu, int num_bloque, int fs) +int emufs_fsc_actualizar(EMUFS *emu, EMUFS_BLOCK_ID num_bloque, EMUFS_FREE fs) { FILE *f_fsc; EMUFS_FSC reg; @@ -89,7 +89,7 @@ int emufs_fsc_actualizar(EMUFS *emu, int num_bloque, int fs) } /* me devuelve el ID del bloque donde quepa un registro, y guarda en fs el espacio libre que queda en el bloque */ -int emufs_fsc_buscar_lugar(EMUFS *emu, unsigned long tam, int *fs) +EMUFS_BLOCK_ID emufs_fsc_buscar_lugar(EMUFS *emu, EMUFS_FREE tam, EMUFS_FREE *fs) { FILE *f_fsc; EMUFS_FSC reg; @@ -121,7 +121,7 @@ int emufs_fsc_buscar_lugar(EMUFS *emu, unsigned long tam, int *fs) return reg.block; } -int emufs_fsc_get_fs(EMUFS *emu, int num_bloque) +EMUFS_FREE emufs_fsc_get_fs(EMUFS *emu, EMUFS_BLOCK_ID num_bloque) { FILE *f_fsc; EMUFS_FSC reg; diff --git a/emufs/fsc.h b/emufs/fsc.h index 9e44692..01a72f1 100644 --- a/emufs/fsc.h +++ b/emufs/fsc.h @@ -49,12 +49,12 @@ typedef struct emufs_fsc_t { int emufs_fsc_crear(EMUFS*); -int emufs_fsc_agregar(EMUFS *, int, int); +int emufs_fsc_agregar(EMUFS *, EMUFS_BLOCK_ID, EMUFS_FREE); -int emufs_fsc_actualizar(EMUFS *, int, int); +int emufs_fsc_actualizar(EMUFS *, EMUFS_BLOCK_ID, EMUFS_FREE); -int emufs_fsc_buscar_lugar(EMUFS *, unsigned long, int *); +EMUFS_BLOCK_ID emufs_fsc_buscar_lugar(EMUFS *, EMUFS_FREE, EMUFS_FREE *); -int emufs_fsc_get_fs(EMUFS *, int); +EMUFS_FREE emufs_fsc_get_fs(EMUFS *, EMUFS_BLOCK_ID); #endif /* _EMUFS_FSC_H */ diff --git a/emufs/idx.c b/emufs/idx.c index 56fa4fc..f7c89fd 100644 --- a/emufs/idx.c +++ b/emufs/idx.c @@ -62,7 +62,7 @@ int emufs_idx_crear(EMUFS *efs) return emufs_crear_archivo_auxiliar(efs->nombre, EMUFS_IDX_EXT); } -int emufs_idx_buscar_mayor_id(EMUFS *emu) +EMUFS_REG_ID emufs_idx_buscar_mayor_id(EMUFS *emu) { int id, max = -1; FILE *f_idx; @@ -87,7 +87,7 @@ int emufs_idx_buscar_mayor_id(EMUFS *emu) } /*busca el registro ID en el archivo ".idx" y devuelve el nro de bloque en el que se encuentra*/ -int emufs_idx_buscar_registro(EMUFS *emu, int ID) +EMUFS_BLOCK_ID emufs_idx_buscar_registro(EMUFS *emu, EMUFS_REG_ID ID) { FILE* f_idx; EMUFS_IDX reg; @@ -110,7 +110,7 @@ int emufs_idx_buscar_registro(EMUFS *emu, int ID) } /* agrega un registro al final del archivo */ -int emufs_idx_agregar(EMUFS *emu, int num_bloque, int ID_aux) +int emufs_idx_agregar(EMUFS *emu, EMUFS_BLOCK_ID num_bloque, EMUFS_REG_ID id) { FILE *f_idx; EMUFS_IDX reg; @@ -122,13 +122,13 @@ int emufs_idx_agregar(EMUFS *emu, int num_bloque, int ID_aux) if ( (f_idx = fopen(name_f_idx,"a+"))==NULL ) return -1; reg.block = num_bloque; - reg.id_reg = ID_aux; + reg.id_reg = id; fwrite(®,sizeof(EMUFS_IDX),1,f_idx); fclose(f_idx); return 0; } -int emufs_idx_borrar(EMUFS *emu, int ID) +int emufs_idx_borrar(EMUFS *emu, EMUFS_REG_ID ID) { FILE *f_idx; EMUFS_IDX reg, buffer; diff --git a/emufs/idx.h b/emufs/idx.h index 4dfba88..7999f06 100644 --- a/emufs/idx.h +++ b/emufs/idx.h @@ -53,12 +53,12 @@ FILE* emufs_idx_abrir(EMUFS*, const char*); int emufs_idx_crear(EMUFS*); -int emufs_idx_buscar_mayor_id(EMUFS *); +EMUFS_REG_ID emufs_idx_buscar_mayor_id(EMUFS *); -int emufs_idx_buscar_registro(EMUFS *, int); +EMUFS_BLOCK_ID emufs_idx_buscar_registro(EMUFS *, EMUFS_REG_ID); -int emufs_idx_agregar(EMUFS *, int , int); +int emufs_idx_agregar(EMUFS *, EMUFS_BLOCK_ID, EMUFS_REG_ID); -int emufs_idx_borrar(EMUFS *emu, int ID); +int emufs_idx_borrar(EMUFS *emu, EMUFS_REG_ID); #endif /* _EMUFS_IDX_H */ diff --git a/emufs/tipo1.c b/emufs/tipo1.c index d5a0a58..ee444ce 100644 --- a/emufs/tipo1.c +++ b/emufs/tipo1.c @@ -36,19 +36,33 @@ */ #include "tipo1.h" +#include "idx.h" +#include "fsc.h" +#include "did.h" #include #include #include #include -#include -int emufs_tipo1_leer_registro(EMUFS* efs, int reg_id, void* reg_ptr, unsigned long reg_size) +int emufs_tipo1_inicializar(EMUFS* efs) +{ + /* 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; + + return 0; +} + +int emufs_tipo1_leer_registro(EMUFS* efs, EMUFS_REG_ID reg_id, void* reg_ptr, + EMUFS_REG_SIZE 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 */ + EMUFS_BLOCK_ID block_id; /* id del bloque en donde esta el registro a leer */ + EMUFS_BLOCK_SIZE offset; /* offset del bloque leido */ + EMUFS_REG_SIZE curr_reg_size; /* tamaño del registro leido secuencialmente */ + EMUFS_REG_ID curr_reg_id; /* id del registro leido secuencialmente */ block_id = emufs_idx_buscar_registro(efs, reg_id); block = (char*) malloc(efs->tam_bloque); @@ -69,11 +83,11 @@ int emufs_tipo1_leer_registro(EMUFS* efs, int reg_id, void* reg_ptr, unsigned lo offset = 0; do { /* Copio el id del registro de la cabecera. */ - memcpy(&curr_reg_id, block + offset, sizeof(int)); - offset += sizeof(int); + memcpy(&curr_reg_id, block + offset, sizeof(EMUFS_REG_ID)); + offset += sizeof(EMUFS_REG_ID); /* Copio el tamaño del registro de la cabecera. */ - memcpy(&curr_reg_size, block + offset, sizeof(unsigned long)); - offset += sizeof(unsigned long); + memcpy(&curr_reg_size, block + offset, sizeof(EMUFS_REG_SIZE)); + offset += sizeof(EMUFS_REG_SIZE); if (curr_reg_id == reg_id) { /* XXX Posible checkeo de reg_size == curr_reg_size */ memcpy(reg_ptr, block + offset, curr_reg_size); @@ -87,30 +101,59 @@ int emufs_tipo1_leer_registro(EMUFS* efs, int reg_id, void* reg_ptr, unsigned lo return 0; } -int emufs_tipo1_leer_bloque(EMUFS *emu, int ID, void* ptr) +int emufs_tipo1_leer_bloque(EMUFS* efs, EMUFS_BLOCK_ID block_id, void *block) +{ + FILE* file; + char name_f[255]; + + strcpy(name_f,efs->nombre); + strcat(name_f,".dat"); + + if ( (file = fopen(name_f,"r"))==NULL ) { + return -1; /* FIXME ERROR */ + } + fseek(file, + sizeof(EMUFS_TYPE) + /* Cabecera tipo */ + sizeof(EMUFS_BLOCK_SIZE), /* Cabecera tamaño de bloque */ + SEEK_SET); + /* FIXME: verificar que no se pase de fin de archivo*/ + fseek(file, block_id * efs->tam_bloque, SEEK_CUR); + if (fread(block, efs->tam_bloque, 1, file) != 1) { + fclose(file); + return -1; + } + + fclose(file); + return 0; +} + +EMUFS_REG_ID emufs_tipo1_grabar_registro(EMUFS* emu, void* ptr, + EMUFS_REG_SIZE reg_size) { return -1; /* FIXME Error */ } -int emufs_tipo1_grabar_registro(EMUFS *emu, void *ptr, unsigned long tam) +/*Graba un bloque en el archivo*/ +int emufs_tipo1_grabar_bloque(EMUFS *emu, void *ptr, EMUFS_BLOCK_ID num_bloque) { 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) +EMUFS_REG_ID 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) +/*borra un registro de un bloque y acomoda los registros que quedan*/ +int emufs_tipo1_buscar_registro(EMUFS *emu, EMUFS_REG_ID id_reg) { 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) +int emufs_tipo1_borrar_registro(EMUFS *emu, EMUFS_REG_ID id_reg, + EMUFS_REG_SIZE tam_reg) { return -1; /* FIXME Error */ } + diff --git a/emufs/tipo1.h b/emufs/tipo1.h index 113a66d..efd68c9 100644 --- a/emufs/tipo1.h +++ b/emufs/tipo1.h @@ -39,25 +39,32 @@ #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_inicializar(EMUFS*); -int emufs_tipo1_leer_bloque(EMUFS *, int , void *); +/** Lee el registro \param id_reg y lo almacena en \param ptr */ +int emufs_tipo1_leer_registro(EMUFS *emu, EMUFS_REG_ID id_reg, void *ptr, + EMUFS_REG_SIZE tam_reg); -int emufs_tipo1_grabar_registro(EMUFS *, void *, unsigned long ); +/** Lee el bloque \param num_bloque y lo almacena en \param ptr */ +int emufs_tipo1_leer_bloque(EMUFS *emu, EMUFS_BLOCK_ID num_bloque, void *ptr); -int emufs_tipo1_grabar_bloque(EMUFS *, void *, int); +/** Graba el registro apuntado por \param ptr en el archivo */ +EMUFS_REG_ID emufs_tipo1_grabar_registro(EMUFS* emu, void* ptr, EMUFS_REG_SIZE); -int emufs_tipo1_get_id(EMUFS *); +/** Graba el bloque apuntado por \param ptr en el archivo */ +int emufs_tipo1_grabar_bloque(EMUFS *emu, void *ptr, EMUFS_BLOCK_ID num_bloque); -int emufs_tipo1_buscar_registro(EMUFS *, int); +EMUFS_REG_ID emufs_tipo1_get_id(EMUFS *emu); -int emufs_tipo1_buscar_lugar(EMUFS *, unsigned long , int *); +int emufs_tipo1_buscar_registro(EMUFS *emu, EMUFS_REG_ID id_reg); -int emufs_tipo1_borrar_registro(EMUFS*, int, unsigned long); +int emufs_tipo1_borrar_registro(EMUFS *emu, EMUFS_REG_ID id_reg, + EMUFS_REG_SIZE tam_reg); +/* +int emufs_tipo1_buscar_lugar(EMUFS *emu, EMUFS_REG_SIZE tam_reg, + EMUFS_FREE *free_space); +*/ #endif /* _EMUFS_TIPO1_H_ */ diff --git a/emufs/tipo1_test.c b/emufs/tipo1_test.c new file mode 100644 index 0000000..8b3e1b9 --- /dev/null +++ b/emufs/tipo1_test.c @@ -0,0 +1,31 @@ +#include "emufs.h" + +int main(int argc, char* argv[]) { + EMUFS* efs; + char registro1[5]; + char registro2[6]; + if (argc < 2) { + printf("Faltan argumentos! %s [nombre]\n", argv[0]); + return 1; + } + efs = emufs_abrir(argv[1]); + if (!efs) { + printf("No se pudo crear el EMUFS.\n"); + return 1; + } + if (efs->leer_registro(efs, 1, registro1, 4) == -1) { + printf("No se pudo leer el registro 1.\n"); + return ; + } + registro1[4] = '\0'; + printf("Registro 1: %s\n", registro1); + if (efs->leer_registro(efs, 1, registro2, 5) == -1) { + printf("No se pudo leer el registro 2.\n"); + return 1; + } + registro2[5] = '\0'; + printf("Registro 2: %s\n", registro2); + emufs_destruir(efs); + return 0; +} + diff --git a/emufs/tipo3.c b/emufs/tipo3.c index 5ba6af2..f2d1279 100644 --- a/emufs/tipo3.c +++ b/emufs/tipo3.c @@ -38,11 +38,13 @@ #include "tipo3.h" /** Leo un registro del archivo, devuelve cero si no lo encuentra.**/ -int emufs_tipo3_leer_registro(EMUFS *emu, int ID, void *ptr, unsigned long tam_reg) +int emufs_tipo3_leer_registro(EMUFS *emu, EMUFS_REG_ID ID, void *ptr, + EMUFS_REG_SIZE tam_reg) { char* bloque; - int block, ID_aux; - int iterador = 0; + EMUFS_BLOCK_ID block; + EMUFS_REG_ID ID_aux; + EMUFS_BLOCK_SIZE iterador = 0; /*si existe, lo busco en el archivo de bloques*/ block = emufs_idx_buscar_registro(emu,ID); /*me devuelve el nro de bloque al que pertenece el registro*/ @@ -61,8 +63,8 @@ int emufs_tipo3_leer_registro(EMUFS *emu, int ID, void *ptr, unsigned long tam_r ID_aux = -1; iterador = 0; while ( iterador < emu->tam_bloque ) { - memcpy(&ID_aux, bloque+iterador, sizeof(int)); - iterador += sizeof(int); + memcpy(&ID_aux, bloque+iterador, sizeof(EMUFS_REG_ID)); + iterador += sizeof(EMUFS_REG_ID); if ( ID_aux == ID ){ memcpy(ptr,bloque+iterador,tam_reg); break; @@ -75,7 +77,7 @@ int emufs_tipo3_leer_registro(EMUFS *emu, int ID, void *ptr, unsigned long tam_r } /*leo el bloque "ID" del archivo que viene en "emu->nombre", y lo almaceno en "ptr"*/ -int emufs_tipo3_leer_bloque(EMUFS *emu, int ID, void* ptr) +int emufs_tipo3_leer_bloque(EMUFS *emu, EMUFS_REG_ID ID, void* ptr) { FILE* file; char name_f[255]; @@ -84,7 +86,7 @@ int emufs_tipo3_leer_bloque(EMUFS *emu, int ID, void* ptr) strcat(name_f,".dat"); if ( (file = fopen(name_f,"r"))==NULL ) return -1; /*ERROR*/ - fseek(file,sizeof(int)+sizeof(char)+sizeof(int),SEEK_SET); + fseek(file,sizeof(EMUFS_TYPE)+sizeof(EMUFS_BLOCK_SIZE)+sizeof(EMUFS_REG_SIZE),SEEK_SET); /*FIXME: verificar que no se pase de fin de archivo*/ fseek(file,ID*emu->tam_bloque,SEEK_CUR); if (fread(ptr,emu->tam_bloque,1,file)!=1) return -1; @@ -93,9 +95,12 @@ int emufs_tipo3_leer_bloque(EMUFS *emu, int ID, void* ptr) return 0; } -int emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, unsigned long tam) +EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE tam) { - int ID_aux, fs, num_bloque, cant; + EMUFS_REG_ID ID_aux; + EMUFS_FREE fs; + EMUFS_BLOCK_ID num_bloque; + EMUFS_BLOCK_SIZE cant; FILE *file; char name_f[255]; char* bloque; @@ -114,9 +119,9 @@ int emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, unsigned long tam) /*tengo que buscar un ID valido para el nuevo registro*/ ID_aux = emufs_tipo3_get_id(emu); /*grabo el id en el bloque*/ - memcpy(bloque,&ID_aux,sizeof(int)); + memcpy(bloque,&ID_aux,sizeof(EMUFS_REG_ID)); /*grabo el registro en el bloque*/ - memcpy(bloque+sizeof(int),ptr,tam); + memcpy(bloque+sizeof(EMUFS_REG_ID),ptr,tam); /* me paro al final del archivo */ fseek(file, 0, SEEK_END); /* grabo el bloque en el final del archivo */ @@ -125,11 +130,13 @@ int emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, unsigned long tam) /*tengo que buscar la cantidad de bloques que existen*/ /*me paro al principio salteando el encabezado del archivo*/ fseek(file, 0, SEEK_END); /* Me paro al final */ + /* FIXME FIXME FIXME FALTA TRADUCIR A EMUFS_XXXX */ cant = (ftell(file)-(sizeof(int)*2+sizeof(char))) / emu->tam_bloque; cant--; /* Resto uno porque el numero de bloque debe empezar en 0 */ fclose(file); num_bloque = cant; /* grabo el nuevo registro en el archivo de espacios libres */ + /* FIXME FIXME FIXME FALTA TRADUCIR A EMUFS_XXXX */ if ( emufs_fsc_agregar(emu, num_bloque, emu->tam_bloque - tam - sizeof(int)) != 0 ) { free(bloque); return -1; @@ -146,15 +153,16 @@ int emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, unsigned long tam) /*tengo que buscar un ID valido para el nuevo registro*/ ID_aux = emufs_tipo3_get_id(emu); /*grabo el id en el bloque*/ - memcpy(bloque+emu->tam_bloque-fs,&ID_aux,sizeof(int)); + memcpy(bloque+emu->tam_bloque-fs,&ID_aux,sizeof(EMUFS_REG_ID)); /*grabo el registro en el bloque*/ - memcpy(bloque+emu->tam_bloque-fs+sizeof(int),ptr,tam); + memcpy(bloque+emu->tam_bloque-fs+sizeof(EMUFS_REG_ID),ptr,tam); /*guardo el bloque en el archivo*/ if ( emufs_tipo3_grabar_bloque(emu, bloque, num_bloque) != 0) { printf("error al grabar bloque\n"); return -1; /* se produjo un error */ } /*actualizo el archivo de espacios libres*/ + /* FIXME FIXME FIXME FALTA TRADUCIR A EMUFS_XXXX */ if ( emufs_fsc_actualizar(emu, num_bloque, fs - tam - sizeof(int)) != 0 ){ free(bloque); return -1; @@ -172,9 +180,9 @@ int emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, unsigned long tam) } /*Busco en el archivo de Id`s un Id valido para un nuevo registro*/ -int emufs_tipo3_get_id(EMUFS *emu) +EMUFS_REG_ID emufs_tipo3_get_id(EMUFS *emu) { - int id; + EMUFS_REG_ID id; if ( (id = emufs_did_get_last(emu)) == -1 ) id = emufs_idx_buscar_mayor_id(emu); @@ -182,7 +190,7 @@ int emufs_tipo3_get_id(EMUFS *emu) } /*Graba un bloque en el archivo*/ -int emufs_tipo3_grabar_bloque(EMUFS *emu, void *ptr, int num) +int emufs_tipo3_grabar_bloque(EMUFS *emu, void *ptr, EMUFS_BLOCK_ID num) { FILE* file; char name_f[255]; @@ -201,9 +209,13 @@ int emufs_tipo3_grabar_bloque(EMUFS *emu, void *ptr, int num) } /*borra un registro de un bloque y acomoda los registros que quedan*/ -int emufs_tipo3_borrar_registro(EMUFS *emu, int ID, unsigned long tam_reg) +int emufs_tipo3_borrar_registro(EMUFS *emu, EMUFS_REG_ID ID, EMUFS_REG_SIZE tam_reg) { - int num_bloque, ptr_elim, ptr_mov, ID_aux, fs; + EMUFS_BLOCK_SIZE num_bloque; + EMUFS_BLOCK_SIZE ptr_elim; + EMUFS_BLOCK_SIZE ptr_mov; + EMUFS_REG_ID ID_aux; + EMUFS_FREE fs; char *bloque; num_bloque = emufs_idx_buscar_registro(emu, ID); @@ -216,19 +228,19 @@ int emufs_tipo3_borrar_registro(EMUFS *emu, int ID, unsigned long tam_reg) /*apunto al registro que voy a eliminar*/ ptr_elim = 0; while ( ptr_elim < emu->tam_bloque ){ - memcpy(&ID_aux, bloque+ptr_elim, sizeof(int)); + memcpy(&ID_aux, bloque+ptr_elim, sizeof(EMUFS_REG_ID)); if ( ID_aux == ID ) break; - ptr_elim += tam_reg + sizeof(int); + ptr_elim += tam_reg + sizeof(EMUFS_REG_ID); } /*apunto al registro que voy a mover*/ - ptr_mov = ptr_elim + tam_reg + sizeof(int); + ptr_mov = ptr_elim + tam_reg + sizeof(EMUFS_REG_ID); while ( ptr_mov < emu->tam_bloque ){ - memcpy(bloque+ptr_elim, bloque+ptr_mov, sizeof(int)+tam_reg); + memcpy(bloque+ptr_elim, bloque+ptr_mov, sizeof(EMUFS_REG_ID)+tam_reg); ptr_elim = ptr_mov; - ptr_mov += sizeof(int) + tam_reg; + ptr_mov += sizeof(EMUFS_REG_ID) + tam_reg; } /*grabo el bloque en el archivo*/ @@ -239,7 +251,7 @@ int emufs_tipo3_borrar_registro(EMUFS *emu, int ID, unsigned long tam_reg) /*actualizo archivo .fsc*/ fs = emufs_fsc_get_fs(emu, num_bloque); - if ( emufs_fsc_actualizar(emu, num_bloque, fs + tam_reg + sizeof(int)) != 0 ) return -1; + if ( emufs_fsc_actualizar(emu, num_bloque, fs + tam_reg + sizeof(EMUFS_REG_ID)) != 0 ) return -1; /*actualizo archivo .did*/ if ( emufs_did_agregar(emu, ID) != 0 ) return -1; diff --git a/emufs/tipo3.h b/emufs/tipo3.h index ad84d81..2b9fdeb 100644 --- a/emufs/tipo3.h +++ b/emufs/tipo3.h @@ -47,26 +47,27 @@ #include "idx.h" #include "fsc.h" - /** Lee el registro \param id_reg y lo almacena en \param ptr */ -int emufs_tipo3_leer_registro(EMUFS *emu, int id_reg, void *ptr, unsigned long tam_reg); +int emufs_tipo3_leer_registro(EMUFS *emu, EMUFS_REG_ID id_reg, void *ptr, + EMUFS_REG_SIZE tam_reg); /** Lee el bloque \param num_bloque y lo almacena en \param ptr */ -int emufs_tipo3_leer_bloque(EMUFS *emu, int num_bloque, void *ptr); +int emufs_tipo3_leer_bloque(EMUFS *emu, EMUFS_BLOCK_ID num_bloque, void *ptr); /** Graba el registro apuntado por \param ptr en el archivo */ -int emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, unsigned long tam_reg); +EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE tam_reg); /** Graba el bloque apuntado por \param ptr en el archivo */ -int emufs_tipo3_grabar_bloque(EMUFS *emu, void *ptr, int num_bloque); - -int emufs_tipo3_get_id(EMUFS *emu); +int emufs_tipo3_grabar_bloque(EMUFS *emu, void *ptr, EMUFS_BLOCK_ID num_bloque); -int emufs_tipo3_buscar_registro(EMUFS *emu, int id_reg); +EMUFS_REG_ID emufs_tipo3_get_id(EMUFS *emu); -int emufs_tipo3_buscar_lugar(EMUFS *emu, unsigned long tam_reg, int *free_space); +int emufs_tipo3_buscar_registro(EMUFS *emu, EMUFS_REG_ID id_reg); -int emufs_tipo3_borrar_registro(EMUFS *emu, int id_reg, unsigned long tam_reg); +int emufs_tipo3_buscar_lugar(EMUFS *emu, EMUFS_REG_SIZE tam_reg, + EMUFS_FREE *free_space); +int emufs_tipo3_borrar_registro(EMUFS *emu, EMUFS_REG_ID id_reg, + EMUFS_REG_SIZE tam_reg); #endif /* _EMUFS_TIPO3_H_ */ -- 2.43.0 From 9e9b90c186ca2d7c0cb5fd777beba28714fbaeff Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Sat, 10 Apr 2004 04:33:05 +0000 Subject: [PATCH 12/16] Ejemplo para leer un registro andando. --- emufs/idx.c | 7 ++++--- emufs/tipo1.c | 18 ++++++++---------- emufs/tipo1_test.c | 27 +++++++++++++++++++++++++-- 3 files changed, 37 insertions(+), 15 deletions(-) diff --git a/emufs/idx.c b/emufs/idx.c index f7c89fd..29e021d 100644 --- a/emufs/idx.c +++ b/emufs/idx.c @@ -38,6 +38,7 @@ #include "idx.h" #include #include +#include FILE* emufs_idx_abrir(EMUFS* efs, const char* mode) { @@ -153,11 +154,11 @@ int emufs_idx_borrar(EMUFS *emu, EMUFS_REG_ID ID) printf("ACTUAL = %ld\n", actual/sizeof(EMUFS_IDX)); fseek(f_idx, 0, SEEK_END); /* me voy al final */ final = ftell(f_idx); /* veo cuando ocupa el archivo */ - printf("tamanio del archivo de bloques y registros = %d\n", final/sizeof(EMUFS_IDX)); + printf("tamanio del archivo de bloques y registros = %ld\n", final/sizeof(EMUFS_IDX)); fseek(f_idx, actual, SEEK_SET); /* vuelvo al lugar desde donde quiero justificar */ cant = (final-actual)/sizeof(EMUFS_IDX); - printf("cant = %d\n", cant); + printf("cant = %ld\n", cant); for(i=0; itam_bloque); @@ -95,7 +96,7 @@ int emufs_tipo1_leer_registro(EMUFS* efs, EMUFS_REG_ID reg_id, void* reg_ptr, } /* Desplazo el offset */ offset += curr_reg_size; - } while (offset < efs->tam_bloque); + } while (offset < block_size); free(block); return 0; @@ -105,6 +106,7 @@ int emufs_tipo1_leer_bloque(EMUFS* efs, EMUFS_BLOCK_ID block_id, void *block) { FILE* file; char name_f[255]; + long cant; strcpy(name_f,efs->nombre); strcat(name_f,".dat"); @@ -118,13 +120,9 @@ int emufs_tipo1_leer_bloque(EMUFS* efs, EMUFS_BLOCK_ID block_id, void *block) SEEK_SET); /* FIXME: verificar que no se pase de fin de archivo*/ fseek(file, block_id * efs->tam_bloque, SEEK_CUR); - if (fread(block, efs->tam_bloque, 1, file) != 1) { - fclose(file); - return -1; - } - + cant = fread(block, sizeof(char), efs->tam_bloque, file); fclose(file); - return 0; + return cant; } EMUFS_REG_ID emufs_tipo1_grabar_registro(EMUFS* emu, void* ptr, diff --git a/emufs/tipo1_test.c b/emufs/tipo1_test.c index 8b3e1b9..bb18c19 100644 --- a/emufs/tipo1_test.c +++ b/emufs/tipo1_test.c @@ -8,23 +8,46 @@ int main(int argc, char* argv[]) { printf("Faltan argumentos! %s [nombre]\n", argv[0]); return 1; } - efs = emufs_abrir(argv[1]); + + /* + efs = emufs_crear(argv[1], T1, 1024, 0); if (!efs) { printf("No se pudo crear el EMUFS.\n"); return 1; } - if (efs->leer_registro(efs, 1, registro1, 4) == -1) { + if (emufs_idx_agregar(efs, 0, 0)) { + printf("No se pudo agregar índice.\n"); + return 1; + } + if (emufs_idx_agregar(efs, 0, 1)) { + printf("No se pudo agregar índice.\n"); + return 1; + } + return 0; + */ + + efs = emufs_abrir(argv[1]); + if (!efs) { + printf("No se pudo abrir el EMUFS.\n"); + return 1; + } + + if (efs->leer_registro(efs, 0, registro1, 4) == -1) { printf("No se pudo leer el registro 1.\n"); return ; } registro1[4] = '\0'; printf("Registro 1: %s\n", registro1); + + /* if (efs->leer_registro(efs, 1, registro2, 5) == -1) { printf("No se pudo leer el registro 2.\n"); return 1; } registro2[5] = '\0'; printf("Registro 2: %s\n", registro2); + */ + emufs_destruir(efs); return 0; } -- 2.43.0 From b172089853a56455742c11dfaf940544f57fef70 Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Sat, 10 Apr 2004 04:33:28 +0000 Subject: [PATCH 13/16] Se mueve Doxyfile a la raiz para ejecutarlo mas facil. --- doc/Doxyfile => Doxyfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename doc/Doxyfile => Doxyfile (99%) diff --git a/doc/Doxyfile b/Doxyfile similarity index 99% rename from doc/Doxyfile rename to Doxyfile index 7e40602..7269509 100644 --- a/doc/Doxyfile +++ b/Doxyfile @@ -30,7 +30,7 @@ PROJECT_NUMBER = 0.1 # If a relative path is entered, it will be relative to the location # where doxygen was started. If left blank the current directory will be used. -OUTPUT_DIRECTORY = api +OUTPUT_DIRECTORY = doc/api # The OUTPUT_LANGUAGE tag is used to specify the language in which all # documentation generated by doxygen is written. Doxygen will use this @@ -391,7 +391,7 @@ WARN_LOGFILE = # directories like "/usr/src/myproject". Separate the files or directories # with spaces. -INPUT = .. +INPUT = emufs emufs_gui # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -- 2.43.0 From b79e29fb18f3f8898b62ae999fbcd50d5a9fb92d Mon Sep 17 00:00:00 2001 From: Alan Kennedy Date: Sat, 10 Apr 2004 16:12:46 +0000 Subject: [PATCH 14/16] Fixed mezcla de data types utilizando los nuevos tipos definidos por Luca - by Bugo --- emufs/did.c | 47 +++++++++++++++++++++++++++++++++-------------- emufs/did.h | 5 +---- 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/emufs/did.c b/emufs/did.c index 8492aa7..9eb47da 100644 --- a/emufs/did.c +++ b/emufs/did.c @@ -40,18 +40,31 @@ #include #include +/**********************************************************************/ +/* int emufs_did_crear(EMUFS* efs) */ +/* */ +/* Objetivo: Crea un archivo de ID's Liberados. */ +/* Parametros: EMUFS *efs // Struct con handlers de un Data File. */ +/**********************************************************************/ int emufs_did_crear(EMUFS* efs) { return emufs_crear_archivo_auxiliar(efs->nombre, EMUFS_DID_EXT); } -EMUFS_REG_ID emufs_did_get_last(EMUFS *emu) +/**********************************************************************/ +/* EMUFS_REG_ID emufs_did_get_last(EMUFS *efs) */ +/* */ +/* Objetivo: Devuelve el ID Libre, liberado mas recientemente (pila) */ +/* Parametros: EMUFS *efs // Struct con handlers + info del openfile. */ +/**********************************************************************/ +EMUFS_REG_ID emufs_did_get_last(EMUFS *efs) { - FILE * f_did; - int id, offset; + FILE *f_did; + EMUFS_REG_ID n_RegId; + EMUFS_OFFSET n_Offset; char name_f_did[255]; - strcpy(name_f_did, emu->nombre); + strcpy(name_f_did, efs->nombre); strcat(name_f_did, EMUFS_DID_EXT); if ( (f_did = fopen(name_f_did,"r")) == NULL) return -1; /*ERROR*/ @@ -59,35 +72,41 @@ EMUFS_REG_ID emufs_did_get_last(EMUFS *emu) if (ftell(f_did) > 0){ /* si el archivo no esta vacio es porque hay un nro disponible*/ - fseek(f_did, -sizeof(int),SEEK_END); + fseek(f_did, -sizeof(EMUFS_REG_ID),SEEK_END); /* leo el ultimo numero */ - fread(&id,sizeof(int),1,f_did); + fread(&n_RegId,sizeof(EMUFS_REG_ID),1,f_did); /* voy al final */ fseek(f_did, 0, SEEK_END); /* mido el tamaño del archivo*/ - offset = ftell(f_did); + n_Offset = ftell(f_did); fclose(f_did); /*lo trunco */ - truncate(name_f_did, offset - sizeof(int)); + truncate(name_f_did, n_Offset - sizeof(EMUFS_REG_ID)); } else { fclose(f_did); /* si el archivo esta vacio */ - id = -1; + n_RegId = -1; } - return id; + return n_RegId; } -/*agrego un elemento al archivo */ -int emufs_did_agregar(EMUFS *emu, EMUFS_REG_ID ID) +/**********************************************************************/ +/* int emufs_did_agregar(EMUFS *efs, EMUFS_REG_ID n_RegId) */ +/* */ +/* Objetivo: Agrega un registro al archivo de ID's Libres (pila) */ +/* Parametros: EMUFS *efs // Struct con handlers + info del openfile. */ +/* EMUFS_REG_ID n_RegId // Id Libre a agregar. */ +/**********************************************************************/ +int emufs_did_agregar(EMUFS *efs, EMUFS_REG_ID n_RegId) { FILE *f_did; char name_f_did[255]; - strcpy(name_f_did, emu->nombre); + strcpy(name_f_did, efs->nombre); strcat(name_f_did, EMUFS_DID_EXT); if ( (f_did = fopen(name_f_did,"a+")) == NULL) return -1; - fwrite(&ID, sizeof(int), 1, f_did); + fwrite(&n_RegId, sizeof(EMUFS_REG_ID), 1, f_did); fclose(f_did); return 0; diff --git a/emufs/did.h b/emufs/did.h index 5b71019..e3f7b72 100644 --- a/emufs/did.h +++ b/emufs/did.h @@ -40,13 +40,10 @@ #define _EMUFS_DID_H_ #include "emufs.h" - #define EMUFS_DID_EXT ".did" int emufs_did_crear(EMUFS*); - -EMUFS_REG_ID emufs_did_get_last(EMUFS *); - int emufs_did_agregar(EMUFS *, EMUFS_REG_ID); +EMUFS_REG_ID emufs_did_get_last(EMUFS *); #endif /* _EMUFS_DID_H */ -- 2.43.0 From c407055e1cc6ff4c435114091c3a5430486aa659 Mon Sep 17 00:00:00 2001 From: Alan Kennedy Date: Sat, 10 Apr 2004 17:42:22 +0000 Subject: [PATCH 15/16] Cambios Realizados (son varios, read carefuly): A) En los tres sets de rutinas para el manejo de los archivos auxiliares IDX,FSC y DID, se utilizan ahora los nuevos tipos de datos que definio Luca (son unsigned long int todos creo). Ademas, yo modifique algunas rutinas (y voy a tener que seguir modificando), para que se acomodem al esquema del Archivo Tipo2, en donde no tenemos bloques, tonces hay unas mini-diferencias ya que tenemos Gaps, no hay recompactacion automatica (perderia sentido tener los Gaps), se maneja la localizacion de los registros por Offsets y no bloque, etc. B) En IDX, fixee la rutina que busca un registro por su ID. El problema que detecte ayer cuando la use, era que si terminaba de recorrer y no lo encontraba en vez de devolver -1, devolvia el ultimo ID que levanto. C) En EMUFS.c|h, agrege a la estructura un campo para guardar el tamanio de registro, a ser utilizado solo por el Tipo3. Asi mismo, saque el ultimo parametro de la funcion dinamica borrar_registro en la cual se pasaba dicho dato, pues ahora ya se pasa en la estructura. En el Emufs.c, ahora se deberia estar levantan correctamente el tamanio de registro en el header del archivo Tipo3 (chequeen ese OR por favor), por lo que Nico simplemente modificando tu funcion emufs_tipo3_borrar_registro, para que levante el dato de la estructura y no ese tercer parametro que ya no esta mas, deberia salir andando. D) Por lo explicado anterioremente deshabilite las asignaciones en los Tipo1 y 3, de la rutina para Borrar Registros. E) Tipo1 y Tipo3 me compilan, pero no se si estan tirando bien el output (o sea no se si es lo esperado). Fijense antes que nada en los printf que ahora es un unsigned int lo que se imprime y no integer, por lo que si ven un numero raro puede ser por eso. Los dos tests compilan sin warnings salvo el del truncate, pero recuerden que les saque el borrar registro, fix that. ------------------------------------------- Bueno eso es todo, me tomo un buen rato reordenar esto con los tipos nuevos y lo que yo tenia desde ayer. Ahora voy a ver si puedo dejar mi tipo2 andando como lo habia dejado ayer y lo subo mas tarde. Por ahora solo grabo registros, ayer empeze hacer el borrar registro mio pero quebre (toy enfermo). Calculo que se me va a complicar un toque dado que si borro dos registros consecutivos deberia hacer un merge de esos dos gaps y dejarlo como uno solo en el .DID, pero bueno problema mio, cualquier cosa les pido ayuda. Saludos, si me necesitan toy en ICQ hasta la noche facil, laburando sobre el TP. --- emufs/Makefile | 4 +- emufs/did.c | 22 +------- emufs/emufs.c | 36 ++++++++---- emufs/emufs.h | 3 +- emufs/fsc.c | 67 +++++++++++----------- emufs/fsc.h | 8 +-- emufs/idx.c | 49 +++++++++------- emufs/idx.h | 9 +-- emufs/tipo1.c | 4 +- emufs/tipo1_test.c | 3 +- emufs/tipo2.c | 136 +++++++++++++++++++++++++++++++++++++++++++++ emufs/tipo2.h | 47 ++++++++++++++++ emufs/tipo3_main.c | 22 ++++---- 13 files changed, 293 insertions(+), 117 deletions(-) create mode 100644 emufs/tipo2.c create mode 100644 emufs/tipo2.h diff --git a/emufs/Makefile b/emufs/Makefile index 5ec4767..e6f24ff 100644 --- a/emufs/Makefile +++ b/emufs/Makefile @@ -1,7 +1,7 @@ CFLAGS=-Wall -g -ansi -pedantic -DDEBUG LDFLAGS= -EMUFS_COMMON=emufs.o tipo1.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 all: libemufs.a tipo1_test tipo3_main @@ -13,4 +13,4 @@ libemufs.a: $(EMUFS_COMMON) ar cru libemufs.a tipo3.o $(EMUFS_COMMON) clean: - @rm -fv *.o tipo3_main + @rm -fv *.o tipo3_main tipo1_test articulos.* diff --git a/emufs/did.c b/emufs/did.c index 9eb47da..5c386b5 100644 --- a/emufs/did.c +++ b/emufs/did.c @@ -40,23 +40,13 @@ #include #include -/**********************************************************************/ -/* int emufs_did_crear(EMUFS* efs) */ -/* */ -/* Objetivo: Crea un archivo de ID's Liberados. */ -/* Parametros: EMUFS *efs // Struct con handlers de un Data File. */ -/**********************************************************************/ +/* Crea un archivo de ID's Liberados. */ int emufs_did_crear(EMUFS* efs) { return emufs_crear_archivo_auxiliar(efs->nombre, EMUFS_DID_EXT); } -/**********************************************************************/ -/* EMUFS_REG_ID emufs_did_get_last(EMUFS *efs) */ -/* */ -/* Objetivo: Devuelve el ID Libre, liberado mas recientemente (pila) */ -/* Parametros: EMUFS *efs // Struct con handlers + info del openfile. */ -/**********************************************************************/ +/* Devuelve el ID Libre, liberado mas recientemente (pila) */ EMUFS_REG_ID emufs_did_get_last(EMUFS *efs) { FILE *f_did; @@ -90,13 +80,7 @@ EMUFS_REG_ID emufs_did_get_last(EMUFS *efs) return n_RegId; } -/**********************************************************************/ -/* int emufs_did_agregar(EMUFS *efs, EMUFS_REG_ID n_RegId) */ -/* */ -/* Objetivo: Agrega un registro al archivo de ID's Libres (pila) */ -/* Parametros: EMUFS *efs // Struct con handlers + info del openfile. */ -/* EMUFS_REG_ID n_RegId // Id Libre a agregar. */ -/**********************************************************************/ +/* Agrega un registro al archivo de ID's Libres (pila) */ int emufs_did_agregar(EMUFS *efs, EMUFS_REG_ID n_RegId) { FILE *f_did; diff --git a/emufs/emufs.c b/emufs/emufs.c index 7ddd4bd..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,7 +81,7 @@ int emufs_crear_archivo_auxiliar(const char* name, const char* ext) return 0; } - +/* 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) { @@ -96,9 +99,10 @@ EMUFS *emufs_crear(const char *filename, EMUFS_TYPE tipo, if (efs == NULL) { return NULL; } - efs->tipo = tipo; + efs->tipo = tipo; efs->tam_bloque = tam_bloque; - efs->nombre = str_dup(filename); + efs->tam_reg = tam_reg; + efs->nombre = str_dup(filename); /* Abre archivo de datos. */ strcpy(name, filename); @@ -150,6 +154,11 @@ EMUFS *emufs_crear(const char *filename, EMUFS_TYPE tipo, 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, EMUFS_TYPE tipo, 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(EMUFS_BLOCK_SIZE), 1, fp); - fwrite(&tam_reg, sizeof(EMUFS_REG_SIZE), 1, fp); - + fwrite(&tam_reg, sizeof(EMUFS_REG_SIZE), 1, fp); break; } @@ -171,6 +179,7 @@ EMUFS *emufs_crear(const char *filename, EMUFS_TYPE tipo, 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 *efs; @@ -215,17 +224,18 @@ EMUFS *emufs_abrir(const char *filename) case T2: break; case T3: - if (!fread(&(efs->tam_bloque), sizeof(EMUFS_BLOCK_SIZE), 1, fp)) { + 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; - } - /* FIXME no falta leer el tamaño del registro???? */ + } 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;*/ break; } @@ -233,6 +243,7 @@ EMUFS *emufs_abrir(const char *filename) return efs; } +/* Objetivo: Rutina llamada al destruir la aplicacion para librerar */ int emufs_destruir(EMUFS *e) { if (e == NULL) return 1; @@ -241,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; @@ -256,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); } @@ -271,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); diff --git a/emufs/emufs.h b/emufs/emufs.h index cd25bb5..0ce08de 100644 --- a/emufs/emufs.h +++ b/emufs/emufs.h @@ -89,10 +89,11 @@ typedef unsigned long EMUFS_OFFSET; typedef struct _emu_fs_t { EMUFS_TYPE tipo; EMUFS_BLOCK_SIZE tam_bloque; /**< Tamaño de bloque. 0 Si no tiene bloques */ + EMUFS_REG_SIZE tam_reg; /**< Tamaño de registro. 0 Si son registros variables */ int (*leer_bloque)(struct _emu_fs_t*, EMUFS_BLOCK_ID, void*); /**< Método para leer un bloque */ int (*leer_registro)(struct _emu_fs_t*, EMUFS_REG_ID, void *, EMUFS_REG_SIZE); /**< Método para leer un registro */ EMUFS_REG_ID (*grabar_registro)(struct _emu_fs_t*, void*, EMUFS_REG_SIZE); /**< Método para grabar un registro */ - int (*borrar_registro)(struct _emu_fs_t*, EMUFS_REG_ID, unsigned long ); /**< Método para borrar un registro */ /* XXX QUE CATSO ES EL unsigned long ??? */ + int (*borrar_registro)(struct _emu_fs_t*, EMUFS_REG_ID); /**< Método para borrar un registro */ char *nombre; /**< Nombre del archivo */ } EMUFS; diff --git a/emufs/fsc.c b/emufs/fsc.c index 05218a6..1cf873f 100644 --- a/emufs/fsc.c +++ b/emufs/fsc.c @@ -39,12 +39,14 @@ #include #include +/* Crea un archivo de Gaps o Espacio Libre en Bloque */ int emufs_fsc_crear(EMUFS* efs) { return emufs_crear_archivo_auxiliar(efs->nombre, EMUFS_FSC_EXT); } -int emufs_fsc_agregar(EMUFS *emu, EMUFS_BLOCK_ID num_bloque, EMUFS_FREE fs) +/* Agrega un registro al archivo de espacios libres. */ +int emufs_fsc_agregar(EMUFS *emu, EMUFS_BLOCK_ID n_Marker, EMUFS_FREE n_FreeSpace) { FILE *f_fsc; EMUFS_FSC reg; @@ -53,18 +55,19 @@ int emufs_fsc_agregar(EMUFS *emu, EMUFS_BLOCK_ID num_bloque, EMUFS_FREE fs) strcpy(name_f_fsc,emu->nombre); strcat(name_f_fsc, EMUFS_FSC_EXT); - /*cargo el registro*/ - reg.block = num_bloque; - reg.free_space = fs; - /*lo guardo en el archivo al final "a+"*/ + /* Cargo el registro */ + reg.n_Marker = n_Marker; + reg.n_FreeSpace = n_FreeSpace; + + /* Lo guardo en el archivo al final "a+"*/ if ( (f_fsc = fopen(name_f_fsc,"a+"))==NULL ) return -1; fwrite(®,sizeof(EMUFS_FSC),1,f_fsc); fclose(f_fsc); return 0; } -/* busca el bloque y le resta fs de espacio libre */ -int emufs_fsc_actualizar(EMUFS *emu, EMUFS_BLOCK_ID num_bloque, EMUFS_FREE fs) +/* Objetivo: Actualiza un registro de espacio libre de acorde al FType */ +int emufs_fsc_actualizar(EMUFS *emu, EMUFS_BLOCK_ID n_Marker, EMUFS_FREE n_FreeSpace) { FILE *f_fsc; EMUFS_FSC reg; @@ -73,12 +76,12 @@ int emufs_fsc_actualizar(EMUFS *emu, EMUFS_BLOCK_ID num_bloque, EMUFS_FREE fs) strcpy(name_f_fsc,emu->nombre); strcat(name_f_fsc, EMUFS_FSC_EXT); - /*busco el bloque que modifique*/ - if ( (f_fsc = fopen(name_f_fsc,"r+")) == NULL) return -1; + /*busco el bloque o gap que modifique*/ + if ( (f_fsc = fopen(name_f_fsc,"r+")) == NULL) return -1; while ( !feof(f_fsc) ){ if ( fread(®,sizeof(EMUFS_FSC),1,f_fsc) != 1) continue; - if ( reg.block == num_bloque ){ - reg.free_space = fs; + if ( reg.n_Marker == n_Marker ){ + reg.n_FreeSpace = n_FreeSpace; fseek(f_fsc,-sizeof(EMUFS_FSC),SEEK_CUR); fwrite(®,sizeof(EMUFS_FSC),1,f_fsc); break; @@ -88,40 +91,39 @@ int emufs_fsc_actualizar(EMUFS *emu, EMUFS_BLOCK_ID num_bloque, EMUFS_FREE fs) return 0; } -/* me devuelve el ID del bloque donde quepa un registro, y guarda en fs el espacio libre que queda en el bloque */ -EMUFS_BLOCK_ID emufs_fsc_buscar_lugar(EMUFS *emu, EMUFS_FREE tam, EMUFS_FREE *fs) +/* Me devuelve el ID del bloque u Offset del Gap donde quepa un registro, y guarda en n_FreeSpace el espacio libre actualizado */ +EMUFS_BLOCK_ID emufs_fsc_buscar_lugar(EMUFS *emu, EMUFS_FREE n_RegSize, EMUFS_FREE *n_FreeSpace) { FILE *f_fsc; EMUFS_FSC reg; char name_f_fsc[255]; + unsigned short int b_Found = 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; - /* Inicializo la estructura para evitar que si el archivo esta vacio - * el resultado sea correcto - */ - reg.block = -1; - *fs = emu->tam_bloque; - while( !feof(f_fsc) ){ + /* Inicializamos la estructura para devolver algun valor en concreto */ + /* en caso de que no se halle un espacio libre apropiado */ + while(!feof(f_fsc) && !b_Found){ if (fread(®,sizeof(EMUFS_FSC),1,f_fsc) != 1) continue; - if (reg.free_space >= tam) { - break; - } else { - reg.block = -1; - *fs = emu->tam_bloque; - } + if (reg.n_FreeSpace >= n_RegSize) b_Found = 1; } + /* Si salio por error o por fin de archivo y no encontro space... */ + if (!b_Found) { + reg.n_Marker = -1; + *n_FreeSpace = emu->tam_bloque; + } + else *n_FreeSpace = reg.n_FreeSpace; + fclose(f_fsc); - if (reg.block != -1) - *fs = reg.free_space; - return reg.block; + return reg.n_Marker; } -EMUFS_FREE emufs_fsc_get_fs(EMUFS *emu, EMUFS_BLOCK_ID num_bloque) +/* Devuelve el espacio libre de un Bloque o Gap dado */ +EMUFS_FREE emufs_fsc_get_fs(EMUFS *emu, EMUFS_BLOCK_ID n_Marker) { FILE *f_fsc; EMUFS_FSC reg; @@ -130,15 +132,14 @@ EMUFS_FREE emufs_fsc_get_fs(EMUFS *emu, EMUFS_BLOCK_ID num_bloque) strcpy(name_f_fsc,emu->nombre); strcat(name_f_fsc, EMUFS_FSC_EXT); + /* Busco el Bloque o Gap pedido y obtengo su espacio libre */ if ( (f_fsc = fopen(name_f_fsc,"r"))==NULL ) return -1; - while ( !feof(f_fsc) ){ if ( fread(®,sizeof(EMUFS_FSC),1,f_fsc) != 1 ) continue; - if ( reg.block == num_bloque ) + if ( reg.n_Marker == n_Marker ) break; } fclose(f_fsc); - return reg.free_space; + return reg.n_FreeSpace; } - diff --git a/emufs/fsc.h b/emufs/fsc.h index 01a72f1..aa2f704 100644 --- a/emufs/fsc.h +++ b/emufs/fsc.h @@ -43,18 +43,14 @@ #define EMUFS_FSC_EXT ".fsc" typedef struct emufs_fsc_t { - int block; - int free_space; + unsigned long int n_Marker; + unsigned long int n_FreeSpace; } EMUFS_FSC; int emufs_fsc_crear(EMUFS*); - int emufs_fsc_agregar(EMUFS *, EMUFS_BLOCK_ID, 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); #endif /* _EMUFS_FSC_H */ diff --git a/emufs/idx.c b/emufs/idx.c index 29e021d..c05c34c 100644 --- a/emufs/idx.c +++ b/emufs/idx.c @@ -40,6 +40,7 @@ #include #include +/* Objetivo: Realiza una apertura de un archivo indice y devuelve el handler. */ FILE* emufs_idx_abrir(EMUFS* efs, const char* mode) { FILE* f; @@ -58,14 +59,16 @@ FILE* emufs_idx_abrir(EMUFS* efs, const char* mode) return f; } +/* Crea un archivo indice de registros */ int emufs_idx_crear(EMUFS *efs) { return emufs_crear_archivo_auxiliar(efs->nombre, EMUFS_IDX_EXT); } +/* Devuelve el mayor id de registro utilizado so far en el archivo de datos, revisando el indice. */ EMUFS_REG_ID emufs_idx_buscar_mayor_id(EMUFS *emu) { - int id, max = -1; + EMUFS_REG_ID n_IdReg, max = -1; FILE *f_idx; EMUFS_IDX reg; char name_f_idx[255]; /* TODO usar malloc para no limitar el tamaño de nombre de archivo */ @@ -74,44 +77,46 @@ EMUFS_REG_ID emufs_idx_buscar_mayor_id(EMUFS *emu) strcat(name_f_idx, EMUFS_IDX_EXT); if ( (f_idx = fopen(name_f_idx,"r")) == NULL) return -1; /*ERROR*/ - id = -1; + n_IdReg = -1; while ( !feof(f_idx) ){ /* Me aseguro de leer la cantidad de bytes correcta */ if (fread(®,sizeof(EMUFS_IDX),1,f_idx) != 1) continue; - if ( reg.id_reg >= max ) - max = reg.id_reg; + if ( reg.n_IdReg >= max ) + max = reg.n_IdReg; } - id = max+1; + n_IdReg = max+1; fclose(f_idx); - return id; + return n_IdReg; } -/*busca el registro ID en el archivo ".idx" y devuelve el nro de bloque en el que se encuentra*/ -EMUFS_BLOCK_ID emufs_idx_buscar_registro(EMUFS *emu, EMUFS_REG_ID ID) +/* busca el registro ID en el archivo ".idx" y devuelve el nro de bloque en el que se encuentra */ +EMUFS_BLOCK_ID emufs_idx_buscar_registro(EMUFS *emu, EMUFS_REG_ID n_IdReg) { FILE* f_idx; EMUFS_IDX reg; char name_f_idx[255]; + unsigned short int b_Found = 0; + strcpy(name_f_idx,emu->nombre); strcat(name_f_idx, EMUFS_IDX_EXT); if ( (f_idx = fopen(name_f_idx,"r")) == NULL) return -1; /*ERROR*/ - reg.id_reg = -1; - reg.block = -1; - while ( !feof(f_idx) ){ + + while (!feof(f_idx) && !b_Found){ if (fread(®,sizeof(EMUFS_IDX),1,f_idx) != 1) continue; - if ( reg.id_reg == ID ){ - break; - } + if (reg.n_IdReg == n_IdReg) b_Found = 1; } fclose(f_idx); - return reg.block; + + /* Sino lo encontre devuelvo uno, otherwise el offset o bloque */ + if (!b_Found) return(-1); + else return(reg.n_Location); } /* agrega un registro al final del archivo */ -int emufs_idx_agregar(EMUFS *emu, EMUFS_BLOCK_ID num_bloque, EMUFS_REG_ID id) +int emufs_idx_agregar(EMUFS *emu, EMUFS_BLOCK_ID n_Location, EMUFS_REG_ID n_IdReg) { FILE *f_idx; EMUFS_IDX reg; @@ -122,14 +127,16 @@ int emufs_idx_agregar(EMUFS *emu, EMUFS_BLOCK_ID num_bloque, EMUFS_REG_ID id) if ( (f_idx = fopen(name_f_idx,"a+"))==NULL ) return -1; - reg.block = num_bloque; - reg.id_reg = id; + /* Note: Location = Bloque para Tipo 1 y 3, Offset para Tipo 2 */ + reg.n_Location = n_Location; + reg.n_IdReg = n_IdReg; fwrite(®,sizeof(EMUFS_IDX),1,f_idx); fclose(f_idx); return 0; } -int emufs_idx_borrar(EMUFS *emu, EMUFS_REG_ID ID) +/* Borra un registro del indice dada la eliminacion fisica de un reg */ +int emufs_idx_borrar(EMUFS *emu, EMUFS_REG_ID n_IdReg) { FILE *f_idx; EMUFS_IDX reg, buffer; @@ -144,13 +151,13 @@ int emufs_idx_borrar(EMUFS *emu, EMUFS_REG_ID ID) while ( !feof(f_idx) ){ /*busco cual tengo que borrar*/ if ( fread(®, sizeof(EMUFS_IDX), 1, f_idx) != 1 ) continue; - if ( reg.id_reg == ID ) + if ( reg.n_IdReg == n_IdReg ) break; } /* me paro en el que tengo que borrar */ actual = fseek(f_idx, -sizeof(EMUFS_IDX), SEEK_CUR); - /*actual = ftell(f_idx); /* Guardo la posicion actual */ + /*actual = ftell(f_idx);*/ /* Guardo la posicion actual */ printf("ACTUAL = %ld\n", actual/sizeof(EMUFS_IDX)); fseek(f_idx, 0, SEEK_END); /* me voy al final */ final = ftell(f_idx); /* veo cuando ocupa el archivo */ diff --git a/emufs/idx.h b/emufs/idx.h index 7999f06..7e7cff9 100644 --- a/emufs/idx.h +++ b/emufs/idx.h @@ -45,20 +45,15 @@ #define EMUFS_IDX_EXT ".idx" typedef struct emufs_idx_t { - int block; - long int id_reg; + unsigned long int n_IdReg; + unsigned long int n_Location; } EMUFS_IDX; FILE* emufs_idx_abrir(EMUFS*, const char*); - int emufs_idx_crear(EMUFS*); - EMUFS_REG_ID emufs_idx_buscar_mayor_id(EMUFS *); - EMUFS_BLOCK_ID emufs_idx_buscar_registro(EMUFS *, EMUFS_REG_ID); - int emufs_idx_agregar(EMUFS *, EMUFS_BLOCK_ID, EMUFS_REG_ID); - int emufs_idx_borrar(EMUFS *emu, EMUFS_REG_ID); #endif /* _EMUFS_IDX_H */ diff --git a/emufs/tipo1.c b/emufs/tipo1.c index 5f0a9ed..d68095f 100644 --- a/emufs/tipo1.c +++ b/emufs/tipo1.c @@ -50,8 +50,7 @@ int emufs_tipo1_inicializar(EMUFS* efs) 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; - + /*efs->borrar_registro = emufs_tipo1_borrar_registro;*/ return 0; } @@ -154,4 +153,3 @@ int emufs_tipo1_borrar_registro(EMUFS *emu, EMUFS_REG_ID id_reg, { return -1; /* FIXME Error */ } - diff --git a/emufs/tipo1_test.c b/emufs/tipo1_test.c index bb18c19..7249e44 100644 --- a/emufs/tipo1_test.c +++ b/emufs/tipo1_test.c @@ -34,7 +34,7 @@ int main(int argc, char* argv[]) { if (efs->leer_registro(efs, 0, registro1, 4) == -1) { printf("No se pudo leer el registro 1.\n"); - return ; + return 1; } registro1[4] = '\0'; printf("Registro 1: %s\n", registro1); @@ -51,4 +51,3 @@ int main(int argc, char* argv[]) { emufs_destruir(efs); return 0; } - diff --git a/emufs/tipo2.c b/emufs/tipo2.c new file mode 100644 index 0000000..e3025cb --- /dev/null +++ b/emufs/tipo2.c @@ -0,0 +1,136 @@ +/* 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: Fri Apr 10 17:10:00 ART 2004 + * Autores: Alan Kennedy + *---------------------------------------------------------------------------- + * + * $Id: tipo3.c 85 2004-04-08 23:39:28Z sagar $ + * + */ + +/***************************************************************/ +/* Implementación del Tipo Archivo 2: Registros Variables, Sin */ +/* Bloques at all. */ +/***************************************************************/ + +#include "tipo2.h" +#include "idx.h" +#include "fsc.h" +#include "did.h" + +/**********************************************************************/ +/* EMUFS_REG_ID emufs_tipo2_grabar_registro(EMUFS *emu, void *ptr, */ +/* EMUFS_REG_SIZE n_RegSize) */ +/* Objetivo: Grabar un registro en un archivo del Tipo 2. */ +/* Parametros: EMUFS *emu // Struct con handlers + info del openfile. */ +/* void *ptr // Puntero al buffer (registro) a guardar */ +/* EMUFS_REG_SIZE n_RegSize // Size del reg en cuestion */ +/**********************************************************************/ +EMUFS_REG_ID emufs_tipo2_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE n_RegSize) +{ + EMUFS_REG_ID n_IdReg; + EMUFS_FREE n_FreeSpace; + EMUFS_OFFSET n_WrtOffset,n_RegOffset; + FILE *f_data; + char name_f[255]; + + /* Armamos el filename del archivo de datos */ + strcpy(name_f,emu->nombre); + strcat(name_f,".dat"); + + if ( (f_data = fopen(name_f,"a+"))==NULL ) return -1; /*ERROR*/ + + /* Obtengo un offset en donde iniciar la escritura de mi registro */ + /* de manera segura (habra espacio suficiente) */ + n_WrtOffset = emufs_fsc_buscar_lugar(emu, n_RegSize, &n_FreeSpace); + printf("tipo2.c >> Searching FSC: Offset = %lu FSpace: %lu\n", n_WrtOffset, n_FreeSpace); + + /* Si no encontre un gap, entonces escribo el registro al final */ + if (n_WrtOffset == -1) { + + /* Obtengo un ID libre para el registro y luego grabo a disco */ + n_IdReg = emufs_tipo2_get_id(emu); + fseek(f_data, 0, SEEK_END); + n_RegOffset = ftell(f_data); + + /* Escribo [RegId]|[RegSize]|[RegData] */ + fwrite(&n_IdReg,sizeof(int),1,f_data); + fwrite(&n_RegSize,sizeof(int),1,f_data); + fwrite(ptr,n_RegSize,1,f_data); + + /* Bye */ + printf("Tipo2.c >> RegNr: %lu inserted at Offset: %lu\n",n_IdReg,n_RegOffset); + fclose(f_data); + + } else { + + } + + /* Finalmente, actualizamos el indice de registros (offsets) */ + emufs_idx_agregar(emu,n_IdReg,n_RegOffset); + + return n_IdReg; +} + +/**********************************************************************/ +/* int emufs_tipo2_borrar_registro(EMUFS *emu, EMUFS_REG_ID n_IdReg) */ +/* Objetivo: Borra un registro determinado y actualiza los archivos */ +/* de Posicion Relativa (Indice-Offset) y el de Gaps */ +/* Parametros: EMUFS *emu // Struct con handlers + info del openfile. */ +/* EMUFS_REG_ID n_IdReg // Id del registro a eliminar. */ +/**********************************************************************/ +int emufs_tipo2_borrar_registro(EMUFS *emu, EMUFS_REG_ID n_IdReg) +{ + FILE *f_data; + char name_f[255]; + EMUFS_OFFSET n_RegOffset; + + /* Armamos el filename del archivo de datos */ + strcpy(name_f,emu->nombre); + strcat(name_f,".dat"); + + /* Obtenemos el tamanio del bloque */ + if ((n_RegOffset = emufs_idx_buscar_registro(emu,n_IdReg)) != -1) + printf("tipo2.c >> Searching Reg %lu...Found at offset: %lu\n",n_IdReg,n_RegOffset); + else + return -1; + + if ((f_data = fopen(name_f,"a+")) == NULL) return -1; /* ERROR */ + fclose(f_data); + + return(0); +} + +/**********************************************************************/ +/* EMUFS_REG_ID emufs_tipo2_get_id(EMUFS *emu) */ +/* Objetivo: Devuelve un Id apropiado y disponible para un nuevo reg */ +/* Parametros: EMUFS *emu // Struct con handlers + info del openfile. */ +/**********************************************************************/ +EMUFS_REG_ID emufs_tipo2_get_id(EMUFS *emu) +{ + EMUFS_REG_ID n_RegId; + + /* Si no se hallo un id libre, entonces debo usar el maximo + 1 */ + if ( (n_RegId = emufs_did_get_last(emu)) == -1 ) + n_RegId = emufs_idx_buscar_mayor_id(emu); + + return n_RegId; +} diff --git a/emufs/tipo2.h b/emufs/tipo2.h new file mode 100644 index 0000000..3e55b7d --- /dev/null +++ b/emufs/tipo2.h @@ -0,0 +1,47 @@ +/* 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: Fri Apr 10 17:10:00 ART 2004 + * Autores: Alan Kennedy + *---------------------------------------------------------------------------- + */ + +/***************************************************************/ +/* Implementación del Tipo Archivo 2: Registros Variables, Sin */ +/* Bloques at all. */ +/***************************************************************/ + +#ifndef _EMUFS_TIPO2_H_ +#define _EMUFS_TIPO2_H_ + +#include +#include +#include +#include +#include "emufs.h" + +EMUFS_REG_ID emufs_tipo2_grabar_registro(EMUFS *, void *, EMUFS_REG_SIZE); +int emufs_tipo2_borrar_registro(EMUFS*, EMUFS_REG_ID); +EMUFS_REG_ID emufs_tipo2_get_id(EMUFS *); + +/* int emufs_tipo2_leer_registro(EMUFS *, EMUFS_REG_ID , void *, EMUFS_REG_SIZE); + int emufs_tipo2_buscar_registro(EMUFS *, int); */ + +#endif /* _EMUFS_TIPO2_H_ */ diff --git a/emufs/tipo3_main.c b/emufs/tipo3_main.c index 559a3c9..d909897 100644 --- a/emufs/tipo3_main.c +++ b/emufs/tipo3_main.c @@ -40,7 +40,7 @@ int main(int argc, char *argv[]) { EMUFS *fp; - int n1, n2, n3, n4, n5, n6, n7, n8; + EMUFS_REG_ID n1, n2, n3, n4, n5, n6, n7, n8; char a[100]; char b[100]; char c[100]; @@ -80,20 +80,20 @@ int main(int argc, char *argv[]) n6 = fp->grabar_registro(fp, g, 100); n7 = fp->grabar_registro(fp, h, 100); n8 = fp->grabar_registro(fp, i, 100);*/ - printf("ID0 = %d\n", n1); - printf("ID1 = %d\n", n2); - printf("ID2 = %d\n", n3); - printf("ID3 = %d\n", n4); - printf("ID4 = %d\n", n5); - printf("ID5 = %d\n", n6); - printf("ID6 = %d\n", n7); + printf("ID0 = %lu\n", n1); + printf("ID1 = %lu\n", n2); + printf("ID2 = %lu\n", n3); + printf("ID3 = %lu\n", n4); + printf("ID4 = %lu\n", n5); + printf("ID5 = %lu\n", n6); + printf("ID6 = %lu\n", n7); -ver_archivo_FS(fp); + ver_archivo_FS(fp); /*fp->borrar_registro(fp, n4, 100); fp->borrar_registro(fp, n2, 100); fp->borrar_registro(fp, n6, 100);*/ - fp->borrar_registro(fp, n1, 100); - printf("borre el registro de id = %d\n",n1); + /*fp->borrar_registro(fp, n1, 100);*/ + /*printf("borre el registro de id = %d\n",n1);*/ fp->leer_registro(fp, n2, b, 100); printf("Recuperado : %s\n", b); -- 2.43.0 From 8eb8116159fc75f96c68bf3379a8aeec5994a97a Mon Sep 17 00:00:00 2001 From: =?utf8?q?Nicol=C3=A1s=20Dimov?= Date: Sat, 10 Apr 2004 18:26:49 +0000 Subject: [PATCH 16/16] =?utf8?q?saco=20todos=20los=20parametros=20de=20tam?= =?utf8?q?a=C3=B1o=20de=20registro=20de=20las=20funciones=20porque=20ahora?= =?utf8?q?=20viene=20metido=20en=20el=20EMUFS*?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- emufs/tipo3.c | 48 ++++++++++++++++------------------------------ emufs/tipo3.h | 11 +++-------- emufs/tipo3_main.c | 4 ++-- 3 files changed, 22 insertions(+), 41 deletions(-) diff --git a/emufs/tipo3.c b/emufs/tipo3.c index f2d1279..5ccb519 100644 --- a/emufs/tipo3.c +++ b/emufs/tipo3.c @@ -38,8 +38,7 @@ #include "tipo3.h" /** Leo un registro del archivo, devuelve cero si no lo encuentra.**/ -int emufs_tipo3_leer_registro(EMUFS *emu, EMUFS_REG_ID ID, void *ptr, - EMUFS_REG_SIZE tam_reg) +int emufs_tipo3_leer_registro(EMUFS *emu, EMUFS_REG_ID ID, void *ptr) { char* bloque; EMUFS_BLOCK_ID block; @@ -66,10 +65,10 @@ int emufs_tipo3_leer_registro(EMUFS *emu, EMUFS_REG_ID ID, void *ptr, memcpy(&ID_aux, bloque+iterador, sizeof(EMUFS_REG_ID)); iterador += sizeof(EMUFS_REG_ID); if ( ID_aux == ID ){ - memcpy(ptr,bloque+iterador,tam_reg); + memcpy(ptr,bloque+iterador,emu->tam_reg); break; } - iterador += tam_reg; + iterador += emu->tam_reg; } free(bloque); @@ -95,7 +94,7 @@ int emufs_tipo3_leer_bloque(EMUFS *emu, EMUFS_REG_ID ID, void* ptr) return 0; } -EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE tam) +EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr) { EMUFS_REG_ID ID_aux; EMUFS_FREE fs; @@ -109,7 +108,7 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE t strcat(name_f,".dat"); /* me devuelve el ID del bloque donde quepa un registro y el espacio libre en "fs"*/ - num_bloque = emufs_fsc_buscar_lugar(emu, tam, &fs); + num_bloque = emufs_fsc_buscar_lugar(emu, emu->tam_reg, &fs); /*si no hay bloques con suficiente espacio creo un bloque nuevo */ if (num_bloque == -1) { if ( (file = fopen(name_f,"a+"))==NULL ) return -1; /*ERROR*/ @@ -121,7 +120,7 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE t /*grabo el id en el bloque*/ memcpy(bloque,&ID_aux,sizeof(EMUFS_REG_ID)); /*grabo el registro en el bloque*/ - memcpy(bloque+sizeof(EMUFS_REG_ID),ptr,tam); + memcpy(bloque+sizeof(EMUFS_REG_ID),ptr,emu->tam_reg); /* me paro al final del archivo */ fseek(file, 0, SEEK_END); /* grabo el bloque en el final del archivo */ @@ -137,7 +136,7 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE t num_bloque = cant; /* grabo el nuevo registro en el archivo de espacios libres */ /* FIXME FIXME FIXME FALTA TRADUCIR A EMUFS_XXXX */ - if ( emufs_fsc_agregar(emu, num_bloque, emu->tam_bloque - tam - sizeof(int)) != 0 ) { + if ( emufs_fsc_agregar(emu, num_bloque, emu->tam_bloque - emu->tam_reg - sizeof(int)) != 0 ) { free(bloque); return -1; } @@ -155,7 +154,7 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE t /*grabo el id en el bloque*/ memcpy(bloque+emu->tam_bloque-fs,&ID_aux,sizeof(EMUFS_REG_ID)); /*grabo el registro en el bloque*/ - memcpy(bloque+emu->tam_bloque-fs+sizeof(EMUFS_REG_ID),ptr,tam); + memcpy(bloque+emu->tam_bloque-fs+sizeof(EMUFS_REG_ID),ptr,emu->tam_reg); /*guardo el bloque en el archivo*/ if ( emufs_tipo3_grabar_bloque(emu, bloque, num_bloque) != 0) { printf("error al grabar bloque\n"); @@ -163,7 +162,7 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE t } /*actualizo el archivo de espacios libres*/ /* FIXME FIXME FIXME FALTA TRADUCIR A EMUFS_XXXX */ - if ( emufs_fsc_actualizar(emu, num_bloque, fs - tam - sizeof(int)) != 0 ){ + if ( emufs_fsc_actualizar(emu, num_bloque, fs - emu->tam_reg - sizeof(int)) != 0 ){ free(bloque); return -1; } @@ -209,7 +208,7 @@ int emufs_tipo3_grabar_bloque(EMUFS *emu, void *ptr, EMUFS_BLOCK_ID num) } /*borra un registro de un bloque y acomoda los registros que quedan*/ -int emufs_tipo3_borrar_registro(EMUFS *emu, EMUFS_REG_ID ID, EMUFS_REG_SIZE tam_reg) +int emufs_tipo3_borrar_registro(EMUFS *emu, EMUFS_REG_ID ID) { EMUFS_BLOCK_SIZE num_bloque; EMUFS_BLOCK_SIZE ptr_elim; @@ -222,6 +221,7 @@ int emufs_tipo3_borrar_registro(EMUFS *emu, EMUFS_REG_ID ID, EMUFS_REG_SIZE tam_ bloque = (char*)malloc(emu->tam_bloque); if ( emufs_tipo3_leer_bloque(emu,num_bloque, bloque) == -1 ) { printf("No se encontro el bloque\n"); + free(bloque); return -1; } @@ -231,49 +231,35 @@ int emufs_tipo3_borrar_registro(EMUFS *emu, EMUFS_REG_ID ID, EMUFS_REG_SIZE tam_ memcpy(&ID_aux, bloque+ptr_elim, sizeof(EMUFS_REG_ID)); if ( ID_aux == ID ) break; - ptr_elim += tam_reg + sizeof(EMUFS_REG_ID); + ptr_elim += emu->tam_reg + sizeof(EMUFS_REG_ID); } /*apunto al registro que voy a mover*/ - ptr_mov = ptr_elim + tam_reg + sizeof(EMUFS_REG_ID); + ptr_mov = ptr_elim + emu->tam_reg + sizeof(EMUFS_REG_ID); while ( ptr_mov < emu->tam_bloque ){ - memcpy(bloque+ptr_elim, bloque+ptr_mov, sizeof(EMUFS_REG_ID)+tam_reg); + memcpy(bloque+ptr_elim, bloque+ptr_mov, sizeof(EMUFS_REG_ID)+emu->tam_reg); ptr_elim = ptr_mov; - ptr_mov += sizeof(EMUFS_REG_ID) + tam_reg; + ptr_mov += sizeof(EMUFS_REG_ID) + emu->tam_reg; } /*grabo el bloque en el archivo*/ if ( emufs_tipo3_grabar_bloque(emu, bloque, num_bloque) == -1 ){ + free(bloque); printf("No se pudo grabar el bloque\n"); return -1; } /*actualizo archivo .fsc*/ fs = emufs_fsc_get_fs(emu, num_bloque); - if ( emufs_fsc_actualizar(emu, num_bloque, fs + tam_reg + sizeof(EMUFS_REG_ID)) != 0 ) return -1; + if ( emufs_fsc_actualizar(emu, num_bloque, fs + emu->tam_reg + sizeof(EMUFS_REG_ID)) != 0 ) return -1; /*actualizo archivo .did*/ if ( emufs_did_agregar(emu, ID) != 0 ) return -1; /*actualizo archivo .idx*/ - if ( emufs_idx_borrar(emu, ID) != 0 ) return -1; - - /*busco el registro que tengo que eliminar*/ - /* GAZER VER */ -/* if ( (f_block_reg = fopen(name_f_block_reg,"r+")) == NULL ) return -1; - while ( !feof(f_block_reg) ){ - if ( fread(®_b,sizeof(BLOCK_REG_T),1,f_block_reg) != 1 ) continue; - if ( reg_b.id_reg == ID ) - break; - }*/ -/* fseek(f_block_reg, -sizeof(BLOCK_REG_T), SEEK_CUR);*/ - /* Estoy parado sobre el punto id/registro que debo borrar */ - /*justifico en archivo a la izquieda*/ - free(bloque); - return 0; } diff --git a/emufs/tipo3.h b/emufs/tipo3.h index 2b9fdeb..e52986a 100644 --- a/emufs/tipo3.h +++ b/emufs/tipo3.h @@ -48,14 +48,13 @@ #include "fsc.h" /** Lee el registro \param id_reg y lo almacena en \param ptr */ -int emufs_tipo3_leer_registro(EMUFS *emu, EMUFS_REG_ID id_reg, void *ptr, - EMUFS_REG_SIZE tam_reg); +int emufs_tipo3_leer_registro(EMUFS *emu, EMUFS_REG_ID id_reg, void *ptr); /** Lee el bloque \param num_bloque y lo almacena en \param ptr */ int emufs_tipo3_leer_bloque(EMUFS *emu, EMUFS_BLOCK_ID num_bloque, void *ptr); /** Graba el registro apuntado por \param ptr en el archivo */ -EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE tam_reg); +EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr); /** Graba el bloque apuntado por \param ptr en el archivo */ int emufs_tipo3_grabar_bloque(EMUFS *emu, void *ptr, EMUFS_BLOCK_ID num_bloque); @@ -64,10 +63,6 @@ EMUFS_REG_ID emufs_tipo3_get_id(EMUFS *emu); int emufs_tipo3_buscar_registro(EMUFS *emu, EMUFS_REG_ID id_reg); -int emufs_tipo3_buscar_lugar(EMUFS *emu, EMUFS_REG_SIZE tam_reg, - EMUFS_FREE *free_space); - -int emufs_tipo3_borrar_registro(EMUFS *emu, EMUFS_REG_ID id_reg, - EMUFS_REG_SIZE tam_reg); +int emufs_tipo3_borrar_registro(EMUFS *emu, EMUFS_REG_ID id_reg); #endif /* _EMUFS_TIPO3_H_ */ diff --git a/emufs/tipo3_main.c b/emufs/tipo3_main.c index d909897..2fc5dcf 100644 --- a/emufs/tipo3_main.c +++ b/emufs/tipo3_main.c @@ -92,8 +92,8 @@ int main(int argc, char *argv[]) /*fp->borrar_registro(fp, n4, 100); fp->borrar_registro(fp, n2, 100); fp->borrar_registro(fp, n6, 100);*/ - /*fp->borrar_registro(fp, n1, 100);*/ - /*printf("borre el registro de id = %d\n",n1);*/ + fp->borrar_registro(fp, n1); + printf("borre el registro de id = %d\n",n1); fp->leer_registro(fp, n2, b, 100); printf("Recuperado : %s\n", b); -- 2.43.0