X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/4d91bd1e7dd1604c2e5db9dd4127ef1aa74ed44c..087bc4de9c787d31ba4711af77af8620c4eae004:/emufs_gui/articulos.c diff --git a/emufs_gui/articulos.c b/emufs_gui/articulos.c index 5e65a17..51f2b1b 100644 --- a/emufs_gui/articulos.c +++ b/emufs_gui/articulos.c @@ -9,26 +9,71 @@ 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); +static int eliminar_nodo_articulo(t_LstArticulos *lst, t_Reg_Articulo *nodo); + +int eliminar_nodo_articulo(t_LstArticulos *lst, t_Reg_Articulo *nodo) +{ + if (nodo == NULL) return 0; + if (nodo->ant == NULL) { + /* Me piden borrar el primer nodo */ + if (nodo->sig) { + nodo->sig->ant = NULL; + } + lst->primero = nodo->sig; + } else { + if (nodo->sig) { + nodo->sig->ant = nodo->ant; + } + nodo->ant->sig = nodo->sig; + } + free(nodo); + return 1; +} + +t_Reg_Articulo *crear_nodo_articulo(EMUFS_REG_ID reg, unsigned int num) +{ + t_Reg_Articulo *tmp; + if (reg == EMUFS_NOT_FOUND) return NULL; + tmp = malloc(sizeof(t_Reg_Articulo)); + if (tmp == NULL) return NULL; + tmp->sig = tmp->ant = NULL; + tmp->num_reg = reg; + tmp->numero = 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; - void *save; t_LstArticulos *tmp; lst_articulos = NULL; + EMUFS_REG_ID id; tmp = (t_LstArticulos *)malloc(sizeof(t_LstArticulos)); if (tmp == NULL) return NULL; lst_articulos = tmp; - tmp->cant = 0; - /* tmp->array = (t_Reg_Articulo *)malloc(sizeof(t_Reg_Articulo)*tmp->cant);*/ - - if (tmp->array == NULL) { - free(tmp); - return NULL; - } + tmp->primero = NULL; if (filename != NULL) { document = xmlReadFile(filename, "ISO-8859-1",0); @@ -67,6 +112,7 @@ t_LstArticulos *art_cargar(const char *filename) if (node->type == XML_ELEMENT_NODE) { if (strcmp(node->name, "ARTICULO") == 0) { t_Articulo art; + void *save; art.numero = atoi(xmlGetProp(node, "NroArtículo")); strncpy(art.desc, xmlGetProp(node, "Descripción"), 50); strncpy(art.presentacion, xmlGetProp(node, "Presentación"), 30); @@ -77,15 +123,13 @@ 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) { - tmp->array[cant].num_reg = tmp->fp->grabar_registro(tmp->fp, save, size, &error); - tmp->array[cant].numero = art.numero; - ++cant; + id = tmp->fp->grabar_registro(tmp->fp, save, size, &error); + agregar_nodo_articulo(tmp, crear_nodo_articulo(id, art.numero)); free(save); } } } } - tmp->cant = cant; xmlFreeDoc(document); xmlCleanupParser(); } else { @@ -94,16 +138,15 @@ t_LstArticulos *art_cargar(const char *filename) cant = emufs_idx_get_count(tmp->fp); for(i=0; ifp, i); /* Leo el registro */ save = tmp->fp->leer_registro(tmp->fp, id, &size, &error); if (procesar_leer_articulo(&art, save, size, tmp) == 1) { - tmp->array[i].num_reg = i; - tmp->array[i].numero = art.numero; + agregar_nodo_articulo(tmp, crear_nodo_articulo(id, art.numero)); free(save); } } - tmp->cant = cant; } return tmp; @@ -115,7 +158,7 @@ int art_liberar(t_LstArticulos *l) if (l == NULL) return 1; emufs_destruir(l->fp); -/* free(l->array); */ + /* TODO : Liberar lista */ free(l); lst_articulos = NULL; @@ -124,21 +167,22 @@ int art_liberar(t_LstArticulos *l) t_Articulo *art_obtener(t_LstArticulos *lst, const char *numero) { - /* FIXME : NO ME GUSTA :-/ */ t_Articulo *art; + t_Reg_Articulo *nodo; void *tmp; - int i, error = 0; + int error = 0; EMUFS_REG_SIZE size; int n = atoi(numero); if (lst == NULL) lst = lst_articulos; if (lst == NULL) return NULL; - for(i=0; icant; i++) { - if (n == lst->array[i].numero) { + 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 */ - tmp = lst->fp->leer_registro(lst->fp, lst->array[i].num_reg, &size, &error); + tmp = lst->fp->leer_registro(lst->fp, nodo->num_reg, &size, &error); if (error) { free(art); @@ -153,6 +197,7 @@ t_Articulo *art_obtener(t_LstArticulos *lst, const char *numero) free(tmp); return art; } + nodo = nodo->sig; } return NULL; @@ -177,7 +222,7 @@ void art_modificar(char *s) WINDOW *win; t_Form *form; t_Articulo *articulo; - char num[8]; + char num[11]; win = newwin(8, COLS-2, 13, 1); box(win, 0, 0); @@ -187,7 +232,7 @@ void art_modificar(char *s) if (articulo != NULL) { form = form_crear(win); - sprintf(num, "%07d", articulo->numero); + sprintf(num, "%08d", articulo->numero); form_agregar_widget(form, INPUT, "Numero de Artículo", 8, num); form_agregar_widget(form, INPUT, "Descripción", 50, articulo->desc); form_agregar_widget(form, INPUT, "Presentación", 30, articulo->presentacion); @@ -216,7 +261,7 @@ void art_eliminar(char *s) { WINDOW *win; t_Articulo *articulo; - int i; + t_Reg_Articulo *nodo; win = newwin(8, COLS-2, 13, 1); box(win, 0, 0); wrefresh(win); @@ -230,12 +275,14 @@ void art_eliminar(char *s) wrefresh(win); getch(); } else { - for(i=0; icant; i++) { - if (lst_articulos->array[i].numero == articulo->numero) { - lst_articulos->array[i].numero = -1; - lst_articulos->fp->borrar_registro(lst_articulos->fp, lst_articulos->array[i].num_reg); + nodo = lst_articulos->primero; + while (nodo) { + if (nodo->numero == articulo->numero) { + lst_articulos->fp->borrar_registro(lst_articulos->fp, nodo->num_reg); + eliminar_nodo_articulo(lst_articulos, nodo); break; } + nodo = nodo->sig; } free(articulo); } @@ -250,9 +297,11 @@ void art_agregar(char *s) WINDOW *win; t_Form *form; t_Articulo art; + t_Reg_Articulo *nuevo; void *save; - int error = 0, existe, i; + int error = 0, existe; EMUFS_REG_SIZE size; + EMUFS_REG_ID id; win = newwin(8, COLS-2, 13, 1); box(win, 0, 0); @@ -269,11 +318,13 @@ void art_agregar(char *s) art.numero = atoi(form_obtener_valor_char(form, "Numero de Artículo")); existe = 0; - for(i=0; icant; i++) { - if (art.numero == lst_articulos->array[i].numero) { + nuevo = lst_articulos->primero; + while (nuevo) { + if (art.numero == nuevo->numero) { existe = 1; break; } + nuevo = nuevo->sig; } if (!existe) { @@ -287,16 +338,16 @@ void art_agregar(char *s) /* 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) { - lst_articulos->array[lst_articulos->cant].num_reg = lst_articulos->fp->grabar_registro(lst_articulos->fp, save, size, &error); + id = lst_articulos->fp->grabar_registro(lst_articulos->fp, save, size, &error); if (error) { wattron(win, COLOR_PAIR(COLOR_YELLOW)); mvwaddstr(win, 6, 4, "Error al tratar de agregar el nuevo registro"); wattroff(win, COLOR_PAIR(COLOR_YELLOW)); wrefresh(win); getch(); + } else { + agregar_nodo_articulo(lst_articulos, crear_nodo_articulo(id, art.numero)); } - lst_articulos->array[lst_articulos->cant].numero = art.numero; - lst_articulos->cant++; free(save); } } else { @@ -350,10 +401,7 @@ int procesar_leer_articulo(t_Articulo *dst, void *src, EMUFS_REG_SIZE size, t_Ls break; case T3: - if (size != sizeof(t_Articulo)) { - return 0; /* El tamaño no encaja!! */ - } - memcpy(dst, src, size); + memcpy(dst, src, sizeof(t_Articulo)); } return 1; /* Todo ok */