From 80aa04fe7756cf1670b51e01238b166d95eb43e4 Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Thu, 15 Apr 2004 05:32:28 +0000 Subject: [PATCH] * Se cambia la implementacion de IDX acorde al enunciado * Se actualizan las funciones que utilizaban API deprecada --- emufs/emufs.c | 8 +-- emufs/idx.c | 143 +++++++++++++++--------------------------- emufs/idx.h | 10 ++- emufs/tipo3.c | 4 +- emufs_gui/articulos.c | 14 ++--- emufs_gui/registros.c | 92 ++++++++++++++++++++------- 6 files changed, 141 insertions(+), 130 deletions(-) diff --git a/emufs/emufs.c b/emufs/emufs.c index 33c114a..297cf9d 100644 --- a/emufs/emufs.c +++ b/emufs/emufs.c @@ -278,17 +278,15 @@ int ver_archivo_FS(EMUFS *emu) fprintf(stderr, "BLOQUES Y REGISTROS\n"); strcpy(name_f_block_free,emu->nombre); strcat(name_f_block_free,".idx"); + f_block_free = fopen(name_f_block_free, "r"); { EMUFS_IDX r; - f_block_free = fopen(name_f_block_free, "r"); - fread(&r, sizeof(EMUFS_IDX), 1, f_block_free); while (!feof(f_block_free)) { + if (fread(&r, sizeof(EMUFS_IDX), 1, f_block_free) != 1) continue; fprintf(stderr, "ID %li en bloque %li\n", r.id_reg, r.location); - fread(&r, sizeof(EMUFS_IDX), 1, f_block_free); } - fclose(f_block_free); } - + fclose(f_block_free); return 0; } diff --git a/emufs/idx.c b/emufs/idx.c index 7e48545..cb2ff78 100644 --- a/emufs/idx.c +++ b/emufs/idx.c @@ -83,21 +83,19 @@ EMUFS_REG_ID emufs_idx_buscar_mayor_id_libre(EMUFS* emu, int* err) *err = 4; /* EMUFS_ERROR_CANT_OPEN_FILE */ return EMUFS_NOT_FOUND; } - while (!feof(f_idx)) { - /* Me aseguro de leer la cantidad de bytes correcta */ - if (fread(®, sizeof(EMUFS_IDX), 1, f_idx) != 1) { - if (feof(f_idx)) break; /* No leyĆ³ por EOF */ - PERR("Error al leer registros de idx"); - *err = 3; /* EMUFS_ERROR_FILE_READ */ - return EMUFS_NOT_FOUND; - } - if (reg.id_reg >= max) { - max = reg.id_reg; - found = 1; - } + + /* Voy a la ultima entrada */ + if (fseek(f_idx, -sizeof(EMUFS_IDX), SEEK_END) != 0) { + fclose(f_idx); + return 0; + } + + if (fread(®, sizeof(EMUFS_IDX), 1, f_idx) == 1) { + found = 1; + max = reg.id_reg; } fclose(f_idx); - + if (found) { return ++max; } else { @@ -121,14 +119,9 @@ EMUFS_BLOCK_ID emufs_idx_buscar_registro(EMUFS *emu, EMUFS_REG_ID reg_id) return EMUFS_NOT_FOUND; } - while (!feof(f_idx)) { - if (fread(®, sizeof(EMUFS_IDX), 1, f_idx) != 1) { - if (feof(f_idx)) break; /* No leyĆ³ por EOF */ - PERR("Error al leer registros de idx"); - /* *err = 3; * EMUFS_ERROR_FILE_READ */ - return EMUFS_NOT_FOUND; - } - if (reg.id_reg == reg_id) { + /* Me muevo a la posicion pedida */ + if (fseek(f_idx, sizeof(EMUFS_IDX)*reg_id, SEEK_SET) == 0) { + if (fread(®, sizeof(EMUFS_IDX), 1, f_idx) == 1) { fclose(f_idx); return reg.location; } @@ -148,13 +141,14 @@ int emufs_idx_agregar(EMUFS *emu, EMUFS_REG_ID id_reg, EMUFS_BLOCK_ID location) strcpy(name_f_idx,emu->nombre); strcat(name_f_idx, EMUFS_IDX_EXT); - if ( (f_idx = fopen(name_f_idx,"a+"))==NULL ) return -1; - - /* Note: Location = Bloque para Tipo 1 y 3, Offset para Tipo 2 */ + if ( (f_idx = fopen(name_f_idx,"a+b"))==NULL ) return -1; + + fseek(f_idx, sizeof(EMUFS_IDX)*id_reg, SEEK_SET); reg.id_reg = id_reg; reg.location = location; fwrite(®,sizeof(EMUFS_IDX),1,f_idx); fclose(f_idx); + return 0; } @@ -164,43 +158,18 @@ int emufs_idx_borrar(EMUFS *emu, EMUFS_REG_ID idreg) FILE *f_idx; EMUFS_IDX reg; 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,"r+"))==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 == idreg ) { - break; - } - } + if ( (f_idx = fopen(name_f_idx,"r+"))==NULL ) return 1; - /* me paro en el que tengo que borrar */ - fseek(f_idx, -sizeof(EMUFS_IDX), SEEK_CUR); - actual = ftell(f_idx); /* Guardo la posicion actual */ - fseek(f_idx, 0, SEEK_END); /* me voy al final */ - final = ftell(f_idx); /* veo cuando ocupa el archivo */ - fseek(f_idx, actual, SEEK_SET);/* vuelvo al lugar desde donde quiero justificar */ - /*calculo cuantos registros tengo que mover */ - cant = (final-actual)/sizeof(EMUFS_IDX); - /*apunto al siguiente del que quiero borrar*/ - /*leo todos los que quedan*/ - for(i=0; inombre); strcat(name_f_idx, EMUFS_IDX_EXT); - if ( (fp = fopen(name_f_idx, "rb"))==NULL){ + if ( (f_idx = fopen(name_f_idx, "rb"))==NULL){ PERR("No se pudo abrir el archvo"); - return -1; + (*cant) = EMUFS_NOT_FOUND; + return NULL; } - fseek(fp, 0l, SEEK_END); - tam = ftell(fp); - fclose(fp); - - return tam/sizeof(EMUFS_IDX); -} - -EMUFS_REG_ID emufs_idx_get_id_at(EMUFS *emu, long pos) -{ - FILE *fp; - char name_f_idx[255]; - EMUFS_IDX id; - - strcpy(name_f_idx,emu->nombre); - strcat(name_f_idx, EMUFS_IDX_EXT); - - if ( (fp = fopen(name_f_idx, "rb")) == NULL){ - PERR("No se pudo abrir el archivo"); - return -1; + tmp = NULL; + count = 0; + while (!feof(f_idx)) { + if (fread(®, sizeof(EMUFS_IDX), 1, f_idx) != 1) continue; + count++; + /* TODO : Verificar errores :-D */ + tmp = realloc(tmp, count); + tmp[count-1] = reg.id_reg; } + fclose(f_idx); - fseek(fp, pos*sizeof(EMUFS_IDX), SEEK_SET); - fread(&id, sizeof(EMUFS_IDX), 1, fp); - fclose(fp); - - return id.id_reg; + (*cant) = count; + return tmp; } int emufs_idx_existe_id(EMUFS *emu, int ID) { - FILE *fp; + FILE *f_idx; char name_f_idx[255]; - EMUFS_IDX id; + EMUFS_IDX reg; strcpy(name_f_idx,emu->nombre); strcat(name_f_idx, EMUFS_IDX_EXT); - if ( (fp = fopen(name_f_idx, "rb")) == NULL){ + if ( (f_idx = fopen(name_f_idx, "rb")) == NULL){ PERR("No se pudo abrir el archivo"); return -1; } - - while ( !feof(fp) ){ - fread(&id, sizeof(EMUFS_IDX), 1, fp); - if ( id.id_reg == ID ){ - fclose(fp); + + if (fseek(f_idx, sizeof(EMUFS_IDX)*ID, SEEK_SET) == 0) { + fread(®, sizeof(EMUFS_IDX), 1, f_idx); + if (reg.location != EMUFS_NOT_FOUND) { + fclose(f_idx); return 0; } } - fclose(fp); + + fclose(f_idx); return -1; } diff --git a/emufs/idx.h b/emufs/idx.h index 1b94da4..c6a9275 100644 --- a/emufs/idx.h +++ b/emufs/idx.h @@ -61,9 +61,13 @@ int emufs_idx_agregar(EMUFS*, EMUFS_BLOCK_ID, EMUFS_REG_ID); int emufs_idx_borrar(EMUFS*, EMUFS_REG_ID); -EMUFS_REG_ID emufs_idx_get_count(EMUFS *); - -EMUFS_REG_ID emufs_idx_get_id_at(EMUFS *, long pos); +/** Retorna un array con los Ids validos del archivo IDX + * + * EL ARRAY DEBE SER LIBERADO! + * \param emu EMUFS + * \param cant Puntero donde guardar la cantidad de items + */ +EMUFS_REG_ID *emufs_idx_get(EMUFS *emu, EMUFS_REG_ID *cant); EMUFS_REG_ID emufs_idx_get_new_id(EMUFS*, int*); diff --git a/emufs/tipo3.c b/emufs/tipo3.c index 3d4a273..f5291ec 100644 --- a/emufs/tipo3.c +++ b/emufs/tipo3.c @@ -313,6 +313,7 @@ EMUFS_Estadisticas emufs_tipo3_leer_estadisticas(EMUFS *emu) { FILE *f; EMUFS_Estadisticas stats; + EMUFS_REG_ID *tmp; char name_f[255]; strcpy(name_f,emu->nombre); @@ -326,7 +327,8 @@ EMUFS_Estadisticas emufs_tipo3_leer_estadisticas(EMUFS *emu) fseek(f,0,SEEK_END); stats.tam_archivo_bytes = ftell(f); stats.cant_bloques = ( ftell(f) - sizeof(EMUFS_Tipo) - sizeof(EMUFS_BLOCK_SIZE) - sizeof(EMUFS_REG_SIZE) )/ emu->tam_bloque; - stats.tam_archivo = emufs_idx_get_count(emu); + tmp = emufs_idx_get(emu, &stats.tam_archivo); + if (tmp) free(tmp); stats.total_fs = emufs_fsc_get_total_fs(emu); /*verificar el segentado*/ stats.info_control = stats.tam_archivo*sizeof(EMUFS_REG_ID) + sizeof(EMUFS_Tipo) + sizeof(EMUFS_BLOCK_SIZE) + sizeof(EMUFS_REG_SIZE); diff --git a/emufs_gui/articulos.c b/emufs_gui/articulos.c index dd4e29a..150910e 100644 --- a/emufs_gui/articulos.c +++ b/emufs_gui/articulos.c @@ -64,11 +64,11 @@ t_LstArticulos *art_cargar(const char *filename, int tipo, int tam_bloque) { xmlDocPtr document; xmlNode *node, *inicio; - int cant, error = 0, i; + int error = 0, i; EMUFS_REG_SIZE size; t_LstArticulos *tmp; lst_articulos = NULL; - EMUFS_REG_ID id; + EMUFS_REG_ID id, *indices, indices_cant; tmp = (t_LstArticulos *)malloc(sizeof(t_LstArticulos)); if (tmp == NULL) return NULL; @@ -123,18 +123,18 @@ t_LstArticulos *art_cargar(const char *filename, int tipo, int tam_bloque) } else { tmp->fp = emufs_abrir("articulos"); /* Ahora trato de recuperar la info */ - cant = emufs_idx_get_count(tmp->fp); - for(i=0; ifp, &indices_cant); + for(i=0; ifp, i); /* Leo el registro */ - save = tmp->fp->leer_registro(tmp->fp, id, &size, &error); + save = tmp->fp->leer_registro(tmp->fp, indices[i], &size, &error); if (procesar_leer_articulo(&art, save, size, tmp) == 1) { - agregar_nodo_articulo(tmp, crear_nodo_articulo(id, art.numero)); + agregar_nodo_articulo(tmp, crear_nodo_articulo(indices[i], art.numero)); free(save); } } + free(indices); } return tmp; diff --git a/emufs_gui/registros.c b/emufs_gui/registros.c index 69d73b6..7c043e7 100644 --- a/emufs_gui/registros.c +++ b/emufs_gui/registros.c @@ -6,6 +6,7 @@ /* Se encarga de reemplazar los \0 un caracter visual, y segurar un \0 al final */ static char *procesar_registro_articulo_tipo3(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho); static char *procesar_registro_articulo_tipo1(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho); +static int preguntar_id(WINDOW *win, EMUFS *fp); void mostrar_info(WINDOW *padre, int h, int offset_alto) { @@ -32,6 +33,7 @@ void mostrar_info(WINDOW *padre, int h, int offset_alto) waddstr(padre, "E"); wattroff(padre, A_BOLD); waddstr(padre, "liminar "); + mvwaddstr(padre, h-offset_alto+6, 8, "Buscar ID : B"); /* Info de leyenda */ wattron(padre, A_BOLD); @@ -50,15 +52,17 @@ void ver_registros(WINDOW *padre, int w, int h) { /* Ventanas donde mostrar las cosas */ char *(*procesar)(EMUFS*, char*, EMUFS_REG_SIZE*, int*, int*); - WINDOW *actual[2]; + WINDOW *actual[2], *dlg; EMUFS_REG_SIZE size; int scroll, actual_ancho; int max_scroll, c, offset_alto; - EMUFS_REG_ID ant_indice, total_indice; /* Indice de registro que tengo en ANT */ + /* Indices que hay validos en IDX */ + EMUFS_REG_ID *indices, indices_total, indices_actual; char *data; /* Registros a mostrar en pantalla */ char codigo[50]; /* Variable para guardar el codigo actual para mandar a modificar */ EMUFS *fp; int pos_actual, ancho_registro, offset, pos; + fp = emufs_abrir("articulos"); wattron(padre, COLOR_PAIR(COLOR_BLUE)); mvwaddstr(padre, 0, 0, "Tipo de archivo : "); @@ -76,10 +80,10 @@ void ver_registros(WINDOW *padre, int w, int h) waddstr(padre, "Registro fijo con bloque parametrizado."); } - total_indice = emufs_idx_get_count(fp); + indices = emufs_idx_get(fp, &indices_total); - ant_indice = 0; - data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual); + indices_actual = 0; + data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual); data = procesar(fp, data, &size, &pos_actual, &ancho_registro); @@ -108,27 +112,40 @@ void ver_registros(WINDOW *padre, int w, int h) scroll = 0; while ((c=getch()) != 13) { switch (c) { + case 'b': + case 'B': + dlg = newwin(4, 50, h/2-2, w/2-25); + box(dlg, 0, 0); + preguntar_id(dlg, fp); + werase(dlg); + wrefresh(dlg); + delwin(dlg); + wrefresh(padre); + curs_set(0); + break; case 'e': case 'E': - if (ant_indice != EMUFS_NOT_FOUND) - fp->borrar_registro(fp, emufs_idx_get_id_at(fp, ant_indice)); + if (indices_actual != EMUFS_NOT_FOUND) + fp->borrar_registro(fp, indices[indices_actual]); - total_indice = emufs_idx_get_count(fp); - if (ant_indice >= total_indice) { - ant_indice = total_indice - 1; + free(indices); + indices = emufs_idx_get(fp, &indices_total); + if (indices_actual >= indices_total) { + indices_actual = indices_total - 1; } - data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual); + data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual); data = procesar(fp, data, &size, &pos_actual, &ancho_registro); break; case 'g': case 'G': art_agregar(NULL); free(data); - data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual); + data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual); data = procesar(fp, data, &size, &pos_actual, &ancho_registro); - total_indice = emufs_idx_get_count(fp); + free(indices); + indices = emufs_idx_get(fp, &indices_total); /* Tengo que re-pintar algunas cosas */ mostrar_info(padre, h, offset_alto); @@ -137,12 +154,12 @@ void ver_registros(WINDOW *padre, int w, int h) break; case 'M': case 'm': /* Quiero editar !!! */ - sprintf(codigo, "%lu", emufs_idx_get_id_at(fp, ant_indice)); + sprintf(codigo, "%lu", indices[indices_actual]); art_modificar(codigo); /* Vuelvo a cargar el articulo actual */ free(data); - data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual); + data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual); data = procesar(fp, data, &size, &pos_actual, &ancho_registro); /* Tengo que re-pintar algunas cosas */ @@ -159,20 +176,20 @@ void ver_registros(WINDOW *padre, int w, int h) if (scroll > max_scroll) scroll = max_scroll; break; case 'l': - if (ant_indice < total_indice) { - ant_indice++; - if (ant_indice >= total_indice) ant_indice = total_indice-1; + if (indices_actual < indices_total) { + indices_actual++; + if (indices_actual >= indices_total) indices_actual = indices_total-1; if (data) free(data); - data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual); + data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual); data = procesar(fp, data, &size, &pos_actual, &ancho_registro); } break; case 'k': - if (ant_indice != EMUFS_NOT_FOUND) { - ant_indice--; - if (ant_indice == EMUFS_NOT_FOUND) ant_indice = 0; + if (indices_actual != EMUFS_NOT_FOUND) { + indices_actual--; + if (indices_actual == EMUFS_NOT_FOUND) indices_actual = 0; if (data) free(data); - data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual); + data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual); data = procesar(fp, data, &size, &pos_actual, &ancho_registro); } @@ -200,6 +217,7 @@ void ver_registros(WINDOW *padre, int w, int h) delwin(actual[0]); wrefresh(padre); curs_set(1); + free(indices); } char *procesar_registro_articulo_tipo3(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho) @@ -347,4 +365,32 @@ char *procesar_registro_articulo_tipo1(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *si return salida; } +int preguntar_id(WINDOW *win, EMUFS *fp) +{ + int n=-1, j=0; + t_Form *form = form_crear(win); + form_agregar_widget(form, INPUT, "ID a buscar", 8, ""); + + do { + if (j != 0) { + curs_set(0); + wattron(win, COLOR_PAIR(COLOR_YELLOW)); + wattron(win, A_BOLD); + mvwaddstr(win, 2, 1, "Registro no encontrado!!"); + wattroff(win, A_BOLD); + wattroff(win, COLOR_PAIR(COLOR_YELLOW)); + wrefresh(win); + getch(); + werase(win); + box(win, 0, 0); + } + form_ejecutar(form, 1,1); + + n = form_obtener_valor_int(form, "ID a buscar"); + j = 1; + } while (emufs_idx_existe_id(fp, n) != 0); + + form_destruir(form); + return n; +} -- 2.43.0