for ( ; node ; node = node->next) {
if (node->type == XML_ELEMENT_NODE) {
if (strcmp(node->name, "ARTICULO") == 0) {
- strncpy(tmp->array[cant].numero, xmlGetProp(node, "NroArtículo"), 8);
+ tmp->array[cant].numero = atoi(xmlGetProp(node, "NroArtículo"));
strncpy(tmp->array[cant].desc, xmlGetProp(node, "Descripción"), 50);
strncpy(tmp->array[cant].presentacion, xmlGetProp(node, "Presentación"), 30);
strncpy(tmp->array[cant].existencia, xmlGetProp(node, "Existencia"), 8);
if (lst == NULL) lst = lst_articulos;
for(i=0; i<lst->cant; i++) {
- j = atoi(lst->array[i].numero);
+ j = lst->array[i].numero;
if (n == j)
return &lst->array[i];
}
WINDOW *win;
t_Form *form;
t_Articulo *articulo;
+ char num[8];
win = newwin(8, 68, 13, 1);
box(win, 0, 0);
if (articulo != NULL) {
form = form_crear(win);
- form_agregar_widget(form, INPUT, "Numero de Artículo", 8, articulo->numero);
+ sprintf(num, "%07d", 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);
form_agregar_widget(form, INPUT, "Stock Actual", 8, articulo->existencia);
typedef struct _articulo_ {
unsigned int idREG; /* Registro Fisico donde esta guardado */
- char numero[9];
+ int numero;
char desc[51];
char presentacion[31];
char existencia[9];
t_Form *form_crear(WINDOW *win)
{
t_Form *tmp = (t_Form *)malloc(sizeof(t_Form));
+ if (tmp == NULL) {
+ return NULL;
+ }
tmp->primero = tmp->ultimo = NULL;
tmp->win = win;
- /* TODO : El error se debe verificar afuera? */
return tmp;
}
int form_destruir(t_Form *f)
{
- t_Widget *tmp = f->primero;
+ t_Widget *tmp;
+ if (f == NULL) return 0;
+
+ tmp = f->primero;
while (tmp) {
f->primero = f->primero->sig;
{
t_Widget *tmp = NULL;
+ if (f == NULL) return;
+
/* Creo el nuevo widget segun el tipo */
switch (tipo) {
case INPUT:
int offset = 0, my_y, salida;
t_Widget *tmp = f->primero;
my_y = y-1;
- /* Pongo las etiquetas de los campos, y me fijo el mayor offset */
+
+ /* Calculo cual es la etiqueta más larga de FORM */
while (tmp) {
my_y++;
if (strlen(tmp->nombre) > offset)
tmp = f->primero;
my_y = y-1;
+ /* Agrego el etiqueta y el valor actual para cada elemento */
while (tmp) {
++my_y;
mvwaddstr(f->win, my_y, x, tmp->nombre);
waddch(f->win, ':');
waddch(f->win, ' ');
+ /* TODO : VER QUE SI ES UNA OPCION ES DISTINTO!! */
mvwaddstr(f->win, my_y, x+offset, tmp->valor);
tmp = tmp->sig;
}
tmp = f->primero;
my_y = y-1;
+ /* Ejecuto el formulario */
while (tmp) {
++my_y;
wmove(f->win, my_y, x+offset);
{
t_Widget *tmp = (t_Widget *)malloc(sizeof(t_Widget));
+ if (tmp == NULL) return NULL;
+
tmp->tipo = tipo;
tmp->nombre = (char *)malloc(sizeof(char)*(strlen(nombre)+1));
+ if (tmp->nombre == NULL) {
+ free(tmp);
+ return NULL;
+ }
strcpy(tmp->nombre, nombre);
tmp->max = max;
tmp->valor = (char *)malloc(sizeof(char)*(max+1));
+ if (tmp->valor == NULL) {
+ free(tmp->nombre);
+ free(tmp);
+ return NULL;
+ }
tmp->valor[0] = '\0';
strncpy(tmp->valor, defecto, max);
{
int ini, fin, actual;
t_Widget *tmp = (t_Widget *)malloc(sizeof(t_Widget));
+ if (tmp == NULL) {
+ return NULL;
+ }
tmp->tipo = tipo;
tmp->nombre = (char *)malloc(sizeof(char)*(strlen(nombre)+1));
+ if (tmp->nombre == NULL) {
+ free(tmp);
+ return NULL;
+ }
strcpy(tmp->nombre, nombre);
tmp->max = max;
tmp->opciones = (char **)malloc(sizeof(char*)*(max));
+ if (tmp->opciones == NULL) {
+ free(tmp->nombre);
+ free(tmp);
+ return NULL;
+ }
+
/* Parseo VALOR separado por comas */
actual = ini = 0;
fin = ini+1;
void widget_free(t_Widget *w)
{
int i;
+ if (w == NULL) return ;
+
free(w->nombre);
switch (w->tipo) {
case INPUT:
}
wrefresh(win);
- while ((c=getch()) != 13) {
+ c = getch();
+ while ((c != KEY_ENTER) && (c != 13)) {
/* Verifico si se apreto basckspace */
if (c == KEY_BACKSPACE) {
if (current > 0) {
/* Este va para dejar el cursor bien, ya que addch mueve el cursor*/
wmove(win, y, x+current);
wrefresh(win);
+ c = getch();
continue;
}
/* Si no entra mas, ignoro toda entrada */
- if (current >= w->max) continue;
-
+ if (current >= w->max) {
+ c = getch();
+ continue;
+ }
+
wmove(win, y, x+current);
waddch(win, c);
w->valor[current++] = c;
wrefresh(win);
+ c = getch();
}
/* Cierro el string con el \0 */
w->valor[current+1] = '\0';
* RADIO : Cantidad de Opciones
*/
unsigned int max;
+ /** Formato del campo de entrada */
+ char *format;
/** Siguiente elemento */
struct _elem_ *sig;
*/
void form_ejecutar(t_Form *f, int x, int y);
-/** Obtiene el valor asociado a un campo
+/** Obtiene el valor asociado a un campo como char *
*
* \param f Formulario.
* \param widget Nombre del campo.
*/
char *form_obtener_valor_char(t_Form *f, const char *widget);
+/** Obtiene el valor asociado a un campo como int
+ */
int form_obtener_valor_int(t_Form *f, const char *widget);
+/** Obtiene el valor asociado a un campo como float
+ */
float form_obtener_valor_float(t_Form *f, const char *widget);
#endif
}
/* Inicio Curses */
- signal(SIGINT, finish); /* arrange interrupts to terminate */
- initscr(); /* initialize the curses library */
- keypad(stdscr, TRUE); /* enable keyboard mapping */
- nonl(); /* tell curses not to do NL->CR/NL on output */
- cbreak(); /* take input chars one at a time, no wait for \n */
- noecho(); /* don't echo input */
-
- /* Verifico un tamaño minimo de consola */
- if ((LINES < 25) || (COLS < 80)) {
- endwin();
- printf("El tamaño de la consola debe ser de por lo menos 80x25!\n");
- return 1;
- }
-
- art_cargar(argv[1]);
-
+ signal(SIGINT, finish);
+ initscr();
+ keypad(stdscr, TRUE);
+ nonl();
+ cbreak();
+ noecho();
/* Si se soporta color, los inicializo */
if (has_colors()) {
start_color();
init_pair(COLOR_YELLOW, COLOR_YELLOW, COLOR_BLACK);
}
+ /* Verifico un tamaño minimo de consola */
+ if ((LINES < 25) || (COLS < 80)) {
+ endwin();
+ printf("El tamaño de la consola debe ser de por lo menos 80x25!\n");
+ return 1;
+ }
+
+ art_cargar(argv[1]);
+
/* Ventana, caracter para linea vertical, caracter para linea horizontal*/
box(stdscr, ACS_VLINE, ACS_HLINE);
/* Ventana, Y, X, Texto */
attroff(COLOR_PAIR(2));
wrefresh(stdscr);
+ /* CICLO PRINCIPAL DE LA APLICACION */
while ((c = main_menu()) != -1) {
switch (c) {
case 0:
curs_set(0);
opcion = -1;
salir = 0;
- while((!salir) && (c = getch()) != KEY_F(1)) {
+ while((!salir) && (c = getch())) {
switch(c) {
case KEY_DOWN:
menu_driver(menu, REQ_DOWN_ITEM);
menu_driver(menu, REQ_UP_ITEM);
break;
case 13:
- case 10: {
+ case 10:
+ {
ITEM *cur;
int i;