From: Ricardo Markiewicz Date: Mon, 12 Apr 2004 13:38:53 +0000 (+0000) Subject: * Articulos : mejora en el manejo de la lista X-Git-Tag: svn_import_r684~508 X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/commitdiff_plain/41c98250247b3e463ab8b4f44ba75aa7f4890eaf?ds=sidebyside * Articulos : mejora en el manejo de la lista * Facturas : Se implementa lista doble. --- diff --git a/emufs_gui/articulos.c b/emufs_gui/articulos.c index 232e184..5662bc7 100644 --- a/emufs_gui/articulos.c +++ b/emufs_gui/articulos.c @@ -9,7 +9,9 @@ static t_Articulo *art_form_buscar(WINDOW *win); 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); +/* Manejo de la lista doble */ static t_Reg_Articulo *crear_nodo_articulo(EMUFS_REG_ID reg, unsigned int num); +static int agregar_nodo_articulo(t_LstArticulos *lst, t_Reg_Articulo *nodo); t_Reg_Articulo *crear_nodo_articulo(EMUFS_REG_ID reg, unsigned int num) { @@ -24,15 +26,29 @@ t_Reg_Articulo *crear_nodo_articulo(EMUFS_REG_ID reg, unsigned int num) return tmp; } +int agregar_nodo_articulo(t_LstArticulos *lst, t_Reg_Articulo *nodo) +{ + if (nodo == NULL) return 0; + + if (lst->primero) { + lst->primero->ant = nodo; + nodo->sig = lst->primero; + lst->primero = nodo; + } else { + lst->primero = nodo; + } + return 1; +} + t_LstArticulos *art_cargar(const char *filename) { xmlDocPtr document; xmlNode *node, *inicio; - int cant, error = 0, i, id; + int cant, error = 0, i; EMUFS_REG_SIZE size; t_LstArticulos *tmp; lst_articulos = NULL; - t_Reg_Articulo *reg_nodo; + EMUFS_REG_ID id; tmp = (t_LstArticulos *)malloc(sizeof(t_LstArticulos)); if (tmp == NULL) return NULL; @@ -87,16 +103,8 @@ t_LstArticulos *art_cargar(const char *filename) /* Ya leido el articulo ahora paso a guardarlo en el archivo y agregarlo a la lista */ save = procesar_guardar_articulo(&art, &size, lst_articulos); if (save != NULL) { - reg_nodo = crear_nodo_articulo(tmp->fp->grabar_registro(tmp->fp, save, size, &error), art.numero); - if (reg_nodo != NULL) { - if (tmp->primero) { - tmp->primero->ant = reg_nodo; - reg_nodo->sig = tmp->primero; - tmp->primero = reg_nodo; - } else { - tmp->primero = reg_nodo; - } - } + id = tmp->fp->grabar_registro(tmp->fp, save, size, &error); + agregar_nodo_articulo(tmp, crear_nodo_articulo(id, art.numero)); free(save); } } @@ -115,16 +123,7 @@ t_LstArticulos *art_cargar(const char *filename) /* Leo el registro */ save = tmp->fp->leer_registro(tmp->fp, id, &size, &error); if (procesar_leer_articulo(&art, save, size, tmp) == 1) { - reg_nodo = crear_nodo_articulo(id, art.numero); - if (reg_nodo != NULL) { - if (tmp->primero) { - tmp->primero->ant = reg_nodo; - reg_nodo->sig = tmp->primero; - tmp->primero = reg_nodo; - } else { - tmp->primero = reg_nodo; - } - } + agregar_nodo_articulo(tmp, crear_nodo_articulo(id, art.numero)); free(save); } } @@ -339,16 +338,7 @@ void art_agregar(char *s) wrefresh(win); getch(); } else { - nuevo = crear_nodo_articulo(id, art.numero); - if (nuevo) { - if (lst_articulos->primero) { - lst_articulos->primero->ant = nuevo; - nuevo->sig = lst_articulos->primero; - lst_articulos->primero = nuevo; - } else { - lst_articulos->primero = nuevo; - } - } + agregar_nodo_articulo(lst_articulos, crear_nodo_articulo(id, art.numero)); } free(save); } diff --git a/emufs_gui/facturas.c b/emufs_gui/facturas.c index a27ba72..3c699de 100644 --- a/emufs_gui/facturas.c +++ b/emufs_gui/facturas.c @@ -6,6 +6,36 @@ static int al_azar(int min, int max); /* Procesa una factura antes de enviarla al archivo para guardarla */ static void *procesar_guardar_factura(t_Factura *f, t_LstFacturas *lst, int *size); +static t_Reg_Factura *crear_nodo_factura(EMUFS_REG_ID reg, EMUFS_REG_ID texto, unsigned int num); +static int agregar_nodo_factura(t_LstFacturas *lst, t_Reg_Factura *nodo); + +t_Reg_Factura *crear_nodo_factura(EMUFS_REG_ID reg, EMUFS_REG_ID texto, unsigned int num) +{ + t_Reg_Factura *tmp; + if (reg == EMUFS_NOT_FOUND) return NULL; + tmp = malloc(sizeof(t_Reg_Factura)); + if (tmp == NULL) return NULL; + tmp->sig = tmp->ant = NULL; + tmp->num_reg = reg; + tmp->texto_reg = texto; + tmp->numero = num; + + return tmp; +} + +int agregar_nodo_factura(t_LstFacturas *lst, t_Reg_Factura *nodo) +{ + if (nodo == NULL) return 0; + + if (lst->primero) { + lst->primero->ant = nodo; + nodo->sig = lst->primero; + lst->primero = nodo; + } else { + lst->primero = nodo; + } + return 1; +} /* es por cada mes a generar */ #define CANT_FACTURAS 1500 @@ -17,6 +47,7 @@ t_LstFacturas *fact_cargar(const char *filename) char *fps[6] = {"CO", "CR", "CH"}; void *save; t_Factura fact; + EMUFS_REG_ID id; lst_facturas = (t_LstFacturas *)malloc(sizeof(t_LstFacturas)); @@ -43,11 +74,11 @@ t_LstFacturas *fact_cargar(const char *filename) /* Guardo */ save = procesar_guardar_factura(&fact, lst_facturas, &size); if (save != NULL) { - lst_facturas->array[cant].numero = numero; - lst_facturas->array[cant].num_reg = lst_facturas->fp->grabar_registro(lst_facturas->fp, save, size, &error); + id = lst_facturas->fp->grabar_registro(lst_facturas->fp, save, size, &error); + agregar_nodo_factura(lst_facturas, crear_nodo_factura(id, EMUFS_NOT_FOUND, numero)); + free(save); } } - lst_facturas->cant = cant; } else { /* Cargo un archivo existente */ } @@ -61,7 +92,6 @@ int fact_liberar(t_LstFacturas *l) if (l == NULL) return 1; emufs_destruir(l->fp); -/* free(l->array); */ free(l); lst_facturas = NULL; diff --git a/emufs_gui/facturas.h b/emufs_gui/facturas.h index 5919d79..f2a3c85 100644 --- a/emufs_gui/facturas.h +++ b/emufs_gui/facturas.h @@ -25,11 +25,11 @@ typedef struct _reg_factura_ { EMUFS_REG_ID num_reg; /* numero de registro en el archivo */ EMUFS_REG_ID texto_reg; /* numero de registro donde se encuentra el texto */ unsigned int numero; /* codigo de factura */ + struct _reg_factura_ *sig, *ant; } t_Reg_Factura; typedef struct _lista_facturas_ { - t_Reg_Factura array[10000]; - unsigned int cant; + t_Reg_Factura *primero; EMUFS *fp; /* Filepointer al archivo donde estan los datos */ EMUFS *fp_texto; /* Filepointer al archivo donde estan los textos */ } t_LstFacturas;