X-Git-Url: https://git.llucax.com/z.facultad/75.06/emufs.git/blobdiff_plain/8181701c8b718a9bdf2e70e9aab03352c4eaf457..087bc4de9c787d31ba4711af77af8620c4eae004:/emufs_gui/articulos.c diff --git a/emufs_gui/articulos.c b/emufs_gui/articulos.c index fc8841a..51f2b1b 100644 --- a/emufs_gui/articulos.c +++ b/emufs_gui/articulos.c @@ -9,25 +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; 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); @@ -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 { @@ -99,12 +143,10 @@ 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) { - 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; @@ -116,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; @@ -125,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); @@ -154,6 +197,7 @@ t_Articulo *art_obtener(t_LstArticulos *lst, const char *numero) free(tmp); return art; } + nodo = nodo->sig; } return NULL; @@ -217,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); @@ -231,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); } @@ -251,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); @@ -270,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) { @@ -288,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 {