From b34c0fa5d4b221b33c52cee7f240216a9c7fd7ce Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Wed, 14 Apr 2004 06:03:32 +0000 Subject: [PATCH 01/16] * Se agregan leyendas a "Ver Registro" para que sea mas facil adivinar que hacer :-) --- emufs_gui/registros.c | 80 ++++++++++++++++++++++++++----------------- 1 file changed, 49 insertions(+), 31 deletions(-) diff --git a/emufs_gui/registros.c b/emufs_gui/registros.c index b231339..bb8194c 100644 --- a/emufs_gui/registros.c +++ b/emufs_gui/registros.c @@ -3,7 +3,7 @@ #include "idx.h" /* Se encarga de reemplazar los \0 un caracter visual, y segurar un \0 al final */ -static char *procesar_registro(char *ptr, EMUFS_REG_SIZE *size); +static char *procesar_registro_articulo(char *ptr, EMUFS_REG_SIZE *size); #define ACT 0 #define ANT 1 @@ -26,28 +26,55 @@ void ver_registros(WINDOW *padre, int w, int h) ant_indice = 0; data[ANT] = (char *)fp->leer_registro(fp, ant_indice, &size, &error); - data[ANT] = procesar_registro(data[ANT], &size); + data[ANT] = procesar_registro_articulo(data[ANT], &size); data[ACT] = (char *)fp->leer_registro(fp, ant_indice+1, &size, &error); - data[ACT] = procesar_registro(data[ACT], &size); + data[ACT] = procesar_registro_articulo(data[ACT], &size); data[SIG] = (char *)fp->leer_registro(fp, ant_indice+2, &size, &error); - data[SIG] = procesar_registro(data[SIG], &size); + data[SIG] = procesar_registro_articulo(data[SIG], &size); - max_scroll = size / (w/3-2) - (h-4); + max_scroll = size / (w/3-2) - (h-7); if (max_scroll < 0) max_scroll = 0; - actual[0] = derwin(padre, h-2, w/3, 1, w/3); + actual[0] = derwin(padre, h-5, w/3, 1, w/3); actual_ancho = w/3-2; - actual[1] = derwin(actual[0], h-4, w/3-2, 1, 1); + actual[1] = derwin(actual[0], h-7, w/3-2, 1, 1); box(actual[0], 0, 0); - ant[0] = derwin(padre, h-2, w/3, 1, 0); - ant[1] = derwin(ant[0], h-4, w/3-2, 1, 1); + ant[0] = derwin(padre, h-5, w/3, 1, 0); + ant[1] = derwin(ant[0], h-7, w/3-2, 1, 1); box(ant[0], 0, 0); - sig[0] = derwin(padre, h-2, w/3, 1, w/3*2); - sig[1] = derwin(sig[0], h-4, w/3-2, 1, 1); + sig[0] = derwin(padre, h-5, w/3, 1, w/3*2); + sig[1] = derwin(sig[0], h-7, w/3-2, 1, 1); box(sig[0], 0, 0); + curs_set(0); + /* Pongo algunos titulos */ + mvwaddstr(actual[0], 0, w/6-3, "Actual"); + mvwaddstr(ant[0], 0, w/6-4, "Anterior"); + mvwaddstr(sig[0], 0, w/6-4, "Siguiente"); + + /* Info de teclas */ + wattron(padre, A_BOLD); + wattron(padre, COLOR_PAIR(COLOR_RED)); + mvwaddstr(padre, h-4, 5, "Teclas :"); + wattroff(padre, A_BOLD); + wattroff(padre, COLOR_PAIR(COLOR_RED)); + mvwaddstr(padre, h-3, 8, "Salir = ENTER"); + mvwaddstr(padre, h-2, 8, "Scroll = A/Z"); + mvwaddstr(padre, h-1, 8, "Mover registros = K/L"); + + /* Info de leyenda */ + wattron(padre, A_BOLD); + wattron(padre, COLOR_PAIR(COLOR_RED)); + mvwaddstr(padre, h-4, 35, "Leyenda :"); + wattroff(padre, A_BOLD); + wattroff(padre, COLOR_PAIR(COLOR_RED)); + mvwaddstr(padre, h-3, 38, "| = Separador de campos"); + mvwaddstr(padre, h-2, 38, "(XXX) = Campo numerico"); + mvwaddstr(padre, h-1, 38, "* = Relleno en registros fijos"); + + wattron(actual[1], A_BOLD); mvwaddstr(actual[1], 0, 0, data[ACT]); wattroff(actual[1], A_BOLD); @@ -55,10 +82,6 @@ void ver_registros(WINDOW *padre, int w, int h) mvwaddstr(sig[1], 0, 0, data[SIG]); mvwaddstr(ant[1], 0, 0, data[ANT]); - wrefresh(sig[0]); - wrefresh(ant[0]); - wrefresh(actual[0]); - wrefresh(actual[1]); wrefresh(padre); scroll = 0; while ((c=getch()) != 13) { @@ -78,11 +101,11 @@ void ver_registros(WINDOW *padre, int w, int h) ant_indice--; data[ANT] = (char *)fp->leer_registro(fp, ant_indice, &size, &error); - data[ANT] = procesar_registro(data[ANT], &size); + data[ANT] = procesar_registro_articulo(data[ANT], &size); data[ACT] = (char *)fp->leer_registro(fp, ant_indice+1, &size, &error); - data[ACT] = procesar_registro(data[ACT], &size); + data[ACT] = procesar_registro_articulo(data[ACT], &size); data[SIG] = (char *)fp->leer_registro(fp, ant_indice+2, &size, &error); - data[SIG] = procesar_registro(data[SIG], &size); + data[SIG] = procesar_registro_articulo(data[SIG], &size); } break; case 'l': /* Desplazo los registros a izquieda!! */ @@ -93,11 +116,11 @@ void ver_registros(WINDOW *padre, int w, int h) ant_indice++; data[ANT] = (char *)fp->leer_registro(fp, ant_indice, &size, &error); - data[ANT] = procesar_registro(data[ANT], &size); + data[ANT] = procesar_registro_articulo(data[ANT], &size); data[ACT] = (char *)fp->leer_registro(fp, ant_indice+1, &size, &error); - data[ACT] = procesar_registro(data[ACT], &size); + data[ACT] = procesar_registro_articulo(data[ACT], &size); data[SIG] = (char *)fp->leer_registro(fp, ant_indice+2, &size, &error); - data[SIG] = procesar_registro(data[SIG], &size); + data[SIG] = procesar_registro_articulo(data[SIG], &size); } } /* Borro las ventanas */ @@ -111,28 +134,23 @@ void ver_registros(WINDOW *padre, int w, int h) wattroff(actual[1], A_BOLD); if (data[SIG]) mvwaddstr(sig[1], 0, 0, data[SIG]); if (data[ANT]) mvwaddstr(ant[1], 0, 0, data[ANT]); - - /* Refrescos para todos!! */ + + wrefresh(actual[1]); wrefresh(sig[1]); wrefresh(ant[1]); - wrefresh(actual[1]); - wrefresh(actual[0]); wrefresh(padre); } - werase(actual[1]); delwin(actual[1]); - werase(actual[0]); - delwin(actual[0]); delwin(ant[1]); delwin(sig[1]); - werase(sig[0]); + delwin(actual[0]); delwin(sig[0]); - werase(ant[0]); delwin(ant[0]); wrefresh(padre); + curs_set(1); } -static char *procesar_registro(char *ptr, EMUFS_REG_SIZE *size) +static char *procesar_registro_articulo(char *ptr, EMUFS_REG_SIZE *size) { char *tmp, *salida, *tmp1; if (ptr == NULL) return NULL; -- 2.43.0 From 3f9973797bd5e6552493d2c2c4e1b94b23f9a636 Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Wed, 14 Apr 2004 06:25:35 +0000 Subject: [PATCH 02/16] * Si se esta en "Ver registro" y se presiona "e" se abre la ventana para editar los datos de ese registro :-) ... claro que no guarda nada, porque ahora recien voy a editar los tipo1,2,3 para agregarle un modificar_registro que solo llama a borrar y luego a agregar. --- emufs_gui/articulos.c | 27 +++++++++++++++++++++++++-- emufs_gui/gui.c | 2 +- emufs_gui/registros.c | 23 ++++++++++++++++++++--- 3 files changed, 46 insertions(+), 6 deletions(-) diff --git a/emufs_gui/articulos.c b/emufs_gui/articulos.c index 422bbb7..20c960e 100644 --- a/emufs_gui/articulos.c +++ b/emufs_gui/articulos.c @@ -163,12 +163,12 @@ t_Articulo *art_obtener(t_LstArticulos *lst, const char *numero) if (lst == NULL) lst = lst_articulos; if (lst == NULL) return NULL; - nodo = lst->primero; while (nodo) { if (n == nodo->numero) { art = (t_Articulo *)malloc(sizeof(t_Articulo)); /* Ya se cual tengo que retornar. Ahora veo si lo cargo desde el archivo */ + error = 0; tmp = lst->fp->leer_registro(lst->fp, nodo->num_reg, &size, &error); if (error) { @@ -210,12 +210,35 @@ void art_modificar(char *s) t_Form *form; t_Articulo *articulo; char num[11]; + void *tmp; + int error; + EMUFS_REG_SIZE size; win = newwin(8, COLS-2, 13, 1); box(win, 0, 0); wrefresh(win); - articulo = art_form_buscar(win); + if (s == NULL) { + articulo = art_form_buscar(win); + } else { + /* Leo el registro directamente */ + articulo = (t_Articulo *)malloc(sizeof(t_Articulo)); + /* Ya se cual tengo que retornar. Ahora veo si lo cargo desde el archivo */ + error = 0; + tmp = lst_articulos->fp->leer_registro(lst_articulos->fp, atoi(s), &size, &error); + if (error) { + free(articulo); + articulo = NULL; + } else { + if (procesar_leer_articulo(articulo, tmp, size, lst_articulos) != 1) { + free(articulo); + free(tmp); + articulo = NULL; + } else { + free(tmp); + } + } + } if (articulo != NULL) { form = form_crear(win); diff --git a/emufs_gui/gui.c b/emufs_gui/gui.c index ccc9311..79ea648 100644 --- a/emufs_gui/gui.c +++ b/emufs_gui/gui.c @@ -199,7 +199,7 @@ void menu_articulos() p = item_userptr(cur); unpost_menu(menu); refresh(); - p((char *)item_name(cur)); + p(NULL); /* Paso NULL para que ejecute la accion por defecto */ post_menu(menu); box(menu_win,0,0); mvwaddch(menu_win, 2, 0, ACS_LTEE); diff --git a/emufs_gui/registros.c b/emufs_gui/registros.c index bb8194c..2ec0871 100644 --- a/emufs_gui/registros.c +++ b/emufs_gui/registros.c @@ -1,6 +1,7 @@ #include "registros.h" #include "idx.h" +#include "articulos.h" /* Se encarga de reemplazar los \0 un caracter visual, y segurar un \0 al final */ static char *procesar_registro_articulo(char *ptr, EMUFS_REG_SIZE *size); @@ -17,7 +18,8 @@ void ver_registros(WINDOW *padre, int w, int h) int scroll, actual_ancho; int max_scroll, c; EMUFS_REG_ID ant_indice, total_indice; /* Indice de registro que tengo en ANT */ - char *data[3]; + char *data[3]; /* Registros a mostrar en pantalla */ + char codigo[50]; /* Variable para guardar el codigo actual para mandar a modificar */ EMUFS *fp; int error; fp = emufs_abrir("articulos"); @@ -86,11 +88,26 @@ void ver_registros(WINDOW *padre, int w, int h) scroll = 0; while ((c=getch()) != 13) { switch (c) { - case 'a': + case 'e': /* Quiero editar !!! */ + sprintf(codigo, "%lu", ant_indice+1); + fprintf(stderr, "%s", codigo); + art_modificar(codigo); + /* Tengo que re-pintar algunas cosas */ + box(actual[0], 0, 0); + box(sig[0], 0, 0); + box(ant[0], 0, 0); + mvwaddstr(actual[0], 0, w/6-3, "Actual"); + mvwaddstr(ant[0], 0, w/6-4, "Anterior"); + mvwaddstr(sig[0], 0, w/6-4, "Siguiente"); + wrefresh(actual[0]); + wrefresh(sig[0]); + wrefresh(ant[0]); + break; + case 'a': /* Scroll */ scroll--; if (scroll < 0) scroll = 0; break; - case 'z': + case 'z': /* Scroll */ scroll++; if (scroll > max_scroll) scroll = max_scroll; case 'k': /* Desplano los registros a derecha! */ -- 2.43.0 From 075d8b3e11e8832c9dd28a72a2a78a2407635873 Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Wed, 14 Apr 2004 06:57:20 +0000 Subject: [PATCH 03/16] * Se hace una reestructuracion de algunas funciones para facilitar la edicion de registros desde distintos puntos. * Ahora se pueden modificar registros desde "Ver Registros" (y cambia on-the-fly!) y desde Articulos->Modificar --- emufs_gui/Makefile | 2 +- emufs_gui/articulos.c | 38 +++++++++++++++++++++++++++----------- emufs_gui/articulos.h | 2 +- emufs_gui/registros.c | 36 +++++++++++++++++++++--------------- 4 files changed, 50 insertions(+), 28 deletions(-) diff --git a/emufs_gui/Makefile b/emufs_gui/Makefile index e553553..4eddd9b 100644 --- a/emufs_gui/Makefile +++ b/emufs_gui/Makefile @@ -1,4 +1,4 @@ -CFLAGS=-Wall -g -I/usr/include/libxml2 -I../emufs +CFLAGS=-Wall -g -I/usr/include/libxml2 -I../emufs -DDEBUG LDFLAGS= -lmenu -lncurses -lxml2 all: gui diff --git a/emufs_gui/articulos.c b/emufs_gui/articulos.c index 20c960e..13da37c 100644 --- a/emufs_gui/articulos.c +++ b/emufs_gui/articulos.c @@ -4,7 +4,7 @@ static t_LstArticulos *lst_articulos; -static t_Articulo *art_form_buscar(WINDOW *win); +static t_Articulo *art_form_buscar(WINDOW *win, EMUFS_REG_ID *id); static void *procesar_guardar_articulo(t_Articulo *src, EMUFS_REG_SIZE *size, t_LstArticulos *lst); static int procesar_leer_articulo(t_Articulo *dst, void *src, EMUFS_REG_SIZE size, t_LstArticulos *lst); @@ -152,7 +152,7 @@ int art_liberar(t_LstArticulos *l) return 0; } -t_Articulo *art_obtener(t_LstArticulos *lst, const char *numero) +t_Articulo *art_obtener(t_LstArticulos *lst, const char *numero, EMUFS_REG_ID *id) { t_Articulo *art; t_Reg_Articulo *nodo; @@ -166,6 +166,7 @@ t_Articulo *art_obtener(t_LstArticulos *lst, const char *numero) nodo = lst->primero; while (nodo) { if (n == nodo->numero) { + (*id) = nodo->num_reg; art = (t_Articulo *)malloc(sizeof(t_Articulo)); /* Ya se cual tengo que retornar. Ahora veo si lo cargo desde el archivo */ error = 0; @@ -190,7 +191,7 @@ t_Articulo *art_obtener(t_LstArticulos *lst, const char *numero) return NULL; } -t_Articulo *art_form_buscar(WINDOW *win) +t_Articulo *art_form_buscar(WINDOW *win, EMUFS_REG_ID *id) { t_Form *form; t_Articulo *articulo; @@ -198,7 +199,7 @@ t_Articulo *art_form_buscar(WINDOW *win) form = form_crear(win); form_agregar_widget(form, INPUT, "Numero de Artículo", 8, ""); form_ejecutar(form, 1,1); - articulo = art_obtener(NULL, form_obtener_valor_char(form, "Numero de Artículo")); + articulo = art_obtener(NULL, form_obtener_valor_char(form, "Numero de Artículo"), id); form_destruir(form); return articulo; @@ -213,30 +214,30 @@ void art_modificar(char *s) void *tmp; int error; EMUFS_REG_SIZE size; + EMUFS_REG_ID id; win = newwin(8, COLS-2, 13, 1); box(win, 0, 0); wrefresh(win); if (s == NULL) { - articulo = art_form_buscar(win); + articulo = art_form_buscar(win, &id); } else { + id = atoi(s); /* Leo el registro directamente */ articulo = (t_Articulo *)malloc(sizeof(t_Articulo)); /* Ya se cual tengo que retornar. Ahora veo si lo cargo desde el archivo */ error = 0; - tmp = lst_articulos->fp->leer_registro(lst_articulos->fp, atoi(s), &size, &error); + tmp = lst_articulos->fp->leer_registro(lst_articulos->fp, id, &size, &error); if (error) { free(articulo); articulo = NULL; } else { if (procesar_leer_articulo(articulo, tmp, size, lst_articulos) != 1) { free(articulo); - free(tmp); articulo = NULL; - } else { - free(tmp); } + free(tmp); } } @@ -251,7 +252,20 @@ void art_modificar(char *s) form_agregar_widget(form, INPUT, "Stock Mínimo", 8, articulo->emin); form_ejecutar(form, 1,1); - /* TODO : Actualizar registro */ + /* Actualizar registro */ + articulo->numero = form_obtener_valor_int(form, "Numero de Artículo"); + strcpy(articulo->desc, form_obtener_valor_char(form, "Descripción")); + strcpy(articulo->presentacion, form_obtener_valor_char(form, "Presentación")); + strcpy(articulo->existencia, form_obtener_valor_char(form, "Stock Actual")); + strcpy(articulo->pvu, form_obtener_valor_char(form, "PVU")); + strcpy(articulo->emin, form_obtener_valor_char(form, "Stock Mínimo")); + /* Ya actualice los datos, ahora veo de grabarlos */ + tmp = procesar_guardar_articulo(articulo, &size, lst_articulos); + if (tmp) { + error = 0; + lst_articulos->fp->modificar_registro(lst_articulos->fp, id, tmp, size, &error); + free(tmp); + } form_destruir(form); free(articulo); @@ -272,11 +286,13 @@ void art_eliminar(char *s) WINDOW *win; t_Articulo *articulo; t_Reg_Articulo *nodo; + EMUFS_REG_ID id; + win = newwin(8, COLS-2, 13, 1); box(win, 0, 0); wrefresh(win); - articulo = art_form_buscar(win); + articulo = art_form_buscar(win, &id); if (articulo == NULL) { wattron(win, COLOR_PAIR(COLOR_YELLOW)); diff --git a/emufs_gui/articulos.h b/emufs_gui/articulos.h index 53aa750..6ea5693 100644 --- a/emufs_gui/articulos.h +++ b/emufs_gui/articulos.h @@ -34,7 +34,7 @@ typedef struct _lista_articulos_ { t_LstArticulos *art_cargar(const char *filename, int tipo); int art_liberar(t_LstArticulos *l); -t_Articulo *art_obtener(t_LstArticulos *, const char *numero); +t_Articulo *art_obtener(t_LstArticulos *, const char *numero, EMUFS_REG_ID *id); void art_agregar(char *); void art_eliminar(char *); void art_modificar(char *); diff --git a/emufs_gui/registros.c b/emufs_gui/registros.c index 2ec0871..b146a5f 100644 --- a/emufs_gui/registros.c +++ b/emufs_gui/registros.c @@ -36,18 +36,18 @@ void ver_registros(WINDOW *padre, int w, int h) data[SIG] = (char *)fp->leer_registro(fp, ant_indice+2, &size, &error); data[SIG] = procesar_registro_articulo(data[SIG], &size); - max_scroll = size / (w/3-2) - (h-7); + max_scroll = size / (w/3-2) - (h-8); if (max_scroll < 0) max_scroll = 0; - actual[0] = derwin(padre, h-5, w/3, 1, w/3); + actual[0] = derwin(padre, h-6, w/3, 1, w/3); actual_ancho = w/3-2; - actual[1] = derwin(actual[0], h-7, w/3-2, 1, 1); + actual[1] = derwin(actual[0], h-8, w/3-2, 1, 1); box(actual[0], 0, 0); - ant[0] = derwin(padre, h-5, w/3, 1, 0); - ant[1] = derwin(ant[0], h-7, w/3-2, 1, 1); + ant[0] = derwin(padre, h-6, w/3, 1, 0); + ant[1] = derwin(ant[0], h-8, w/3-2, 1, 1); box(ant[0], 0, 0); - sig[0] = derwin(padre, h-5, w/3, 1, w/3*2); - sig[1] = derwin(sig[0], h-7, w/3-2, 1, 1); + sig[0] = derwin(padre, h-6, w/3, 1, w/3*2); + sig[1] = derwin(sig[0], h-8, w/3-2, 1, 1); box(sig[0], 0, 0); curs_set(0); @@ -59,22 +59,23 @@ void ver_registros(WINDOW *padre, int w, int h) /* Info de teclas */ wattron(padre, A_BOLD); wattron(padre, COLOR_PAIR(COLOR_RED)); - mvwaddstr(padre, h-4, 5, "Teclas :"); + mvwaddstr(padre, h-5, 5, "Teclas :"); wattroff(padre, A_BOLD); wattroff(padre, COLOR_PAIR(COLOR_RED)); - mvwaddstr(padre, h-3, 8, "Salir = ENTER"); - mvwaddstr(padre, h-2, 8, "Scroll = A/Z"); - mvwaddstr(padre, h-1, 8, "Mover registros = K/L"); + mvwaddstr(padre, h-4, 8, "Salir = ENTER"); + mvwaddstr(padre, h-3, 8, "Scroll = A/Z"); + mvwaddstr(padre, h-2, 8, "Mover registros = K/L"); + mvwaddstr(padre, h-1, 8, "Editar Actual = e"); /* Info de leyenda */ wattron(padre, A_BOLD); wattron(padre, COLOR_PAIR(COLOR_RED)); - mvwaddstr(padre, h-4, 35, "Leyenda :"); + mvwaddstr(padre, h-5, 35, "Leyenda :"); wattroff(padre, A_BOLD); wattroff(padre, COLOR_PAIR(COLOR_RED)); - mvwaddstr(padre, h-3, 38, "| = Separador de campos"); - mvwaddstr(padre, h-2, 38, "(XXX) = Campo numerico"); - mvwaddstr(padre, h-1, 38, "* = Relleno en registros fijos"); + mvwaddstr(padre, h-4, 38, "| = Separador de campos"); + mvwaddstr(padre, h-3, 38, "(XXX) = Campo numerico"); + mvwaddstr(padre, h-2, 38, "* = Relleno en registros fijos"); wattron(actual[1], A_BOLD); @@ -92,6 +93,11 @@ void ver_registros(WINDOW *padre, int w, int h) sprintf(codigo, "%lu", ant_indice+1); fprintf(stderr, "%s", codigo); art_modificar(codigo); + /* Vuelvo a cargar el articulo actual */ + free(data[ACT]); + data[ACT] = (char *)fp->leer_registro(fp, ant_indice+1, &size, &error); + data[ACT] = procesar_registro_articulo(data[ACT], &size); + /* Tengo que re-pintar algunas cosas */ box(actual[0], 0, 0); box(sig[0], 0, 0); -- 2.43.0 From 15bf403f66891d89987a3a429b83a632fca74c5b Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Wed, 14 Apr 2004 07:05:14 +0000 Subject: [PATCH 04/16] * Se agregan a tipo123 los metodos emufs_tipoX_modificar_registro * Se ajustan punteros dentro de EMUFS en los inicializar * TODO : Tipo1 modificar no anda por faltante de tipo1_borrar!! (lo pongo para que no esten como yo 1 hora sin saber por que se cuelga :-D) --- emufs/Makefile | 2 +- emufs/emufs.c | 9 ++++++--- emufs/tipo1.c | 11 ++++++++--- emufs/tipo1.h | 5 ++++- emufs/tipo2.c | 9 ++++++++- emufs/tipo2.h | 3 +++ emufs/tipo3.c | 10 ++++++++-- emufs/tipo3.h | 3 +++ 8 files changed, 41 insertions(+), 11 deletions(-) diff --git a/emufs/Makefile b/emufs/Makefile index 83cf49d..787a555 100644 --- a/emufs/Makefile +++ b/emufs/Makefile @@ -1,4 +1,4 @@ -CFLAGS=-Wall -g -ansi -pedantic -DDEBUG +CFLAGS=-Wall -g -ansi -pedantic -DDEBUG LDFLAGS= EMUFS_COMMON=emufs.o tipo1.o tipo2.o tipo3.o idx.o did.o fsc.o diff --git a/emufs/emufs.c b/emufs/emufs.c index 23cc027..a511e50 100644 --- a/emufs/emufs.c +++ b/emufs/emufs.c @@ -162,7 +162,8 @@ EMUFS *emufs_crear(const char *filename, EMUFS_Tipo tipo, EMUFS_BLOCK_SIZE tam_b efs->grabar_registro = emufs_tipo3_grabar_registro; efs->borrar_registro = emufs_tipo3_borrar_registro; efs->leer_estadisticas = emufs_tipo3_leer_estadisticas; - + efs->modificar_registro = emufs_tipo3_modificar_registro; + fprintf(stderr, "Crear : %p\n", efs->modificar_registro); /* Guarda cabeceras propias. */ fwrite(&tam_bloque, sizeof(EMUFS_BLOCK_SIZE), 1, fp); fwrite(&tam_reg, sizeof(EMUFS_REG_SIZE), 1, fp); @@ -230,10 +231,12 @@ EMUFS *emufs_abrir(const char *filename) return NULL; } /* Asigna punteros a funciones. */ - efs->leer_bloque = emufs_tipo3_leer_bloque; - efs->leer_registro = emufs_tipo3_leer_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->leer_estadisticas = emufs_tipo3_leer_estadisticas; + efs->modificar_registro = emufs_tipo3_modificar_registro; break; } diff --git a/emufs/tipo1.c b/emufs/tipo1.c index 042fdb4..024839b 100644 --- a/emufs/tipo1.c +++ b/emufs/tipo1.c @@ -63,7 +63,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; } @@ -303,8 +303,7 @@ int emufs_tipo1_buscar_registro(EMUFS *emu, EMUFS_REG_ID id_reg) return -1; /* FIXME Error */ } -int emufs_tipo1_borrar_registro(EMUFS *emu, EMUFS_REG_ID id_reg, - EMUFS_REG_SIZE tam_reg) +int emufs_tipo1_borrar_registro(EMUFS *emu, EMUFS_REG_ID id_reg) { return -1; /* FIXME Error */ } @@ -346,3 +345,9 @@ void emufs_tipo1_escribir_reg_en_memoria(char* dst, EMUFS_REG_ID reg_id, /* grabo el registro en el bloque */ memcpy(dst, reg, reg_size); } + +EMUFS_REG_ID emufs_tipo1_modificar_registro(EMUFS *emu, EMUFS_REG_ID id, void *data, EMUFS_REG_SIZE size, int *error) +{ + emufs_tipo1_borrar_registro(emu, id); + return emufs_tipo1_grabar_registro(emu, data, size, error); +} diff --git a/emufs/tipo1.h b/emufs/tipo1.h index 00e63d5..d61bcf2 100644 --- a/emufs/tipo1.h +++ b/emufs/tipo1.h @@ -56,7 +56,10 @@ EMUFS_BLOCK_ID emufs_tipo1_grabar_bloque(EMUFS*, void*, EMUFS_BLOCK_ID, int*); int emufs_tipo1_buscar_registro(EMUFS*, EMUFS_REG_ID); -int emufs_tipo1_borrar_registro(EMUFS*, EMUFS_REG_ID, EMUFS_REG_SIZE); +int emufs_tipo1_borrar_registro(EMUFS*, EMUFS_REG_ID); + +/** Método para modificar un registro */ +EMUFS_REG_ID emufs_tipo1_modificar_registro(EMUFS *emu, EMUFS_REG_ID, void*, EMUFS_REG_SIZE, int*); /* int emufs_tipo1_buscar_lugar(EMUFS *emu, EMUFS_REG_SIZE tam_reg, diff --git a/emufs/tipo2.c b/emufs/tipo2.c index 2380249..7047e45 100644 --- a/emufs/tipo2.c +++ b/emufs/tipo2.c @@ -46,8 +46,9 @@ int emufs_tipo2_inicializar(EMUFS* efs) { efs->grabar_registro = emufs_tipo2_grabar_registro; - efs->borrar_registro = emufs_tipo2_borrar_registro; + efs->borrar_registro = emufs_tipo2_borrar_registro; efs->leer_registro = emufs_tipo2_leer_registro; + efs->modificar_registro = emufs_tipo2_modificar_registro; return 0; } @@ -228,3 +229,9 @@ int emufs_tipo2_dummyfill(EMUFS *efs, EMUFS_OFFSET reg_pos, EMUFS_REG_SIZE amoun free(dummyfill); return (0); } + +EMUFS_REG_ID emufs_tipo2_modificar_registro(EMUFS *emu, EMUFS_REG_ID id, void *data, EMUFS_REG_SIZE size, int *error) +{ + emufs_tipo2_borrar_registro(emu, id); + return emufs_tipo2_grabar_registro(emu, data, size, error); +} diff --git a/emufs/tipo2.h b/emufs/tipo2.h index e663b7d..f8885ec 100644 --- a/emufs/tipo2.h +++ b/emufs/tipo2.h @@ -116,4 +116,7 @@ int emufs_tipo2_get_regsize(EMUFS *efs, EMUFS_OFFSET reg_pos, EMUFS_REG_SIZE *re */ int emufs_tipo2_dummyfill(EMUFS *efs, EMUFS_OFFSET reg_pos, EMUFS_REG_SIZE amount); +/** Método para modificar un registro */ +EMUFS_REG_ID emufs_tipo2_modificar_registro(EMUFS *emu, EMUFS_REG_ID id, void *data, EMUFS_REG_SIZE size, int *error); + #endif /* _EMUFS_TIPO2_H_ */ diff --git a/emufs/tipo3.c b/emufs/tipo3.c index 0a457f9..24153cb 100644 --- a/emufs/tipo3.c +++ b/emufs/tipo3.c @@ -299,6 +299,12 @@ EMUFS_Estadisticas emufs_tipo3_leer_estadisticas(EMUFS *emu) stats.info_control = stats.tam_archivo*sizeof(EMUFS_REG_ID) + sizeof(EMUFS_Tipo) + sizeof(EMUFS_BLOCK_SIZE) + sizeof(EMUFS_REG_SIZE); stats.media_fs = stats.total_fs/stats.cant_bloques; fclose(f); - return stats; - + return stats; } + +EMUFS_REG_ID emufs_tipo3_modificar_registro(EMUFS *emu, EMUFS_REG_ID id, void *data, EMUFS_REG_SIZE size, int *error) +{ + emufs_tipo3_borrar_registro(emu, id); + return emufs_tipo3_grabar_registro(emu, data, size, error); +} + diff --git a/emufs/tipo3.h b/emufs/tipo3.h index f99a658..5e9b547 100644 --- a/emufs/tipo3.h +++ b/emufs/tipo3.h @@ -62,6 +62,9 @@ int emufs_tipo3_grabar_bloque(EMUFS *emu, void *ptr, EMUFS_BLOCK_ID num_bloque); int emufs_tipo3_borrar_registro(EMUFS *emu, EMUFS_REG_ID id_reg); int emufs_tipo3_buscar_registro(EMUFS *emu, EMUFS_REG_ID id_reg); + +/** Método para modificar un registro */ +EMUFS_REG_ID emufs_tipo3_modificar_registro(EMUFS *emu, EMUFS_REG_ID, void*, EMUFS_REG_SIZE, int*); EMUFS_Estadisticas emufs_tipo3_leer_estadisticas(EMUFS *); -- 2.43.0 From c44140901674eea943d44ef522337fae17feb3c1 Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Wed, 14 Apr 2004 07:28:48 +0000 Subject: [PATCH 05/16] * Agrego un msg de advertencia a la GUI si se compila con -DDEBUG, para prevenir al usuario de redirigir el flujo stderr a un archivo por posibles problemas entre curses y fprintf * Mejoro parser de opciones --- emufs_gui/gui.c | 62 ++++++++++++++++++++++++++++++++----------- emufs_gui/registros.c | 1 - 2 files changed, 46 insertions(+), 17 deletions(-) diff --git a/emufs_gui/gui.c b/emufs_gui/gui.c index 79ea648..3800f9d 100644 --- a/emufs_gui/gui.c +++ b/emufs_gui/gui.c @@ -22,23 +22,28 @@ void menu_articulos(); WINDOW *msg_box(WINDOW *win, int w, int h, const char *format, ...); void msg_box_free(WINDOW *padre, WINDOW *win); +typedef enum {PARAM_OK, SHOW_HELP, TIPO_NO_DEFINIDO, TIPO_INVALIDO} t_Param; + /* Verifica Argumentos */ -int param_ok(int argc, char *argv[]) +t_Param param_ok(int argc, char *argv[]) { - int n; - switch (argc) { - case 1: - return 1; - case 2: - if (strcmp("-h", argv[1]) == 0) { - return 0; + int n,i; + for(i=1; i 3)) return TIPO_INVALIDO; + } else { + /* Ops, no hay mas parametros */ + return TIPO_NO_DEFINIDO; } - case 3: - n = atoi(argv[2]); - if ((n<1) || (n>3)) - return 0; + } } - return 1; + + return PARAM_OK; } void print_help(char *s) @@ -54,11 +59,36 @@ int main(int argc, char *argv[]) int c, fin=0; WINDOW *dialog; - if (!param_ok(argc, argv)) { - print_help(argv[0]); - return -1; + switch (param_ok(argc, argv)) { + case SHOW_HELP: + print_help(argv[0]); + return 0; + case TIPO_NO_DEFINIDO: + printf("Falta parámetro requerido. Luego del nombre del archivo debe especificar el tipo de archivo\n"); + return 1; + case TIPO_INVALIDO: + printf("Tipo de archivo no valido. Los valores posibles para el tipo de archivo son:\n"); + printf("\t1 - Archivo de bloque parametrizado y registro de long. variable.\n"); + printf("\t2 - Archivo de registros variables sin bloques.\n"); + printf("\t3 - Archivos de bloque parametrizado y registro de long. parametrizada.\n"); + return 2; + case PARAM_OK: + fin = 0; } +#ifdef DEBUG + printf("CUIDADO! - Uds esta a punto de ejecutar EMUFS Gui compilado con mensajes de debug (-DDEBUG). "); + printf("Esto puede causar que ante un error alguna función trate de emitir un mensaje por pantalla "); + printf("haciendo que el aspecto visual se vea desvirtuado.\n\n"); + printf("Todos los mensajes de error se envian por stderr, por lo que es conveniente que vuelva a ejecutar "); + printf("el programa de la siguiente manera :\n"); + printf("\t#> %s 2> error.log\n\n", argv[0]); + printf("De esta forma el SO se encargaga de redirigir stderr al archivo error.log y evitar algun problema en "); + printf("visualizacion de la aplicacion.\n"); + printf("Para continuar **bajo su propio riesgo** presione una tecla. Puede cancelar la ejecucion en este punto con CTRL+C\n"); + fgetc(stdin); +#endif + /* Inicio Curses */ signal(SIGINT, finish); initscr(); diff --git a/emufs_gui/registros.c b/emufs_gui/registros.c index b146a5f..a7c05b4 100644 --- a/emufs_gui/registros.c +++ b/emufs_gui/registros.c @@ -91,7 +91,6 @@ void ver_registros(WINDOW *padre, int w, int h) switch (c) { case 'e': /* Quiero editar !!! */ sprintf(codigo, "%lu", ant_indice+1); - fprintf(stderr, "%s", codigo); art_modificar(codigo); /* Vuelvo a cargar el articulo actual */ free(data[ACT]); -- 2.43.0 From 881d70c97e3314ad76b7eabefe22e80137fba0c6 Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Wed, 14 Apr 2004 07:44:56 +0000 Subject: [PATCH 06/16] * Agrego Widgets de solo lectura en los formularios. --- emufs/emufs.c | 3 +-- emufs_gui/articulos.c | 1 + emufs_gui/form.c | 17 ++++++++++++++++- emufs_gui/form.h | 10 ++++++++++ 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/emufs/emufs.c b/emufs/emufs.c index a511e50..293d556 100644 --- a/emufs/emufs.c +++ b/emufs/emufs.c @@ -163,7 +163,6 @@ EMUFS *emufs_crear(const char *filename, EMUFS_Tipo tipo, EMUFS_BLOCK_SIZE tam_b efs->borrar_registro = emufs_tipo3_borrar_registro; efs->leer_estadisticas = emufs_tipo3_leer_estadisticas; efs->modificar_registro = emufs_tipo3_modificar_registro; - fprintf(stderr, "Crear : %p\n", efs->modificar_registro); /* Guarda cabeceras propias. */ fwrite(&tam_bloque, sizeof(EMUFS_BLOCK_SIZE), 1, fp); fwrite(&tam_reg, sizeof(EMUFS_REG_SIZE), 1, fp); @@ -262,7 +261,7 @@ int ver_archivo_FS(EMUFS *emu) strcat(name_f_block_free,".fsc"); if ( (f_block_free = fopen(name_f_block_free,"r"))==NULL ){ - printf("no pude abrir el archivo %s\n",name_f_block_free); + fprintf(stderr, "no pude abrir el archivo %s\n",name_f_block_free); return -1; } fread(®,sizeof(reg),1,f_block_free); diff --git a/emufs_gui/articulos.c b/emufs_gui/articulos.c index 13da37c..f9a00cc 100644 --- a/emufs_gui/articulos.c +++ b/emufs_gui/articulos.c @@ -245,6 +245,7 @@ void art_modificar(char *s) form = form_crear(win); sprintf(num, "%08d", articulo->numero); form_agregar_widget(form, INPUT, "Numero de Artículo", 8, num); + form_es_modificable(form, "Numero de Artículo" , 0); form_agregar_widget(form, INPUT, "Descripción", 50, articulo->desc); form_agregar_widget(form, INPUT, "Presentación", 30, articulo->presentacion); form_agregar_widget(form, INPUT, "Stock Actual", 8, articulo->existencia); diff --git a/emufs_gui/form.c b/emufs_gui/form.c index d86d4b1..9e5cb57 100644 --- a/emufs_gui/form.c +++ b/emufs_gui/form.c @@ -80,6 +80,7 @@ void form_agregar_widget(t_Form *f, t_Campo tipo, const char *nombre, unsigned i /* Si se creo wl widget, lo agrego al formulario al final */ if (tmp) { + tmp->modificable = 1; if (f->primero == NULL) { f->primero = f->ultimo = tmp; } else { @@ -126,7 +127,8 @@ void form_ejecutar(t_Form *f, int x, int y) while (tmp) { ++my_y; wmove(f->win, my_y, x+offset); - salida = tmp->ejecutar(f->win, x+offset, my_y, tmp); + if (tmp->modificable) + salida = tmp->ejecutar(f->win, x+offset, my_y, tmp); wrefresh(f->win); tmp = tmp->sig; } @@ -356,3 +358,16 @@ int form_radio(WINDOW *win, int x, int y, t_Widget *w) return 0; } +void form_es_modificable(t_Form *f, const char *widget, int b) +{ + /* Busco el widget */ + t_Widget *tmp = f->primero; + while (tmp) { + if (strcmp(widget, tmp->nombre) == 0) { + tmp->modificable = b; + break; + } + tmp = tmp->sig; + } +} + diff --git a/emufs_gui/form.h b/emufs_gui/form.h index be9da37..3b5bd57 100644 --- a/emufs_gui/form.h +++ b/emufs_gui/form.h @@ -42,6 +42,8 @@ typedef struct _elem_ { /** Siguiente elemento */ struct _elem_ *sig; + int modificable; + /* Métodos */ int (*ejecutar)(WINDOW *win, int x, int y, struct _elem_ *w); void (*destruir)(struct _elem_ *); @@ -91,6 +93,14 @@ void form_agregar_widget(t_Form *f, t_Campo tipo, const char *nombre, unsigned i */ void form_ejecutar(t_Form *f, int x, int y); +/** Establece si un Widget puede ser modificado + * + * \param f Formulario. + * \param widget Nombre del Widget. + * \param b Valor booleano + */ +void form_es_modificable(t_Form *f, const char *widget, int b); + /** Obtiene el valor asociado a un campo como char * * * \param f Formulario. -- 2.43.0 From 2f11b196bec87977b7af6087fab42e986d24b743 Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Wed, 14 Apr 2004 17:56:59 +0000 Subject: [PATCH 07/16] * Modifico el ver registro porque como estaba antes no era como se pedia. Ahora se ajusta mas a lo pedido. --- emufs_gui/articulos.c | 2 +- emufs_gui/registros.c | 195 +++++++++++++++++++++--------------------- 2 files changed, 98 insertions(+), 99 deletions(-) diff --git a/emufs_gui/articulos.c b/emufs_gui/articulos.c index f9a00cc..072bb9a 100644 --- a/emufs_gui/articulos.c +++ b/emufs_gui/articulos.c @@ -94,7 +94,7 @@ t_LstArticulos *art_cargar(const char *filename, int tipo) node = node->next; } - tmp->fp = emufs_crear("articulos", tipo-1, sizeof(t_Articulo)*2, sizeof(t_Articulo)); + tmp->fp = emufs_crear("articulos", tipo-1, sizeof(t_Articulo)*4+128, sizeof(t_Articulo)); for (node=inicio ; node ; node = node->next) { if (node->type == XML_ELEMENT_NODE) { if (strcmp(node->name, "ARTICULO") == 0) { diff --git a/emufs_gui/registros.c b/emufs_gui/registros.c index a7c05b4..ab6b5bc 100644 --- a/emufs_gui/registros.c +++ b/emufs_gui/registros.c @@ -4,7 +4,7 @@ #include "articulos.h" /* Se encarga de reemplazar los \0 un caracter visual, y segurar un \0 al final */ -static char *procesar_registro_articulo(char *ptr, EMUFS_REG_SIZE *size); +static char *procesar_registro_articulo(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual); #define ACT 0 #define ANT 1 @@ -13,48 +13,34 @@ static char *procesar_registro_articulo(char *ptr, EMUFS_REG_SIZE *size); void ver_registros(WINDOW *padre, int w, int h) { /* Ventanas donde mostrar las cosas */ - WINDOW *actual[2], *ant[2], *sig[2]; + WINDOW *actual[2]; EMUFS_REG_SIZE size; int scroll, actual_ancho; int max_scroll, c; EMUFS_REG_ID ant_indice, total_indice; /* Indice de registro que tengo en ANT */ - char *data[3]; /* Registros a mostrar en pantalla */ + char *data; /* Registros a mostrar en pantalla */ char codigo[50]; /* Variable para guardar el codigo actual para mandar a modificar */ EMUFS *fp; - int error; + int pos_actual, ancho_registro; fp = emufs_abrir("articulos"); total_indice = emufs_idx_get_count(fp); - ant_indice = 0; - data[ANT] = (char *)fp->leer_registro(fp, ant_indice, &size, &error); - data[ANT] = procesar_registro_articulo(data[ANT], &size); - - data[ACT] = (char *)fp->leer_registro(fp, ant_indice+1, &size, &error); - data[ACT] = procesar_registro_articulo(data[ACT], &size); - - data[SIG] = (char *)fp->leer_registro(fp, ant_indice+2, &size, &error); - data[SIG] = procesar_registro_articulo(data[SIG], &size); + ant_indice = 1; + data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual); + data = procesar_registro_articulo(fp, data, &size, &pos_actual); + + ancho_registro = sizeof(t_Articulo)-sizeof(unsigned int)*2+20; max_scroll = size / (w/3-2) - (h-8); if (max_scroll < 0) max_scroll = 0; - actual[0] = derwin(padre, h-6, w/3, 1, w/3); - actual_ancho = w/3-2; - actual[1] = derwin(actual[0], h-8, w/3-2, 1, 1); + actual[0] = derwin(padre, h-6, w-2, 1, 1); + actual_ancho = w-4; + actual[1] = derwin(actual[0], h-8, w-4, 1, 1); box(actual[0], 0, 0); - ant[0] = derwin(padre, h-6, w/3, 1, 0); - ant[1] = derwin(ant[0], h-8, w/3-2, 1, 1); - box(ant[0], 0, 0); - sig[0] = derwin(padre, h-6, w/3, 1, w/3*2); - sig[1] = derwin(sig[0], h-8, w/3-2, 1, 1); - box(sig[0], 0, 0); curs_set(0); - /* Pongo algunos titulos */ - mvwaddstr(actual[0], 0, w/6-3, "Actual"); - mvwaddstr(ant[0], 0, w/6-4, "Anterior"); - mvwaddstr(sig[0], 0, w/6-4, "Siguiente"); /* Info de teclas */ wattron(padre, A_BOLD); @@ -64,7 +50,7 @@ void ver_registros(WINDOW *padre, int w, int h) wattroff(padre, COLOR_PAIR(COLOR_RED)); mvwaddstr(padre, h-4, 8, "Salir = ENTER"); mvwaddstr(padre, h-3, 8, "Scroll = A/Z"); - mvwaddstr(padre, h-2, 8, "Mover registros = K/L"); + mvwaddstr(padre, h-2, 8, "Seleccionar registros = K/L"); mvwaddstr(padre, h-1, 8, "Editar Actual = e"); /* Info de leyenda */ @@ -73,40 +59,40 @@ void ver_registros(WINDOW *padre, int w, int h) mvwaddstr(padre, h-5, 35, "Leyenda :"); wattroff(padre, A_BOLD); wattroff(padre, COLOR_PAIR(COLOR_RED)); - mvwaddstr(padre, h-4, 38, "| = Separador de campos"); - mvwaddstr(padre, h-3, 38, "(XXX) = Campo numerico"); - mvwaddstr(padre, h-2, 38, "* = Relleno en registros fijos"); - + mvwaddstr(padre, h-4, 38, "| = Separador de campo"); + mvwaddstr(padre, h-3, 38, "[XXX] = Campo numerico"); + mvwaddstr(padre, h-2, 38, "(XXX) = ID de registro"); + mvwaddnstr(actual[1], 0, 0, data, pos_actual); wattron(actual[1], A_BOLD); - mvwaddstr(actual[1], 0, 0, data[ACT]); + waddnstr(actual[1], data+pos_actual, ancho_registro); wattroff(actual[1], A_BOLD); + waddnstr(actual[1], data+pos_actual+ancho_registro, size-(pos_actual+ancho_registro)); - mvwaddstr(sig[1], 0, 0, data[SIG]); - mvwaddstr(ant[1], 0, 0, data[ANT]); - + wrefresh(actual[1]); + wrefresh(actual[0]); wrefresh(padre); scroll = 0; while ((c=getch()) != 13) { switch (c) { case 'e': /* Quiero editar !!! */ - sprintf(codigo, "%lu", ant_indice+1); + sprintf(codigo, "%lu", emufs_idx_get_id_at(fp, ant_indice)); art_modificar(codigo); /* Vuelvo a cargar el articulo actual */ - free(data[ACT]); - data[ACT] = (char *)fp->leer_registro(fp, ant_indice+1, &size, &error); - data[ACT] = procesar_registro_articulo(data[ACT], &size); + + free(data); + data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual); + data = procesar_registro_articulo(fp, data, &size, &pos_actual); /* Tengo que re-pintar algunas cosas */ + wattron(padre, A_BOLD); + wattron(padre, COLOR_PAIR(COLOR_RED)); + mvwaddstr(padre, h-5, 5, "Teclas :"); + mvwaddstr(padre, h-5, 35, "Leyenda :"); + wattroff(padre, A_BOLD); + wattroff(padre, COLOR_PAIR(COLOR_RED)); box(actual[0], 0, 0); - box(sig[0], 0, 0); - box(ant[0], 0, 0); - mvwaddstr(actual[0], 0, w/6-3, "Actual"); - mvwaddstr(ant[0], 0, w/6-4, "Anterior"); - mvwaddstr(sig[0], 0, w/6-4, "Siguiente"); wrefresh(actual[0]); - wrefresh(sig[0]); - wrefresh(ant[0]); break; case 'a': /* Scroll */ scroll--; @@ -115,83 +101,96 @@ void ver_registros(WINDOW *padre, int w, int h) case 'z': /* Scroll */ scroll++; if (scroll > max_scroll) scroll = max_scroll; - case 'k': /* Desplano los registros a derecha! */ + case 'l': + if (ant_indice < total_indice) { + ant_indice++; + if (ant_indice >= total_indice) ant_indice = total_indice-1; + if (data) free(data); + data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual); + data = procesar_registro_articulo(fp, data, &size, &pos_actual); + } + break; + case 'k': if (ant_indice != EMUFS_NOT_FOUND) { - if (data[ANT]) free(data[ANT]); - if (data[ACT]) free(data[ACT]); - if (data[SIG]) free(data[SIG]); ant_indice--; - - data[ANT] = (char *)fp->leer_registro(fp, ant_indice, &size, &error); - data[ANT] = procesar_registro_articulo(data[ANT], &size); - data[ACT] = (char *)fp->leer_registro(fp, ant_indice+1, &size, &error); - data[ACT] = procesar_registro_articulo(data[ACT], &size); - data[SIG] = (char *)fp->leer_registro(fp, ant_indice+2, &size, &error); - data[SIG] = procesar_registro_articulo(data[SIG], &size); + if (ant_indice == EMUFS_NOT_FOUND) ant_indice = 0; + if (data) free(data); + data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual); + data = procesar_registro_articulo(fp, data, &size, &pos_actual); } - break; - case 'l': /* Desplazo los registros a izquieda!! */ - if (ant_indice+1 < total_indice-1) { - if (data[ANT]) free(data[ANT]); - if (data[ACT]) free(data[ACT]); - if (data[SIG]) free(data[SIG]); - ant_indice++; - data[ANT] = (char *)fp->leer_registro(fp, ant_indice, &size, &error); - data[ANT] = procesar_registro_articulo(data[ANT], &size); - data[ACT] = (char *)fp->leer_registro(fp, ant_indice+1, &size, &error); - data[ACT] = procesar_registro_articulo(data[ACT], &size); - data[SIG] = (char *)fp->leer_registro(fp, ant_indice+2, &size, &error); - data[SIG] = procesar_registro_articulo(data[SIG], &size); - } } /* Borro las ventanas */ werase(actual[1]); - werase(sig[1]); - werase(ant[1]); /* Imprimo los registros */ - wattron(actual[1], A_BOLD); - if (data[ACT]) mvwaddstr(actual[1], 0, 0, data[ACT]+actual_ancho*scroll); - wattroff(actual[1], A_BOLD); - if (data[SIG]) mvwaddstr(sig[1], 0, 0, data[SIG]); - if (data[ANT]) mvwaddstr(ant[1], 0, 0, data[ANT]); + if (data) { + mvwaddnstr(actual[1], 0, 0, data, pos_actual); + wattron(actual[1], A_BOLD); + waddnstr(actual[1], data+pos_actual, ancho_registro); + wattroff(actual[1], A_BOLD); + waddnstr(actual[1], data+pos_actual+ancho_registro, size-(pos_actual+ancho_registro)); + } wrefresh(actual[1]); - wrefresh(sig[1]); - wrefresh(ant[1]); wrefresh(padre); } delwin(actual[1]); - delwin(ant[1]); - delwin(sig[1]); delwin(actual[0]); - delwin(sig[0]); - delwin(ant[0]); wrefresh(padre); curs_set(1); } -static char *procesar_registro_articulo(char *ptr, EMUFS_REG_SIZE *size) +static char *procesar_registro_articulo(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual) { - char *tmp, *salida, *tmp1; + char *tmp, *salida, *tmp1, pos_actualizada; + int cant_header, i=0, j; if (ptr == NULL) return NULL; - salida = (char *)malloc((*size)-sizeof(unsigned int)+11); - sprintf(salida, "(%08d)", *((unsigned int *)ptr)); - tmp1 = salida+10; - tmp = ptr+sizeof(unsigned int); - while (tmp < (ptr + (*size))) { - if (*tmp == '\0') { - (*tmp1) = '|'; - } else { - (*tmp1) = (*tmp); + + /* Calculo cuantos headers de registros va a haber en el archivo */ + cant_header = emu->tam_bloque / (emu->tam_reg+sizeof(EMUFS_REG_ID)); + /* El tamaño del nuevo array lo calculo asi : + * + * tamañoviejo - tamaño_headers_en_int - tamaño_ints_en_registro + * + 10*(cant_headers+cant_registros) +1 + * + * En tipo3, la cantidad de headers y cant de registros es la misma + * El 10 es por : (XXXXXXXX) + * +1 == Por el \0 + */ + salida = (char *)malloc((*size)-sizeof(unsigned int)*cant_header*2 + 2*cant_header*10+1); + tmp = ptr; + tmp1 = salida; + pos_actualizada = 0; + while (i Date: Wed, 14 Apr 2004 17:58:29 +0000 Subject: [PATCH 08/16] * Agrego leer_registro_raw en EMUFS y para tipo3 * En tipo3 hago que cuando se crea un nuevo bloque se lo pone todo en 0 (asi la GUI se ve mejor). Tambien arreglo un bug en el que al borrar se estaba haciendo un desplazamiento de mas. --- emufs/emufs.c | 10 ++++++---- emufs/emufs.h | 1 + emufs/tipo3.c | 45 ++++++++++++++++++++++++++++++++++++++++++++- emufs/tipo3.h | 2 ++ 4 files changed, 53 insertions(+), 5 deletions(-) diff --git a/emufs/emufs.c b/emufs/emufs.c index 293d556..33c114a 100644 --- a/emufs/emufs.c +++ b/emufs/emufs.c @@ -157,8 +157,9 @@ EMUFS *emufs_crear(const char *filename, EMUFS_Tipo tipo, EMUFS_BLOCK_SIZE tam_b case T3: /* Asigna punteros a funciones. */ - efs->leer_bloque = emufs_tipo3_leer_bloque; - efs->leer_registro = emufs_tipo3_leer_registro; + efs->leer_bloque = emufs_tipo3_leer_bloque; + efs->leer_registro = emufs_tipo3_leer_registro; + efs->leer_registro_raw = emufs_tipo3_leer_registro_raw; efs->grabar_registro = emufs_tipo3_grabar_registro; efs->borrar_registro = emufs_tipo3_borrar_registro; efs->leer_estadisticas = emufs_tipo3_leer_estadisticas; @@ -230,8 +231,9 @@ EMUFS *emufs_abrir(const char *filename) return NULL; } /* Asigna punteros a funciones. */ - efs->leer_bloque = emufs_tipo3_leer_bloque; - efs->leer_registro = emufs_tipo3_leer_registro; + efs->leer_bloque = emufs_tipo3_leer_bloque; + efs->leer_registro_raw = emufs_tipo3_leer_registro_raw; + efs->leer_registro = emufs_tipo3_leer_registro; efs->grabar_registro = emufs_tipo3_grabar_registro; efs->borrar_registro = emufs_tipo3_borrar_registro; efs->leer_estadisticas = emufs_tipo3_leer_estadisticas; diff --git a/emufs/emufs.h b/emufs/emufs.h index fd2c9ca..6ba63b3 100644 --- a/emufs/emufs.h +++ b/emufs/emufs.h @@ -117,6 +117,7 @@ typedef struct _emu_fs_t { EMUFS_REG_SIZE tam_reg; /**< Tamaño de registro. 0 Si son registros variables */ void* (*leer_bloque)(struct _emu_fs_t*, EMUFS_BLOCK_ID, int*); /**< Método para leer un bloque */ void* (*leer_registro)(struct _emu_fs_t*, EMUFS_REG_ID, EMUFS_REG_SIZE*, int*); /**< Método para leer un registro */ + void* (*leer_registro_raw)(struct _emu_fs_t*, EMUFS_REG_ID, EMUFS_REG_SIZE*, int *); /**< Método para leer un registro con todo su bloque asociado */ EMUFS_REG_ID (*grabar_registro)(struct _emu_fs_t*, void*, EMUFS_REG_SIZE, int*); /**< Método para grabar un registro */ EMUFS_REG_ID (*modificar_registro)(struct _emu_fs_t*, EMUFS_REG_ID, void*, EMUFS_REG_SIZE, int*); /**< Método para modificar un registro */ int (*borrar_registro)(struct _emu_fs_t*, EMUFS_REG_ID); /**< Método para borrar un registro */ diff --git a/emufs/tipo3.c b/emufs/tipo3.c index 24153cb..0e428e1 100644 --- a/emufs/tipo3.c +++ b/emufs/tipo3.c @@ -141,6 +141,7 @@ EMUFS_REG_ID emufs_tipo3_grabar_registro(EMUFS *emu, void *ptr, EMUFS_REG_SIZE t if ( (file = fopen(name_f,"a+"))==NULL ) return -1; /*ERROR*/ /*crear un nuevo bloque en memoria */ bloque = (char*)malloc(emu->tam_bloque); + memset(bloque, 0, emu->tam_bloque); /* grabar el registro al principio del bloque */ /*tengo que buscar un ID valido para el nuevo registro*/ ID_aux = emufs_idx_get_new_id(emu, err); @@ -250,8 +251,10 @@ int emufs_tipo3_borrar_registro(EMUFS *emu, EMUFS_REG_ID ID) /*apunto al registro que voy a mover*/ ptr_mov = ptr_elim + emu->tam_reg + sizeof(EMUFS_REG_ID); - while ( ptr_mov < emu->tam_bloque ){ + while ( (ptr_mov+sizeof(EMUFS_REG_ID)+emu->tam_reg) < emu->tam_bloque ){ memcpy(bloque+ptr_elim, bloque+ptr_mov, sizeof(EMUFS_REG_ID)+emu->tam_reg); + /* Blanqueo el area que movi */ + memset(bloque+ptr_mov, 0, sizeof(EMUFS_REG_ID)+emu->tam_reg); ptr_elim = ptr_mov; ptr_mov += sizeof(EMUFS_REG_ID) + emu->tam_reg; } @@ -308,3 +311,43 @@ EMUFS_REG_ID emufs_tipo3_modificar_registro(EMUFS *emu, EMUFS_REG_ID id, void *d return emufs_tipo3_grabar_registro(emu, data, size, error); } +void* emufs_tipo3_leer_registro_raw(EMUFS *emu, EMUFS_REG_ID ID, EMUFS_REG_SIZE *size, int *pos) +{ + char* bloque; + EMUFS_BLOCK_ID block; + EMUFS_REG_ID ID_aux; + EMUFS_BLOCK_SIZE iterador = 0; + int err; + + /*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*/ + if ( block == EMUFS_NOT_FOUND ){ + PERR("No se encontro el bloque"); + return NULL; + } + if ((bloque = emufs_tipo3_leer_bloque(emu, block, &err)) == NULL) { + /* TODO Manejo de errores, queda en el codigo de error lo que devolvio + * emufs_tipo3_leer_bloque() */ + PERR("no se pudo leer el bloque"); + return NULL; /*No se pudo leer el bloque*/ + } + + ID_aux = -1; + iterador = 0; + /* Busco el offset desde el comienzo desde donde arranca el registro + * buscado, para luego resaltarlo en al GUI + */ + while ( iterador < emu->tam_bloque ) { + memcpy(&ID_aux, bloque+iterador, sizeof(EMUFS_REG_ID)); + if ( ID_aux == ID ){ + *pos = iterador; + *size = emu->tam_bloque; + break; + } + iterador += sizeof(EMUFS_REG_ID); + iterador += emu->tam_reg; + } + + return bloque; +} + diff --git a/emufs/tipo3.h b/emufs/tipo3.h index 5e9b547..7c85555 100644 --- a/emufs/tipo3.h +++ b/emufs/tipo3.h @@ -68,4 +68,6 @@ EMUFS_REG_ID emufs_tipo3_modificar_registro(EMUFS *emu, EMUFS_REG_ID, void*, EMU EMUFS_Estadisticas emufs_tipo3_leer_estadisticas(EMUFS *); +void* emufs_tipo3_leer_registro_raw(struct _emu_fs_t*, EMUFS_REG_ID, EMUFS_REG_SIZE*, int *); + #endif /* _EMUFS_TIPO3_H_ */ -- 2.43.0 From 27dcebf2414a7fe37fa130561d14d8bf29e9b12d Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Wed, 14 Apr 2004 18:44:37 +0000 Subject: [PATCH 09/16] * Se restaura el control del scroll al ver registros. --- emufs_gui/articulos.c | 2 +- emufs_gui/registros.c | 15 ++++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/emufs_gui/articulos.c b/emufs_gui/articulos.c index 072bb9a..83b5fb8 100644 --- a/emufs_gui/articulos.c +++ b/emufs_gui/articulos.c @@ -94,7 +94,7 @@ t_LstArticulos *art_cargar(const char *filename, int tipo) node = node->next; } - tmp->fp = emufs_crear("articulos", tipo-1, sizeof(t_Articulo)*4+128, sizeof(t_Articulo)); + tmp->fp = emufs_crear("articulos", tipo-1, sizeof(t_Articulo)*40+128, sizeof(t_Articulo)); for (node=inicio ; node ; node = node->next) { if (node->type == XML_ELEMENT_NODE) { if (strcmp(node->name, "ARTICULO") == 0) { diff --git a/emufs_gui/registros.c b/emufs_gui/registros.c index ab6b5bc..4877b88 100644 --- a/emufs_gui/registros.c +++ b/emufs_gui/registros.c @@ -21,7 +21,7 @@ void ver_registros(WINDOW *padre, int w, int h) 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; + int pos_actual, ancho_registro, offset, pos; fp = emufs_abrir("articulos"); total_indice = emufs_idx_get_count(fp); @@ -32,7 +32,7 @@ void ver_registros(WINDOW *padre, int w, int h) ancho_registro = sizeof(t_Articulo)-sizeof(unsigned int)*2+20; - max_scroll = size / (w/3-2) - (h-8); + max_scroll = size / (w-4) - (h-8); if (max_scroll < 0) max_scroll = 0; actual[0] = derwin(padre, h-6, w-2, 1, 1); @@ -101,6 +101,7 @@ void ver_registros(WINDOW *padre, int w, int h) case 'z': /* Scroll */ scroll++; if (scroll > max_scroll) scroll = max_scroll; + break; case 'l': if (ant_indice < total_indice) { ant_indice++; @@ -125,11 +126,15 @@ void ver_registros(WINDOW *padre, int w, int h) /* Imprimo los registros */ if (data) { - mvwaddnstr(actual[1], 0, 0, data, pos_actual); + offset = scroll*actual_ancho; + pos = pos_actual - offset; + mvwaddnstr(actual[1], 0, 0, data+offset, pos); + offset += pos; wattron(actual[1], A_BOLD); - waddnstr(actual[1], data+pos_actual, ancho_registro); + waddnstr(actual[1], data+offset, ancho_registro); wattroff(actual[1], A_BOLD); - waddnstr(actual[1], data+pos_actual+ancho_registro, size-(pos_actual+ancho_registro)); + offset += ancho_registro; + waddnstr(actual[1], data+offset, size-offset); } wrefresh(actual[1]); -- 2.43.0 From 9071a01f94406f881e6bdd9f875eb926333eb81d Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Wed, 14 Apr 2004 18:57:11 +0000 Subject: [PATCH 10/16] * Ver registros completo!!. Ya se puede : - hace altas, bajas y modificaciones del registro actualmente selecciondo - Resalta el registro actual dentro del bloque al que pertenece - Tiene GUI autoexplicada --- emufs_gui/registros.c | 52 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/emufs_gui/registros.c b/emufs_gui/registros.c index 4877b88..1d244ee 100644 --- a/emufs_gui/registros.c +++ b/emufs_gui/registros.c @@ -51,7 +51,20 @@ void ver_registros(WINDOW *padre, int w, int h) mvwaddstr(padre, h-4, 8, "Salir = ENTER"); mvwaddstr(padre, h-3, 8, "Scroll = A/Z"); mvwaddstr(padre, h-2, 8, "Seleccionar registros = K/L"); - mvwaddstr(padre, h-1, 8, "Editar Actual = e"); + mvwaddstr(padre, h-1, 8, "Acciones: "); + waddstr(padre, "A"); + wattron(padre, A_BOLD); + waddch(padre, 'g'); + wattroff(padre, A_BOLD); + waddstr(padre, "regar "); + wattron(padre, A_BOLD); + waddstr(padre, "M"); + wattroff(padre, A_BOLD); + waddstr(padre, "ofidicar "); + wattron(padre, A_BOLD); + waddstr(padre, "E"); + wattroff(padre, A_BOLD); + waddstr(padre, "liminar "); /* Info de leyenda */ wattron(padre, A_BOLD); @@ -75,7 +88,40 @@ void ver_registros(WINDOW *padre, int w, int h) scroll = 0; while ((c=getch()) != 13) { switch (c) { - case 'e': /* Quiero editar !!! */ + case 'e': + case 'E': + fp->borrar_registro(fp, emufs_idx_get_id_at(fp, ant_indice)); + data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual); + data = procesar_registro_articulo(fp, data, &size, &pos_actual); + + total_indice = emufs_idx_get_count(fp); + if (ant_indice >= total_indice) { + ant_indice = total_indice - 1; + } + 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 = procesar_registro_articulo(fp, data, &size, &pos_actual); + + total_indice = emufs_idx_get_count(fp); + + /* Tengo que re-pintar algunas cosas */ + wattron(padre, A_BOLD); + wattron(padre, COLOR_PAIR(COLOR_RED)); + mvwaddstr(padre, h-5, 5, "Teclas :"); + mvwaddstr(padre, h-5, 35, "Leyenda :"); + wattroff(padre, A_BOLD); + wattroff(padre, COLOR_PAIR(COLOR_RED)); + mvwaddstr(padre, h-4, 38, "| = Separador de campo"); + mvwaddstr(padre, h-4, 8, "Salir = ENTER"); + box(actual[0], 0, 0); + wrefresh(actual[0]); + break; + case 'M': + case 'm': /* Quiero editar !!! */ sprintf(codigo, "%lu", emufs_idx_get_id_at(fp, ant_indice)); art_modificar(codigo); /* Vuelvo a cargar el articulo actual */ @@ -91,6 +137,8 @@ void ver_registros(WINDOW *padre, int w, int h) mvwaddstr(padre, h-5, 35, "Leyenda :"); wattroff(padre, A_BOLD); wattroff(padre, COLOR_PAIR(COLOR_RED)); + mvwaddstr(padre, h-4, 38, "| = Separador de campo"); + mvwaddstr(padre, h-4, 8, "Salir = ENTER"); box(actual[0], 0, 0); wrefresh(actual[0]); break; -- 2.43.0 From 4c9396d05ddc6c73873d21f175e6b5bbd6f25993 Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Wed, 14 Apr 2004 19:36:56 +0000 Subject: [PATCH 11/16] * Se agrega un caracter (el .) para denotar el espacio libre en el registro --- emufs_gui/registros.c | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/emufs_gui/registros.c b/emufs_gui/registros.c index 1d244ee..e6f81fc 100644 --- a/emufs_gui/registros.c +++ b/emufs_gui/registros.c @@ -4,7 +4,7 @@ #include "articulos.h" /* Se encarga de reemplazar los \0 un caracter visual, y segurar un \0 al final */ -static char *procesar_registro_articulo(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual); +static char *procesar_registro_articulo_tipo3(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual); #define ACT 0 #define ANT 1 @@ -28,7 +28,7 @@ void ver_registros(WINDOW *padre, int w, int h) ant_indice = 1; data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual); - data = procesar_registro_articulo(fp, data, &size, &pos_actual); + data = procesar_registro_articulo_tipo3(fp, data, &size, &pos_actual); ancho_registro = sizeof(t_Articulo)-sizeof(unsigned int)*2+20; @@ -72,7 +72,7 @@ void ver_registros(WINDOW *padre, int w, int h) mvwaddstr(padre, h-5, 35, "Leyenda :"); wattroff(padre, A_BOLD); wattroff(padre, COLOR_PAIR(COLOR_RED)); - mvwaddstr(padre, h-4, 38, "| = Separador de campo"); + mvwaddstr(padre, h-4, 38, "| = Separador de campo . = Libre"); mvwaddstr(padre, h-3, 38, "[XXX] = Campo numerico"); mvwaddstr(padre, h-2, 38, "(XXX) = ID de registro"); @@ -91,20 +91,21 @@ void ver_registros(WINDOW *padre, int w, int h) case 'e': case 'E': fp->borrar_registro(fp, emufs_idx_get_id_at(fp, ant_indice)); - data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual); - data = procesar_registro_articulo(fp, data, &size, &pos_actual); total_indice = emufs_idx_get_count(fp); if (ant_indice >= total_indice) { ant_indice = total_indice - 1; } + + data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual); + data = procesar_registro_articulo_tipo3(fp, data, &size, &pos_actual); 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 = procesar_registro_articulo(fp, data, &size, &pos_actual); + data = procesar_registro_articulo_tipo3(fp, data, &size, &pos_actual); total_indice = emufs_idx_get_count(fp); @@ -115,7 +116,7 @@ void ver_registros(WINDOW *padre, int w, int h) mvwaddstr(padre, h-5, 35, "Leyenda :"); wattroff(padre, A_BOLD); wattroff(padre, COLOR_PAIR(COLOR_RED)); - mvwaddstr(padre, h-4, 38, "| = Separador de campo"); + mvwaddstr(padre, h-4, 38, "| = Separador de campo . = Libre"); mvwaddstr(padre, h-4, 8, "Salir = ENTER"); box(actual[0], 0, 0); wrefresh(actual[0]); @@ -128,7 +129,7 @@ void ver_registros(WINDOW *padre, int w, int h) free(data); data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual); - data = procesar_registro_articulo(fp, data, &size, &pos_actual); + data = procesar_registro_articulo_tipo3(fp, data, &size, &pos_actual); /* Tengo que re-pintar algunas cosas */ wattron(padre, A_BOLD); @@ -137,7 +138,7 @@ void ver_registros(WINDOW *padre, int w, int h) mvwaddstr(padre, h-5, 35, "Leyenda :"); wattroff(padre, A_BOLD); wattroff(padre, COLOR_PAIR(COLOR_RED)); - mvwaddstr(padre, h-4, 38, "| = Separador de campo"); + mvwaddstr(padre, h-4, 38, "| = Separador de campo . = Libre"); mvwaddstr(padre, h-4, 8, "Salir = ENTER"); box(actual[0], 0, 0); wrefresh(actual[0]); @@ -156,7 +157,7 @@ void ver_registros(WINDOW *padre, int w, int h) if (ant_indice >= total_indice) ant_indice = total_indice-1; if (data) free(data); data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual); - data = procesar_registro_articulo(fp, data, &size, &pos_actual); + data = procesar_registro_articulo_tipo3(fp, data, &size, &pos_actual); } break; case 'k': @@ -165,7 +166,7 @@ void ver_registros(WINDOW *padre, int w, int h) if (ant_indice == EMUFS_NOT_FOUND) ant_indice = 0; if (data) free(data); data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual); - data = procesar_registro_articulo(fp, data, &size, &pos_actual); + data = procesar_registro_articulo_tipo3(fp, data, &size, &pos_actual); } } @@ -194,9 +195,9 @@ void ver_registros(WINDOW *padre, int w, int h) curs_set(1); } -static char *procesar_registro_articulo(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual) +char *procesar_registro_articulo_tipo3(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual) { - char *tmp, *salida, *tmp1, pos_actualizada; + char *tmp, *salida, *tmp1, pos_actualizada, ant; int cant_header, i=0, j; if (ptr == NULL) return NULL; @@ -216,6 +217,9 @@ static char *procesar_registro_articulo(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *s tmp1 = salida; pos_actualizada = 0; while (i Date: Wed, 14 Apr 2004 19:43:44 +0000 Subject: [PATCH 12/16] * Agrego leer_registro_raw a tipo1 --- emufs/tipo1.c | 40 ++++++++++++++++++++++++++++++++++++++++ emufs/tipo1.h | 2 ++ 2 files changed, 42 insertions(+) diff --git a/emufs/tipo1.c b/emufs/tipo1.c index 024839b..4ef7f76 100644 --- a/emufs/tipo1.c +++ b/emufs/tipo1.c @@ -64,6 +64,7 @@ int emufs_tipo1_inicializar(EMUFS* efs) efs->leer_registro = emufs_tipo1_leer_registro; efs->grabar_registro = emufs_tipo1_grabar_registro; efs->borrar_registro = emufs_tipo1_borrar_registro; + efs->leer_registro_raw = emufs_tipo1_leer_registro_raw; return 0; } @@ -351,3 +352,42 @@ EMUFS_REG_ID emufs_tipo1_modificar_registro(EMUFS *emu, EMUFS_REG_ID id, void *d emufs_tipo1_borrar_registro(emu, id); return emufs_tipo1_grabar_registro(emu, data, size, error); } + +void* emufs_tipo1_leer_registro_raw(EMUFS *efs, EMUFS_REG_ID id, EMUFS_REG_SIZE *size, int *pos) +{ + char* block; /* bloque leido (en donde está el registro a leer) */ + EMUFS_BLOCK_ID block_id; /* id del bloque en donde esta el registro a leer */ + EMUFS_BLOCK_SIZE offset; /* offset del bloque leído */ + EMUFS_BLOCK_SIZE block_size; /* tamaño del bloque leído */ + EMUFS_REG_SIZE curr_reg_size; /* tamaño del registro leído secuencialmente */ + EMUFS_REG_ID curr_reg_id; /* id del registro leído secuencialmente */ + int err; + + block_id = emufs_idx_buscar_registro(efs, id); + if (block_id == EMUFS_NOT_FOUND) { + return NULL; + } + if (!(block = (char*) emufs_tipo1_leer_bloque(efs, block_id, &err))) { + return NULL; + } + + /* 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(EMUFS_REG_ID)); + offset += sizeof(EMUFS_REG_ID); + /* Copio el tamaño del registro de la cabecera. */ + memcpy(&curr_reg_size, block + offset, sizeof(EMUFS_REG_SIZE)); + offset += sizeof(EMUFS_REG_SIZE); + if (curr_reg_id == id) { + *pos = offset-sizeof(EMUFS_REG_ID)-sizeof(EMUFS_REG_SIZE); + break; + } + /* Desplazo el offset */ + offset += curr_reg_size; + } while (offset < block_size); + + return block; +} + diff --git a/emufs/tipo1.h b/emufs/tipo1.h index d61bcf2..830e60c 100644 --- a/emufs/tipo1.h +++ b/emufs/tipo1.h @@ -61,6 +61,8 @@ int emufs_tipo1_borrar_registro(EMUFS*, EMUFS_REG_ID); /** Método para modificar un registro */ EMUFS_REG_ID emufs_tipo1_modificar_registro(EMUFS *emu, EMUFS_REG_ID, void*, EMUFS_REG_SIZE, int*); +void* emufs_tipo1_leer_registro_raw(EMUFS *emu, EMUFS_REG_ID id, EMUFS_REG_SIZE *size, int *pos); + /* int emufs_tipo1_buscar_lugar(EMUFS *emu, EMUFS_REG_SIZE tam_reg, EMUFS_FREE *free_space); -- 2.43.0 From dfd80953713dfca6db472364519ca94fa641ebd5 Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Wed, 14 Apr 2004 20:38:41 +0000 Subject: [PATCH 13/16] * Se inicializa bloque en \0's al crear un nuevo bloque en tipo1 * Ver registros ahora sirve tanto para tipo1 como para tipo3 (tipo1 no puede modificar ni borrar hasta que borrar_registro sea implementada) --- emufs/tipo1.c | 2 + emufs_gui/registros.c | 113 ++++++++++++++++++++++++++++++++++++++---- 2 files changed, 106 insertions(+), 9 deletions(-) diff --git a/emufs/tipo1.c b/emufs/tipo1.c index 4ef7f76..769d7b2 100644 --- a/emufs/tipo1.c +++ b/emufs/tipo1.c @@ -176,6 +176,7 @@ EMUFS_REG_ID emufs_tipo1_grabar_registro(EMUFS* efs, void* reg, if (block_id == EMUFS_NOT_FOUND) { /* crear un nuevo bloque en memoria */ block = (char*) malloc(efs->tam_bloque); + memset(block, 0, efs->tam_bloque); if (block == NULL) { /* TODO Manejo de errores */ PERR("No hay memoria"); @@ -388,6 +389,7 @@ void* emufs_tipo1_leer_registro_raw(EMUFS *efs, EMUFS_REG_ID id, EMUFS_REG_SIZE offset += curr_reg_size; } while (offset < block_size); + (*size) = efs->tam_bloque; return block; } diff --git a/emufs_gui/registros.c b/emufs_gui/registros.c index e6f81fc..09cd7f9 100644 --- a/emufs_gui/registros.c +++ b/emufs_gui/registros.c @@ -4,7 +4,8 @@ #include "articulos.h" /* 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); +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); #define ACT 0 #define ANT 1 @@ -13,6 +14,7 @@ static char *procesar_registro_articulo_tipo3(EMUFS *emu, char *ptr, EMUFS_REG_S 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]; EMUFS_REG_SIZE size; int scroll, actual_ancho; @@ -23,14 +25,21 @@ void ver_registros(WINDOW *padre, int w, int h) EMUFS *fp; int pos_actual, ancho_registro, offset, pos; fp = emufs_abrir("articulos"); + switch (fp->tipo) { + case T1: + case T2: + procesar = procesar_registro_articulo_tipo1; + break; + case T3: + procesar = procesar_registro_articulo_tipo3; + } total_indice = emufs_idx_get_count(fp); ant_indice = 1; data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual); - data = procesar_registro_articulo_tipo3(fp, data, &size, &pos_actual); + data = procesar(fp, data, &size, &pos_actual, &ancho_registro); - ancho_registro = sizeof(t_Articulo)-sizeof(unsigned int)*2+20; max_scroll = size / (w-4) - (h-8); if (max_scroll < 0) max_scroll = 0; @@ -98,14 +107,14 @@ void ver_registros(WINDOW *padre, int w, int h) } data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual); - data = procesar_registro_articulo_tipo3(fp, data, &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 = procesar_registro_articulo_tipo3(fp, data, &size, &pos_actual); + data = procesar(fp, data, &size, &pos_actual, &ancho_registro); total_indice = emufs_idx_get_count(fp); @@ -129,7 +138,7 @@ void ver_registros(WINDOW *padre, int w, int h) free(data); data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual); - data = procesar_registro_articulo_tipo3(fp, data, &size, &pos_actual); + data = procesar(fp, data, &size, &pos_actual, &ancho_registro); /* Tengo que re-pintar algunas cosas */ wattron(padre, A_BOLD); @@ -157,7 +166,7 @@ void ver_registros(WINDOW *padre, int w, int h) if (ant_indice >= total_indice) ant_indice = total_indice-1; if (data) free(data); data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual); - data = procesar_registro_articulo_tipo3(fp, data, &size, &pos_actual); + data = procesar(fp, data, &size, &pos_actual, &ancho_registro); } break; case 'k': @@ -166,7 +175,7 @@ void ver_registros(WINDOW *padre, int w, int h) if (ant_indice == EMUFS_NOT_FOUND) ant_indice = 0; if (data) free(data); data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual); - data = procesar_registro_articulo_tipo3(fp, data, &size, &pos_actual); + data = procesar(fp, data, &size, &pos_actual, &ancho_registro); } } @@ -195,7 +204,7 @@ void ver_registros(WINDOW *padre, int w, int h) curs_set(1); } -char *procesar_registro_articulo_tipo3(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual) +char *procesar_registro_articulo_tipo3(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho) { char *tmp, *salida, *tmp1, pos_actualizada, ant; int cant_header, i=0, j; @@ -203,6 +212,8 @@ char *procesar_registro_articulo_tipo3(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *si /* Calculo cuantos headers de registros va a haber en el archivo */ cant_header = emu->tam_bloque / (emu->tam_reg+sizeof(EMUFS_REG_ID)); + if (cant_header == 0) cant_header++; /* Si tam_reg > tam_bloque, voy a tener solo 1 header */ + /* El tamaño del nuevo array lo calculo asi : * * tamañoviejo - tamaño_headers_en_int - tamaño_ints_en_registro @@ -252,6 +263,90 @@ char *procesar_registro_articulo_tipo3(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *si free(ptr); (*tmp1) = '\0'; (*size) = (*size)-sizeof(unsigned int)*cant_header*2+2*cant_header*10+1; + (*ancho) = sizeof(t_Articulo)-sizeof(unsigned int)*2+10; + return salida; +} + +char *procesar_registro_articulo_tipo1(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho) +{ + EMUFS_REG_SIZE offset, curr_size; + char *tmp, *salida, *tmp1, pos_actualizada, ant; + int cant_header, i=0, j; + if (ptr == NULL) return NULL; + + /* Cuento la cantidad de registros en este bloque */ + cant_header = 0; + offset = 0; + do { + /* Me salto el ID, que no me interesa saber su valor */ + offset += sizeof(EMUFS_REG_ID); + /* Copio el tamaño del registro de la cabecera. */ + memcpy(&curr_size, ptr + offset, sizeof(EMUFS_REG_SIZE)); + offset += sizeof(EMUFS_REG_SIZE); + + /* Desplazo el offset */ + if (curr_size == 0) { + /* Si el tamaño de registro es 0, quiere decir que llegue a la + * parte que esta vacia */ + break; + } else { + cant_header++; + offset += curr_size; + } + } while (offset < (*size)); + + /* Proceso */ + salida = (char *)malloc((*size)-sizeof(unsigned int)*cant_header*3 + 3*cant_header*10+1); + tmp = ptr; + tmp1 = salida; + pos_actualizada = 0; + while (i Date: Wed, 14 Apr 2004 21:12:10 +0000 Subject: [PATCH 14/16] * mas detalles --- emufs_gui/registros.c | 109 +++++++++++++++++++----------------------- 1 file changed, 50 insertions(+), 59 deletions(-) diff --git a/emufs_gui/registros.c b/emufs_gui/registros.c index 09cd7f9..9f816a1 100644 --- a/emufs_gui/registros.c +++ b/emufs_gui/registros.c @@ -7,10 +7,45 @@ 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); -#define ACT 0 -#define ANT 1 -#define SIG 2 - +void mostrar_info(WINDOW *padre, int h, int offset_alto) +{ + /* Info de teclas */ + wattron(padre, A_BOLD); + wattron(padre, COLOR_PAIR(COLOR_RED)); + mvwaddstr(padre, h-offset_alto+1, 5, "Teclas :"); + wattroff(padre, A_BOLD); + wattroff(padre, COLOR_PAIR(COLOR_RED)); + mvwaddstr(padre, h-offset_alto+2, 8, "Salir = ENTER"); + mvwaddstr(padre, h-offset_alto+3, 8, "Scroll = A/Z"); + mvwaddstr(padre, h-offset_alto+4, 8, "Seleccionar registros = K/L"); + mvwaddstr(padre, h-offset_alto+5, 8, "Acciones: "); + waddstr(padre, "A"); + wattron(padre, A_BOLD); + waddch(padre, 'g'); + wattroff(padre, A_BOLD); + waddstr(padre, "regar "); + wattron(padre, A_BOLD); + waddstr(padre, "M"); + wattroff(padre, A_BOLD); + waddstr(padre, "ofidicar "); + wattron(padre, A_BOLD); + waddstr(padre, "E"); + wattroff(padre, A_BOLD); + waddstr(padre, "liminar "); + + /* Info de leyenda */ + wattron(padre, A_BOLD); + wattron(padre, COLOR_PAIR(COLOR_RED)); + mvwaddstr(padre, h-offset_alto+1, 45, "Leyenda :"); + wattroff(padre, A_BOLD); + wattroff(padre, COLOR_PAIR(COLOR_RED)); + mvwaddstr(padre, h-offset_alto+2, 48, " | = Separador de campo"); + mvwaddstr(padre, h-offset_alto+3, 48, "[XXX] = Campo numerico"); + mvwaddstr(padre, h-offset_alto+4, 48, "(XXX) = ID de registro"); + mvwaddstr(padre, h-offset_alto+5, 48, "{XXX} = Tam. de registro"); + mvwaddstr(padre, h-offset_alto+6, 48, " . = Esp. Libre"); +} + void ver_registros(WINDOW *padre, int w, int h) { /* Ventanas donde mostrar las cosas */ @@ -18,7 +53,7 @@ void ver_registros(WINDOW *padre, int w, int h) WINDOW *actual[2]; EMUFS_REG_SIZE size; int scroll, actual_ancho; - int max_scroll, c; + int max_scroll, c, offset_alto; EMUFS_REG_ID ant_indice, total_indice; /* Indice de registro que tengo en ANT */ char *data; /* Registros a mostrar en pantalla */ char codigo[50]; /* Variable para guardar el codigo actual para mandar a modificar */ @@ -41,49 +76,18 @@ void ver_registros(WINDOW *padre, int w, int h) data = procesar(fp, data, &size, &pos_actual, &ancho_registro); - max_scroll = size / (w-4) - (h-8); + offset_alto = 8; + max_scroll = size / (w-4) - (h-offset_alto-2); if (max_scroll < 0) max_scroll = 0; - actual[0] = derwin(padre, h-6, w-2, 1, 1); + actual[0] = derwin(padre, h-offset_alto, w-2, 1, 1); actual_ancho = w-4; - actual[1] = derwin(actual[0], h-8, w-4, 1, 1); + actual[1] = derwin(actual[0], h-offset_alto-2, w-4, 1, 1); box(actual[0], 0, 0); curs_set(0); - /* Info de teclas */ - wattron(padre, A_BOLD); - wattron(padre, COLOR_PAIR(COLOR_RED)); - mvwaddstr(padre, h-5, 5, "Teclas :"); - wattroff(padre, A_BOLD); - wattroff(padre, COLOR_PAIR(COLOR_RED)); - mvwaddstr(padre, h-4, 8, "Salir = ENTER"); - mvwaddstr(padre, h-3, 8, "Scroll = A/Z"); - mvwaddstr(padre, h-2, 8, "Seleccionar registros = K/L"); - mvwaddstr(padre, h-1, 8, "Acciones: "); - waddstr(padre, "A"); - wattron(padre, A_BOLD); - waddch(padre, 'g'); - wattroff(padre, A_BOLD); - waddstr(padre, "regar "); - wattron(padre, A_BOLD); - waddstr(padre, "M"); - wattroff(padre, A_BOLD); - waddstr(padre, "ofidicar "); - wattron(padre, A_BOLD); - waddstr(padre, "E"); - wattroff(padre, A_BOLD); - waddstr(padre, "liminar "); - - /* Info de leyenda */ - wattron(padre, A_BOLD); - wattron(padre, COLOR_PAIR(COLOR_RED)); - mvwaddstr(padre, h-5, 35, "Leyenda :"); - wattroff(padre, A_BOLD); - wattroff(padre, COLOR_PAIR(COLOR_RED)); - mvwaddstr(padre, h-4, 38, "| = Separador de campo . = Libre"); - mvwaddstr(padre, h-3, 38, "[XXX] = Campo numerico"); - mvwaddstr(padre, h-2, 38, "(XXX) = ID de registro"); + mostrar_info(padre, h, actual_ancho); mvwaddnstr(actual[1], 0, 0, data, pos_actual); wattron(actual[1], A_BOLD); @@ -99,7 +103,8 @@ void ver_registros(WINDOW *padre, int w, int h) switch (c) { case 'e': case 'E': - fp->borrar_registro(fp, emufs_idx_get_id_at(fp, ant_indice)); + if (ant_indice != EMUFS_NOT_FOUND) + fp->borrar_registro(fp, emufs_idx_get_id_at(fp, ant_indice)); total_indice = emufs_idx_get_count(fp); if (ant_indice >= total_indice) { @@ -119,14 +124,7 @@ void ver_registros(WINDOW *padre, int w, int h) total_indice = emufs_idx_get_count(fp); /* Tengo que re-pintar algunas cosas */ - wattron(padre, A_BOLD); - wattron(padre, COLOR_PAIR(COLOR_RED)); - mvwaddstr(padre, h-5, 5, "Teclas :"); - mvwaddstr(padre, h-5, 35, "Leyenda :"); - wattroff(padre, A_BOLD); - wattroff(padre, COLOR_PAIR(COLOR_RED)); - mvwaddstr(padre, h-4, 38, "| = Separador de campo . = Libre"); - mvwaddstr(padre, h-4, 8, "Salir = ENTER"); + mostrar_info(padre, h, actual_ancho); box(actual[0], 0, 0); wrefresh(actual[0]); break; @@ -141,14 +139,7 @@ void ver_registros(WINDOW *padre, int w, int h) data = procesar(fp, data, &size, &pos_actual, &ancho_registro); /* Tengo que re-pintar algunas cosas */ - wattron(padre, A_BOLD); - wattron(padre, COLOR_PAIR(COLOR_RED)); - mvwaddstr(padre, h-5, 5, "Teclas :"); - mvwaddstr(padre, h-5, 35, "Leyenda :"); - wattroff(padre, A_BOLD); - wattroff(padre, COLOR_PAIR(COLOR_RED)); - mvwaddstr(padre, h-4, 38, "| = Separador de campo . = Libre"); - mvwaddstr(padre, h-4, 8, "Salir = ENTER"); + mostrar_info(padre, h, actual_ancho); box(actual[0], 0, 0); wrefresh(actual[0]); break; @@ -263,7 +254,7 @@ char *procesar_registro_articulo_tipo3(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *si free(ptr); (*tmp1) = '\0'; (*size) = (*size)-sizeof(unsigned int)*cant_header*2+2*cant_header*10+1; - (*ancho) = sizeof(t_Articulo)-sizeof(unsigned int)*2+10; + (*ancho) = sizeof(t_Articulo)-sizeof(unsigned int)*2+20; return salida; } -- 2.43.0 From eb1c009fe67cf1eb1c1081151f839082bc8efd6e Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Wed, 14 Apr 2004 21:14:48 +0000 Subject: [PATCH 15/16] * Nada nuevo . solo quiero hacer el commiy no 200 :-) --- emufs_gui/gui.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emufs_gui/gui.c b/emufs_gui/gui.c index 3800f9d..7bebab5 100644 --- a/emufs_gui/gui.c +++ b/emufs_gui/gui.c @@ -33,7 +33,7 @@ t_Param param_ok(int argc, char *argv[]) if (strcmp(argv[i]+strlen(argv[i])-3, "xml") == 0) { /* Luego del archivo XML debe seguir el tipo */ - if ((i+1) 3)) return TIPO_INVALIDO; } else { -- 2.43.0 From c4b24cdb8c9c9c83ad2b4cad26560b3487d15bd7 Mon Sep 17 00:00:00 2001 From: Ricardo Markiewicz Date: Wed, 14 Apr 2004 21:41:18 +0000 Subject: [PATCH 16/16] =?utf8?q?=20*=20Muestro=20el=20tipo=20de=20archivo?= =?utf8?q?=20que=20se=20esta=20mirando=20en=20Ver=20Registros=20=20*=20Agr?= =?utf8?q?ego=20otro=20parametro=20a=20la=20GUI=20:=20el=20tama=C3=B1o=20d?= =?utf8?q?e=20bloque.=20Ahora=20=20si=20el=20archivo=20es=20T1=20o=20T3=20?= =?utf8?q?la=20GUI=20obliga=20a=20pasar=20por=20parametro=20=20el=20tama?= =?utf8?q?=C3=B1o=20de=20registro=20que=20se=20desea=20para=20la=20creacio?= =?utf8?q?n=20del=20archivo.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit * Mejoro el Makefile para compilar incremental --- emufs_gui/Makefile | 3 ++- emufs_gui/articulos.c | 5 +++-- emufs_gui/articulos.h | 2 +- emufs_gui/gui.c | 17 +++++++++++------ emufs_gui/registros.c | 17 ++++++++++++----- 5 files changed, 29 insertions(+), 15 deletions(-) diff --git a/emufs_gui/Makefile b/emufs_gui/Makefile index 4eddd9b..3a925f7 100644 --- a/emufs_gui/Makefile +++ b/emufs_gui/Makefile @@ -1,9 +1,10 @@ CFLAGS=-Wall -g -I/usr/include/libxml2 -I../emufs -DDEBUG LDFLAGS= -lmenu -lncurses -lxml2 +OBJ=form.o gui.o articulos.o facturas.o registros.o ../emufs/libemufs.a all: gui -gui: form.c gui.c articulos.c facturas.c registros.c ../emufs/libemufs.a +gui: $(OBJ) clean: @$(RM) -vf *.o gui diff --git a/emufs_gui/articulos.c b/emufs_gui/articulos.c index 83b5fb8..dd4e29a 100644 --- a/emufs_gui/articulos.c +++ b/emufs_gui/articulos.c @@ -60,7 +60,7 @@ int agregar_nodo_articulo(t_LstArticulos *lst, t_Reg_Articulo *nodo) return 1; } -t_LstArticulos *art_cargar(const char *filename, int tipo) +t_LstArticulos *art_cargar(const char *filename, int tipo, int tam_bloque) { xmlDocPtr document; xmlNode *node, *inicio; @@ -94,7 +94,8 @@ t_LstArticulos *art_cargar(const char *filename, int tipo) node = node->next; } - tmp->fp = emufs_crear("articulos", tipo-1, sizeof(t_Articulo)*40+128, sizeof(t_Articulo)); + fprintf(stderr, "bloque = %d\n", tam_bloque); + tmp->fp = emufs_crear("articulos", tipo-1, tam_bloque, sizeof(t_Articulo)); for (node=inicio ; node ; node = node->next) { if (node->type == XML_ELEMENT_NODE) { if (strcmp(node->name, "ARTICULO") == 0) { diff --git a/emufs_gui/articulos.h b/emufs_gui/articulos.h index 6ea5693..8d7eced 100644 --- a/emufs_gui/articulos.h +++ b/emufs_gui/articulos.h @@ -32,7 +32,7 @@ typedef struct _lista_articulos_ { EMUFS *fp; /* Filepointer al archivo donde estan los datos */ } t_LstArticulos; -t_LstArticulos *art_cargar(const char *filename, int tipo); +t_LstArticulos *art_cargar(const char *filename, int tipo, int tam_registro); int art_liberar(t_LstArticulos *l); t_Articulo *art_obtener(t_LstArticulos *, const char *numero, EMUFS_REG_ID *id); void art_agregar(char *); diff --git a/emufs_gui/gui.c b/emufs_gui/gui.c index 7bebab5..ec90147 100644 --- a/emufs_gui/gui.c +++ b/emufs_gui/gui.c @@ -22,7 +22,7 @@ void menu_articulos(); WINDOW *msg_box(WINDOW *win, int w, int h, const char *format, ...); void msg_box_free(WINDOW *padre, WINDOW *win); -typedef enum {PARAM_OK, SHOW_HELP, TIPO_NO_DEFINIDO, TIPO_INVALIDO} t_Param; +typedef enum {PARAM_OK, SHOW_HELP, TIPO_NO_DEFINIDO, TIPO_INVALIDO, BLOQUE_NO_DEFINIDO} t_Param; /* Verifica Argumentos */ t_Param param_ok(int argc, char *argv[]) @@ -33,9 +33,11 @@ t_Param param_ok(int argc, char *argv[]) if (strcmp(argv[i]+strlen(argv[i])-3, "xml") == 0) { /* Luego del archivo XML debe seguir el tipo */ - if ((i+2) 3)) return TIPO_INVALIDO; + if (((n == 1) || (n == 3)) && ((i+2)>=argc)) + return BLOQUE_NO_DEFINIDO; } else { /* Ops, no hay mas parametros */ return TIPO_NO_DEFINIDO; @@ -64,7 +66,10 @@ int main(int argc, char *argv[]) print_help(argv[0]); return 0; case TIPO_NO_DEFINIDO: - printf("Falta parámetro requerido. Luego del nombre del archivo debe especificar el tipo de archivo\n"); + printf("Falta parámetro requerido.\nLuego del nombre del archivo debe especificar el tipo de archivo\n"); + return 1; + case BLOQUE_NO_DEFINIDO: + printf("Falta parámetro requerido.\nLuego del tipo de archivo debe especificar el tamaño del bloque a utilizar\n"); return 1; case TIPO_INVALIDO: printf("Tipo de archivo no valido. Los valores posibles para el tipo de archivo son:\n"); @@ -127,11 +132,11 @@ int main(int argc, char *argv[]) wrefresh(stdscr); dialog = msg_box(stdscr, COLS, LINES, "Generando archivos ..."); - if (argc == 3) { - art_cargar(argv[1], atoi(argv[2])); + if (argc == 4) { + art_cargar(argv[1], atoi(argv[2]), atoi(argv[3])); fact_cargar(argv[1]); } else - art_cargar(NULL, -1); + art_cargar(NULL, -1, -1); msg_box_free(stdscr, dialog); diff --git a/emufs_gui/registros.c b/emufs_gui/registros.c index 9f816a1..69d73b6 100644 --- a/emufs_gui/registros.c +++ b/emufs_gui/registros.c @@ -60,18 +60,25 @@ void ver_registros(WINDOW *padre, int w, int h) 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 : "); + wattroff(padre, COLOR_PAIR(COLOR_BLUE)); switch (fp->tipo) { case T1: - case T2: + waddstr(padre, "Registro variable con bloque parametrizado."); procesar = procesar_registro_articulo_tipo1; break; + case T2: + waddstr(padre, "Registro variable sin bloques."); + break; case T3: procesar = procesar_registro_articulo_tipo3; + waddstr(padre, "Registro fijo con bloque parametrizado."); } total_indice = emufs_idx_get_count(fp); - ant_indice = 1; + ant_indice = 0; data = (char *)fp->leer_registro_raw(fp, emufs_idx_get_id_at(fp, ant_indice), &size, &pos_actual); data = procesar(fp, data, &size, &pos_actual, &ancho_registro); @@ -87,7 +94,7 @@ void ver_registros(WINDOW *padre, int w, int h) curs_set(0); - mostrar_info(padre, h, actual_ancho); + mostrar_info(padre, h, offset_alto); mvwaddnstr(actual[1], 0, 0, data, pos_actual); wattron(actual[1], A_BOLD); @@ -124,7 +131,7 @@ void ver_registros(WINDOW *padre, int w, int h) total_indice = emufs_idx_get_count(fp); /* Tengo que re-pintar algunas cosas */ - mostrar_info(padre, h, actual_ancho); + mostrar_info(padre, h, offset_alto); box(actual[0], 0, 0); wrefresh(actual[0]); break; @@ -139,7 +146,7 @@ void ver_registros(WINDOW *padre, int w, int h) data = procesar(fp, data, &size, &pos_actual, &ancho_registro); /* Tengo que re-pintar algunas cosas */ - mostrar_info(padre, h, actual_ancho); + mostrar_info(padre, h, offset_alto); box(actual[0], 0, 0); wrefresh(actual[0]); break; -- 2.43.0