]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs_gui/viewer.c
* BUGFIX : Estaba siendo olvidado verificar de no sobrepasar
[z.facultad/75.06/emufs.git] / emufs_gui / viewer.c
1
2 #include "viewer.h"
3 #include "idx.h"
4 #include "articulos.h"
5 #include "facturas.h"
6 #include "gui.h"
7
8 /* Se encarga de reemplazar los \0 un caracter visual, y segurar un \0 al final */
9 static char *procesar_registro_articulo_tipo3(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho);
10 static char *procesar_registro_articulo_tipo1(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho);
11
12 static char *procesar_registro_factura_tipo3(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho);
13 static char *procesar_registro_factura_tipo1(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho);
14
15 static int preguntar_id(WINDOW *win, EMUFS *fp);
16
17 void mostrar_info(WINDOW *padre, int h, int offset_alto, int opt)
18 {
19         /* Info de teclas */
20         wattron(padre, A_BOLD);
21         wattron(padre, COLOR_PAIR(COLOR_RED));
22         mvwaddstr(padre, h-offset_alto+1, 5, "Teclas :");
23         wattroff(padre, A_BOLD);
24         wattroff(padre, COLOR_PAIR(COLOR_RED));
25         mvwaddstr(padre, h-offset_alto+2, 8, "Salir = ENTER");
26         mvwaddstr(padre, h-offset_alto+3, 8, "Scroll = A/Z");
27         mvwaddstr(padre, h-offset_alto+4, 8, "Seleccionar registros = K/L");
28         if (opt) {
29                 mvwaddstr(padre, h-offset_alto+5, 8, "Acciones: ");
30                 waddstr(padre, "A");
31                 wattron(padre, A_BOLD);
32                 waddch(padre, 'g');
33                 wattroff(padre, A_BOLD);
34                 waddstr(padre, "regar ");
35                 wattron(padre, A_BOLD);
36                 waddstr(padre, "M");
37                 wattroff(padre, A_BOLD);
38                 waddstr(padre, "ofidicar ");
39                 wattron(padre, A_BOLD);
40                 waddstr(padre, "E");
41                 wattroff(padre, A_BOLD);
42                 waddstr(padre, "liminar ");
43         }
44         mvwaddstr(padre, h-offset_alto+6, 8, "Buscar ID : B");
45         
46         /* Info de leyenda */
47         wattron(padre, A_BOLD);
48         wattron(padre, COLOR_PAIR(COLOR_RED));
49         mvwaddstr(padre, h-offset_alto+1, 45, "Leyenda :");
50         wattroff(padre, A_BOLD);
51         wattroff(padre, COLOR_PAIR(COLOR_RED));
52         mvwaddstr(padre, h-offset_alto+2, 48, "  |   = Separador de campo");
53         mvwaddstr(padre, h-offset_alto+3, 48, "[XXX] = Campo numerico");
54         mvwaddstr(padre, h-offset_alto+4, 48, "(XXX) = ID de registro");
55         mvwaddstr(padre, h-offset_alto+5, 48, "{XXX} = Tam. de registro");
56         mvwaddstr(padre, h-offset_alto+6, 48, "  .   = Esp. Libre");
57 }
58
59 char *juntar_memoria(char *s1, char *s2, char *s3, int size1, int size2, int size3)
60 {
61         char *salida;
62         int tam=0;
63         if (s1) tam += size1;
64         if (s2) tam += size2;
65         if (s3) tam += size3;
66         salida = (char *)malloc(tam);
67         if (salida == NULL) {
68                         free(s1);
69                         free(s2);
70                         free(s3);
71                         return NULL;
72         }
73
74         if (s1) memcpy(salida, s1, size1);
75         if (s2) memcpy(salida+size2, s2, size2);
76         if (s3) memcpy(salida+size2+size3, s3, size3);
77         if (s1) free(s1);
78         if (s2) free(s2);
79         if (s3) free(s3);
80         return salida;
81 }
82
83 void ver_bloques(WINDOW *padre, int w, int h, int cual)
84 {
85         /* Ventanas donde mostrar las cosas */
86         char *(*procesar)(EMUFS*, char*, EMUFS_REG_SIZE*, int*, int*);
87         WINDOW *actual[2], *dlg;
88         EMUFS_REG_SIZE size, size_actual, size_siguiete, size_anterior;
89         int scroll, actual_ancho;
90         int max_scroll, c, offset_alto;
91         /* Indices que hay validos en IDX */
92         EMUFS_REG_ID indices_total, indices_actual;
93         char *bloque_actual, *bloque_anterior, *bloque_siguiente;
94         char *data; /* Registros a mostrar en pantalla */
95         EMUFS *fp;
96         int pos_actual, ancho_registro, offset, pos;
97         EMUFS_Estadisticas stats;
98
99         if (cual == 0)
100                 fp = emufs_abrir("articulos");
101         else if (cual == 1)
102                 fp = emufs_abrir("facturas");
103         else if (cual == 2)
104                 fp = emufs_abrir("notas");
105         
106         stats = fp->leer_estadisticas(fp);
107                                         
108         wattron(padre, COLOR_PAIR(COLOR_BLUE));
109         mvwaddstr(padre, 0, 0, "Tipo de archivo : ");
110         wattroff(padre, COLOR_PAIR(COLOR_BLUE));
111         switch (fp->tipo) {
112                 case T1:
113                         waddstr(padre, "Registro variable con bloque parametrizado.");
114                         if (cual == 0)
115                                 procesar = procesar_registro_articulo_tipo1;
116                         else
117                                 procesar = procesar_registro_factura_tipo1;
118                 break;
119                 case T2:
120                         waddstr(padre, "Registro variable sin bloques.");
121                         actual[0] = msg_box(padre, w, h, "El tipo de archivo no contiene bloques.");
122                         getch();
123                         msg_box_free(padre, actual[0]);
124                         return;
125                 break;
126                 case T3:
127                         if (cual == 0)
128                                 procesar = procesar_registro_articulo_tipo3;
129                         else
130                                 procesar = procesar_registro_factura_tipo3;
131                         waddstr(padre, "Registro fijo con bloque parametrizado.");
132         }
133
134
135         indices_actual = 0;
136         indices_total = stats.cant_bloques; 
137         /* Leo */
138         fp->leer_bloque_raw(fp, indices_actual, &bloque_actual, &bloque_anterior, &bloque_siguiente, &size_actual, &size_anterior, &size_siguiete);
139         pos_actual = 0;
140         bloque_actual = procesar(fp, bloque_actual, &size_actual, &pos_actual, &ancho_registro);
141         pos_actual = 0;
142         bloque_siguiente = procesar(fp, bloque_siguiente, &size_siguiete, &pos_actual, &ancho_registro);
143         pos_actual = 0;
144         bloque_anterior = procesar(fp, bloque_anterior, &size_anterior, &pos_actual, &ancho_registro);
145         if (!bloque_siguiente) {
146                 bloque_siguiente = (char *)malloc(size_siguiete);
147                 memset(bloque_siguiente, 0, size_siguiete);
148         }
149         if (!bloque_anterior) {
150                 bloque_anterior = (char *)malloc(size_anterior);
151                 memset(bloque_anterior, 0, size_anterior);
152         }
153         pos_actual = size_anterior; /* Resalta desde el fin del bloque anterior */
154         ancho_registro = size_actual;
155         data = juntar_memoria(bloque_anterior, bloque_actual, bloque_siguiente, size_anterior, size_actual, size_siguiete);
156
157         PERR("HASTA ACA VOY BIEN");
158         offset_alto = 8;
159         max_scroll = (size_actual+size_anterior+size_siguiete) / (w-4) - (h-offset_alto-2);
160         if (max_scroll < 0) max_scroll = 0;
161
162         actual[0] = derwin(padre, h-offset_alto, w-2, 1, 1);
163         actual_ancho = w-4;
164         actual[1] = derwin(actual[0], h-offset_alto-2, w-4, 1, 1);
165         box(actual[0], 0, 0);
166
167         curs_set(0);
168
169         mostrar_info(padre, h, offset_alto, 0);
170         
171         mvwaddnstr(actual[1], 0, 0, data, pos_actual);
172         wattron(actual[1], A_BOLD);
173         waddnstr(actual[1], data+pos_actual, ancho_registro);
174         wattroff(actual[1], A_BOLD);
175         waddnstr(actual[1], data+pos_actual+ancho_registro, size-(pos_actual+ancho_registro));
176         
177         wrefresh(actual[1]);
178         wrefresh(actual[0]);
179         wrefresh(padre);
180         scroll = 0;
181         while ((c=getch()) != 13) {
182                 switch (c) {
183                         case 'b':
184                         case 'B':
185                                 dlg = newwin(4, 50, h/2-2, w/2-25);
186                                 box(dlg, 0, 0);
187                                 indices_actual = preguntar_id(dlg, fp);
188                                 if (indices_actual < 0) indices_actual = 0;
189                                 if (indices_actual > indices_total) indices_actual = indices_total-1;
190                                 werase(dlg);
191                                 wrefresh(dlg);
192                                 delwin(dlg);
193                                 wrefresh(padre);
194                                 curs_set(0);
195                         break;
196                         case 'a': /* Scroll */
197                                 scroll--;
198                                 if (scroll < 0) scroll = 0;
199                         break;
200                         case 'z': /* Scroll */
201                                 scroll++;
202                                 if (scroll > max_scroll) scroll = max_scroll;
203                         break;
204                         case 'l':
205                                 if (indices_actual < indices_total) {
206                                         indices_actual++;
207                                         if (indices_actual >= indices_total) indices_actual = indices_total-1;
208                                         if (data) free(data);
209                                         fp->leer_bloque_raw(fp, indices_actual, &bloque_actual, &bloque_anterior, &bloque_siguiente, &size_actual, &size_anterior, &size_siguiete);
210                                         bloque_actual = procesar(fp, bloque_actual, &size_actual, &pos_actual, &ancho_registro);
211                                         bloque_siguiente = procesar(fp, bloque_siguiente, &size_siguiete, &pos_actual, &ancho_registro);
212                                         bloque_anterior = procesar(fp, bloque_anterior, &size_anterior, &pos_actual, &ancho_registro);
213                                         pos_actual = size_anterior; /* Resalta desde el fin del bloque anterior */
214                                         ancho_registro = size_actual;
215                                         data = juntar_memoria(bloque_anterior, bloque_actual, bloque_siguiente, size_anterior, size_actual, size_siguiete);
216                                 }
217                         break;
218                         case 'k':
219                                 if (indices_actual != EMUFS_NOT_FOUND) {
220                                         indices_actual--;
221                                         if (indices_actual == EMUFS_NOT_FOUND) indices_actual = 0;
222                                         if (data) free(data);
223                                         fp->leer_bloque_raw(fp, indices_actual, &bloque_actual, &bloque_anterior, &bloque_siguiente, &size_actual, &size_anterior, &size_siguiete);
224                                         bloque_actual = procesar(fp, bloque_actual, &size_actual, &pos_actual, &ancho_registro);
225                                         bloque_siguiente = procesar(fp, bloque_siguiente, &size_siguiete, &pos_actual, &ancho_registro);
226                                         bloque_anterior = procesar(fp, bloque_anterior, &size_anterior, &pos_actual, &ancho_registro);
227                                         pos_actual = size_anterior; /* Resalta desde el fin del bloque anterior */
228                                         ancho_registro = size_actual;
229                                         data = juntar_memoria(bloque_anterior, bloque_actual, bloque_siguiente, size_anterior, size_actual, size_siguiete);
230                                 }
231                 }
232                 /* Borro las ventanas */
233                 werase(actual[1]);
234
235                 /* Imprimo los registros */
236                 if (data) {
237                         offset = scroll*actual_ancho; /* Cantidad de caracteres que tengo que saltar */
238                         pos = pos_actual - offset; /* Cantidad de caracteres que hay antes de mi a imprimir */
239                         mvwaddnstr(actual[1], 0, 0, data+offset, pos);
240                         if (pos > 0)
241                                 offset += pos;
242                         else
243                                 offset -= pos;
244                         wattron(actual[1], A_BOLD);
245                         waddnstr(actual[1], data+offset, ancho_registro+((pos<0)?pos:0));
246                         wattroff(actual[1], A_BOLD);
247                         offset += ancho_registro+((pos<0)?pos:0);
248                         waddnstr(actual[1], data+offset, size-offset);
249                 }
250
251                 wrefresh(actual[1]);
252                 wrefresh(padre);
253         }
254         if (data) free(data);
255
256         emufs_destruir(fp);
257         delwin(actual[0]);
258         wrefresh(padre);
259         curs_set(1);
260 }
261
262 void ver_registros(WINDOW *padre, int w, int h, int cual)
263 {
264         /* Ventanas donde mostrar las cosas */
265         char *(*procesar)(EMUFS*, char*, EMUFS_REG_SIZE*, int*, int*);
266         WINDOW *actual[2], *dlg;
267         EMUFS_REG_SIZE size;
268         int scroll, actual_ancho;
269         int max_scroll, c, offset_alto;
270         /* Indices que hay validos en IDX */
271         EMUFS_REG_ID *indices, indices_total, indices_actual;
272         char *data; /* Registros a mostrar en pantalla */
273         char codigo[50]; /* Variable para guardar el codigo actual para mandar a modificar */
274         EMUFS *fp;
275         int pos_actual, ancho_registro, offset, pos;
276
277         if (cual == 0)
278                 fp = emufs_abrir("articulos");
279         else
280                 fp = emufs_abrir("facturas");
281
282         wattron(padre, COLOR_PAIR(COLOR_BLUE));
283         mvwaddstr(padre, 0, 0, "Tipo de archivo : ");
284         wattroff(padre, COLOR_PAIR(COLOR_BLUE));
285         switch (fp->tipo) {
286                 case T1:
287                         waddstr(padre, "Registro variable con bloque parametrizado.");
288                         if (cual == 0)
289                                 procesar = procesar_registro_articulo_tipo1;
290                         else
291                                 procesar = procesar_registro_factura_tipo1;
292                 break;
293                 case T2:
294                         waddstr(padre, "Registro variable sin bloques.");
295                 break;
296                 case T3:
297                         if (cual == 0)
298                                 procesar = procesar_registro_articulo_tipo3;
299                         else
300                                 procesar = procesar_registro_factura_tipo3;
301                         waddstr(padre, "Registro fijo con bloque parametrizado.");
302         }
303
304         indices = emufs_idx_get(fp, &indices_total);
305
306         indices_actual = 0;
307         if (indices) {
308                 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
309                 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
310         }
311
312
313         offset_alto = 8;
314         max_scroll = size / (w-4) - (h-offset_alto-2);
315         if (max_scroll < 0) max_scroll = 0;
316
317         actual[0] = derwin(padre, h-offset_alto, w-2, 1, 1);
318         actual_ancho = w-4;
319         actual[1] = derwin(actual[0], h-offset_alto-2, w-4, 1, 1);
320         box(actual[0], 0, 0);
321
322         curs_set(0);
323
324         mostrar_info(padre, h, offset_alto, 1);
325         
326         mvwaddnstr(actual[1], 0, 0, data, pos_actual);
327         wattron(actual[1], A_BOLD);
328         waddnstr(actual[1], data+pos_actual, ancho_registro);
329         wattroff(actual[1], A_BOLD);
330         waddnstr(actual[1], data+pos_actual+ancho_registro, size-(pos_actual+ancho_registro));
331         
332         wrefresh(actual[1]);
333         wrefresh(actual[0]);
334         wrefresh(padre);
335         scroll = 0;
336         while ((c=getch()) != 13) {
337                 switch (c) {
338                         case 'b':
339                         case 'B':
340                                 dlg = newwin(4, 50, h/2-2, w/2-25);
341                                 box(dlg, 0, 0);
342                                 preguntar_id(dlg, fp);
343                                 werase(dlg);
344                                 wrefresh(dlg);
345                                 delwin(dlg);
346                                 wrefresh(padre);
347                                 curs_set(0);
348                         break;
349                         case 'e':
350                         case 'E':
351                                 if (indices_actual != EMUFS_NOT_FOUND)
352                                         fp->borrar_registro(fp, indices[indices_actual]);
353         
354                                 free(indices);
355                                 indices = emufs_idx_get(fp, &indices_total);
356                                 if (indices_actual >= indices_total) {
357                                         indices_actual = indices_total - 1;
358                                 }
359                                 
360                                 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
361                                 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
362                         break;
363                         case 'g':
364                         case 'G':
365                                 if (cual == 0)
366                                         art_agregar(NULL);
367                                 else
368                                         fact_agregar(NULL);
369                                 free(data);
370                                 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
371                                 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
372         
373                                 free(indices);
374                                 indices = emufs_idx_get(fp, &indices_total);
375
376                                 /* Tengo que re-pintar algunas cosas */
377                                 mostrar_info(padre, h, offset_alto, 1);
378                                 box(actual[0], 0, 0);
379                                 wrefresh(actual[0]);
380                         break;                  
381                         case 'M':
382                         case 'm': /* Quiero editar !!! */
383                                 sprintf(codigo, "%lu", indices[indices_actual]);
384                                 if (cual == 0)
385                                         art_modificar(codigo);  
386                                 else
387                                         fact_modificar(codigo);
388                                 /* Vuelvo a cargar el articulo actual */
389                                 
390                                 free(data);
391                                 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
392                                 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
393
394                                 /* Tengo que re-pintar algunas cosas */
395                                 mostrar_info(padre, h, offset_alto, 1);
396                                 box(actual[0], 0, 0);
397                                 wrefresh(actual[0]);
398                         break;
399                         case 'a': /* Scroll */
400                                 scroll--;
401                                 if (scroll < 0) scroll = 0;
402                         break;
403                         case 'z': /* Scroll */
404                                 scroll++;
405                                 if (scroll > max_scroll) scroll = max_scroll;
406                         break;
407                         case 'l':
408                                 if (indices_actual < indices_total) {
409                                         indices_actual++;
410                                         if (indices_actual >= indices_total) indices_actual = indices_total-1;
411                                         if (data) free(data);
412                                         data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
413                                         data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
414                                 }
415                         break;
416                         case 'k':
417                                 if (indices_actual != EMUFS_NOT_FOUND) {
418                                         indices_actual--;
419                                         if (indices_actual == EMUFS_NOT_FOUND) indices_actual = 0;
420                                         if (data) free(data);
421                                         data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
422                                         data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
423                                 }
424
425                 }
426                 /* Borro las ventanas */
427                 werase(actual[1]);
428
429                 /* Imprimo los registros */
430                 if (data) {
431                         offset = scroll*actual_ancho;
432                         pos = pos_actual - offset;
433                         mvwaddnstr(actual[1], 0, 0, data+offset, pos);
434                         offset += pos;
435                         wattron(actual[1], A_BOLD);
436                         waddnstr(actual[1], data+offset, ancho_registro);
437                         wattroff(actual[1], A_BOLD);
438                         offset += ancho_registro;
439                         waddnstr(actual[1], data+offset, size-offset);
440                 }
441
442                 wrefresh(actual[1]);
443                 wrefresh(padre);
444         }
445         if (indices) free(indices);
446         if (data) free(data);
447
448         emufs_destruir(fp);
449         delwin(actual[0]);
450         wrefresh(padre);
451         curs_set(1);
452 }
453
454 char *procesar_registro_articulo_tipo3(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho)
455 {
456         char *tmp, *salida, *tmp1, pos_actualizada, ant;
457         int cant_header, i=0, j, tam_data;
458         if (ptr == NULL) return NULL;
459
460         /* Calculo cuantos headers de registros va a haber en el archivo */
461         if (emu->tam_bloque > emu->tam_reg) {
462                 cant_header = emu->tam_bloque / (emu->tam_reg+sizeof(EMUFS_REG_ID));
463                 if (cant_header == 0) cant_header++; /* Si tam_reg > tam_bloque, voy a tener solo 1 header */
464                 tam_data = sizeof(t_Articulo)-sizeof(unsigned int);
465         } else {
466                 cant_header = 1;
467                 tam_data = *size - sizeof(EMUFS_REG_ID)-sizeof(unsigned int);
468         }
469
470         /* El tamaño del nuevo array lo calculo asi :
471          *   
472          *   tamañoviejo - tamaño_headers_en_int - tamaño_ints_en_registro
473          *               + 10*(cant_headers+cant_registros) +1
474          *
475          *   En tipo3, la cantidad de headers y cant de registros es la misma
476          *   El 10 es por : (XXXXXXXX)
477          *   +1 == Por el \0
478          */
479         salida = (char *)malloc((*size)-sizeof(unsigned int)*cant_header*2 + 2*cant_header*10+1);
480         if (salida == NULL) {
481                 return NULL;
482         }
483         tmp = ptr;
484         tmp1 = salida;
485         pos_actualizada = 0;
486         while (i<cant_header) {
487                 /* Verifico la pos_actual para el resaltado, asi queda coherente 
488                  * en el cambio de formato
489                  */
490                 if (((tmp - ptr) == *pos_actual) && (!pos_actualizada)) {
491                         (*pos_actual) = tmp1-salida;
492                         pos_actualizada = 1;
493                 }
494                 /* Pongo el ID del registro */
495                 sprintf(tmp1, "(%08lu)", *((EMUFS_REG_ID *)tmp));
496                 tmp1 += 10;
497                 tmp += sizeof(EMUFS_REG_ID);
498                 /* Pongo el campo numero del registro */
499                 sprintf(tmp1, "[%08d]", *((unsigned int *)tmp));
500                 tmp1 += 10;
501                 tmp += sizeof(unsigned int);
502                 j = 0;
503                 while (j < (tam_data)) {
504                         if (*tmp == '\0') {
505                                 if (ant == (*tmp))
506                                         (*tmp1) = '.';
507                                 else
508                                         (*tmp1) = '|';
509                         } else {
510                                 (*tmp1) = (*tmp);
511                         }
512                         ant = (*tmp);
513                         tmp++;
514                         tmp1++;
515                         j++;
516                 }
517                 i++;
518         }
519         free(ptr);
520         
521         if (emu->tam_bloque > emu->tam_reg) {
522                 (*size) = (*size)-sizeof(unsigned int)*cant_header*2+2*cant_header*10+1;
523                 (*ancho) = sizeof(t_Articulo)-sizeof(unsigned int)*2+20+1;
524         } else {
525                 (*size) = (*size)-sizeof(EMUFS_REG_ID)-sizeof(unsigned int)+21;
526                 (*ancho) = (*size);
527         }
528         memset(tmp1, '.', (*size)-(tmp1-salida)); 
529         salida[*size-1] = '\0';
530
531         return salida;
532 }
533
534 char *procesar_registro_articulo_tipo1(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho)
535 {
536         EMUFS_REG_SIZE offset, curr_size;
537         char *tmp, *salida, *tmp1, pos_actualizada, ant;
538         int cant_header, i=0, j;
539         if (ptr == NULL) return NULL;
540         
541         /* Cuento la cantidad de registros en este bloque */
542         cant_header = 0;
543         offset = 0;
544         do {
545                 /* Me salto el ID, que no me interesa saber su valor */
546                 offset += sizeof(EMUFS_REG_ID);
547                 /* Copio el tamaño del registro de la cabecera. */
548                 memcpy(&curr_size, ptr + offset, sizeof(EMUFS_REG_SIZE));
549                 offset += sizeof(EMUFS_REG_SIZE);
550
551                 /* Desplazo el offset */
552                 if (curr_size == 0) {
553                         /* Si el tamaño de registro es 0, quiere decir que llegue a la
554                          * parte que esta vacia */
555                         break;
556                 } else {
557                         cant_header++;
558                         offset += curr_size;
559                 }
560         } while (offset+sizeof(EMUFS_REG_SIZE)+sizeof(EMUFS_REG_ID) < (*size));
561
562         /* Proceso */
563         salida = (char *)malloc((*size)-sizeof(unsigned int)*cant_header*3 + 3*cant_header*10+1);
564         tmp = ptr;
565         tmp1 = salida;
566         pos_actualizada = 0;
567         while (i<cant_header) {
568                 /* Verifico la pos_actual para el resaltado, asi queda coherente 
569                  * en el cambio de formato
570                  */
571                 if (((tmp - ptr) == *pos_actual) && (!pos_actualizada)) {
572                         (*pos_actual) = tmp1-salida;
573                         pos_actualizada = 1;
574                 }
575                 /* Pongo el ID del registro */
576                 sprintf(tmp1, "(%08lu)", *((EMUFS_REG_ID *)tmp));
577                 tmp1 += 10;
578                 tmp += sizeof(EMUFS_REG_ID);
579                 /* Pongo el tamaño del registro */
580                 sprintf(tmp1, "{%08lu}", *((EMUFS_REG_SIZE *)tmp));
581                 curr_size = *((EMUFS_REG_SIZE *)tmp);
582                 if (pos_actualizada == 1) {
583                         (*ancho) = curr_size-sizeof(unsigned int)+30;
584                         pos_actualizada = 2;
585                 }
586                 tmp1 += 10;
587                 tmp += sizeof(EMUFS_REG_SIZE);
588                 /* Pongo el campo numero del registro */
589                 sprintf(tmp1, "[%08d]", *((unsigned int *)tmp));
590                 tmp1 += 10;
591                 tmp += sizeof(unsigned int);
592                 j = sizeof(unsigned int);
593                 PERR("Voy aca");
594                 while (j < curr_size) {
595                         if (*tmp == '\0') {
596                                 if (ant == (*tmp))
597                                         (*tmp1) = '.';
598                                 else
599                                         (*tmp1) = '|';
600                         } else {
601                                 (*tmp1) = (*tmp);
602                         }
603                         ant = (*tmp);
604                         tmp++;
605                         tmp1++;
606                         j++;
607                 }
608                 PERR("Y hasta todo bien");
609                 i++;
610         }
611         /* Tengo que trabajar sobre lo que me falte (seguro es espacio libre) */
612         (*size) = (*size)-sizeof(unsigned int)*cant_header*3+3*cant_header*10+1;
613         memset(tmp1, '.', (*size)-(tmp1-salida)); 
614         free(ptr);
615         salida[*size-1] = '\0';
616         
617         return salida;
618 }
619
620 int preguntar_id(WINDOW *win, EMUFS *fp)
621 {
622         int n=-1;
623         t_Form *form = form_crear(win);
624         form_agregar_widget(form, INPUT, "ID a buscar", 8, "");
625
626         do {
627                 form_set_valor(form, "ID a buscar", "");
628                 form_ejecutar(form, 1,1);
629
630                 n = form_obtener_valor_int(form, "ID a buscar");
631         } while (n>0);
632
633         form_destruir(form);
634         return n;
635 }
636
637 char *procesar_registro_factura_tipo3(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho)
638 {
639         char *tmp, *salida, *tmp1, pos_actualizada, ant;
640         char flotante[10];
641         int cant_header, i=0, j, tam_data, k;
642         int cant_items;
643         if (ptr == NULL) return NULL;
644
645         PERR("Empieza el baile");
646
647         /* Calculo cuantos headers de registros va a haber en el archivo */
648         if (emu->tam_bloque > emu->tam_reg) {
649                 cant_header = emu->tam_bloque / (emu->tam_reg+sizeof(EMUFS_REG_ID));
650                 if (cant_header == 0) cant_header++; /* Si tam_reg > tam_bloque, voy a tener solo 1 header */
651                 tam_data = emu->tam_reg-sizeof(int)*3-sizeof(float)-sizeof(EMUFS_BLOCK_ID);
652         } else {
653                 cant_header = 1;
654                 tam_data = (*size) - sizeof(EMUFS_REG_ID)-sizeof(int)*3-sizeof(float)-sizeof(EMUFS_BLOCK_ID);
655         }
656
657         /* El tamaño del nuevo array lo calculo asi :
658          *   
659          */
660         tmp1 = salida = (char *)malloc(1000000); /*(*size)-(sizeof(char *)+sizeof(t_Item *)+sizeof(EMUFS_REG_ID)+sizeof(int)*3+sizeof(float)+sizeof(EMUFS_BLOCK_ID))*cant_header + 5*cant_header*10+1);*/
661         if (salida == NULL) {
662                 PERR("Error de malloc en salida");
663                 return NULL;
664         }
665         tmp = ptr;
666         pos_actualizada = 0;
667         (*ancho) = 0;
668         while (i<cant_header) {
669                 /* Verifico la pos_actual para el resaltado, asi queda coherente 
670                  * en el cambio de formato
671                  */
672                 if (((tmp - ptr) == *pos_actual) && (!pos_actualizada)) {
673                         (*pos_actual) = tmp1-salida;
674                         pos_actualizada = 1;
675                 }
676                 /* Pongo el ID del registro */
677                 sprintf(tmp1, "(%08lu)", *((EMUFS_REG_ID *)tmp));
678                 tmp1 += 10;
679                 tmp += sizeof(EMUFS_REG_ID);
680                 /* Pongo el campo numero */
681                 sprintf(tmp1, "[%08d]", *((int *)tmp));
682                 tmp1 += 10;
683                 tmp += sizeof(int);
684                 /* Pongo campo procdoi */
685                 sprintf(flotante, "[%5.2f]", *((float *)tmp));
686                 memcpy(tmp1, flotante, strlen(flotante));
687                 tmp1 += strlen(flotante);
688                 tmp += sizeof(float);
689                 /* Pongo campo numero_remito */
690                 sprintf(tmp1, "[%08d]", *((int *)tmp));
691                 tmp1 += 10;
692                 tmp += sizeof(int);
693                 /* Pongo numero de items */
694                 sprintf(tmp1, "[%08d]", *((int *)tmp));
695                 cant_items = *((int *)tmp);
696                 tmp1 += 10;
697                 tmp += sizeof(int);
698                 /* Pongo reg_nota */
699                 sprintf(tmp1, "(%08lu)", *((EMUFS_BLOCK_ID*)tmp));
700                 tmp1 += 10;
701                 tmp += sizeof(EMUFS_BLOCK_ID);
702
703                 if (pos_actualizada == 1) {
704                         (*ancho) = 50+strlen(flotante);
705                 }
706                 j = 0;
707                 while (j < (tam_data-10*sizeof(t_Item))) {
708                         if (*tmp == '\0') {
709                                 if (ant == (*tmp)){
710                                         (*tmp1) = '.';
711                                 } else {
712                                         (*tmp1) = '|';
713                                 }
714                         } else {
715                                 (*tmp1) = (*tmp);
716                         }
717                         ant = (*tmp);
718                         tmp++;
719                         tmp1++;
720                         if (pos_actualizada == 1)
721                                 (*ancho)++;
722                         j++;
723                 }
724                 /* Ahora proceso los items */
725                 k = 0;
726                 while (k < 10) {
727                         sprintf(tmp1, "[%08d]", *((int *)tmp));
728                         tmp1 += 10;
729                         tmp += sizeof(int);
730                         if (pos_actualizada == 1)
731                                 (*ancho)+=10;
732                         j = 0;
733                         while (j < (sizeof(t_Item)-sizeof(int))) {
734                                 if (*tmp == '\0') {
735                                         if (ant == (*tmp)){
736                                                 (*tmp1) = '.';
737                                         } else {
738                                                 (*tmp1) = '|';
739                                         }
740                                 } else {
741                                         (*tmp1) = (*tmp);
742                                 }
743                                 ant = (*tmp);
744                                 tmp++;
745                                 tmp1++;
746                                 if (pos_actualizada == 1)
747                                         (*ancho)++;
748                                 j++;
749                         }
750                         k++;
751                 }
752                 if (pos_actualizada == 1)
753                         pos_actualizada = 2;
754                 i++;
755         }
756         free(ptr);
757
758         PERR("Termine");
759         if (emu->tam_bloque > emu->tam_reg) {
760                 (*size) = tmp1-salida;
761         } else {
762                 (*size) = tmp1-salida;
763                 (*ancho) = tmp1-salida;
764         }
765         salida[*size-1] = '\0';
766
767         return salida;
768 }
769
770 char *procesar_registro_factura_tipo1(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho)
771 {
772         char *tmp, *salida, *tmp1, pos_actualizada, ant;
773         EMUFS_REG_SIZE offset, curr_size;
774         char flotante[10];
775         int cant_header, i=0, j, tam_data, k;
776         int cant_items;
777         if (ptr == NULL) return NULL;
778
779         PERR("Empieza el baile");
780         cant_header = 0;
781         offset = 0;
782         do {
783                 /* Me salto el ID, que no me interesa saber su valor */
784                 offset += sizeof(EMUFS_REG_ID);
785                 /* Copio el tamaño del registro de la cabecera. */
786                 memcpy(&curr_size, ptr + offset, sizeof(EMUFS_REG_SIZE));
787                 offset += sizeof(EMUFS_REG_SIZE);
788
789                 /* Desplazo el offset */
790                 if (curr_size == 0) {
791                         /* Si el tamaño de registro es 0, quiere decir que llegue a la
792                          * parte que esta vacia */
793                         break;
794                 } else {
795                         cant_header++;
796                         offset += curr_size;
797                 }
798         } while (offset+sizeof(EMUFS_REG_SIZE)+sizeof(EMUFS_REG_ID) < (*size));
799
800         /* El tamaño del nuevo array lo calculo asi :
801          *   
802          */
803         tmp1 = salida = (char *)malloc(1000000); /*(*size)-(sizeof(char *)+sizeof(t_Item *)+sizeof(EMUFS_REG_ID)+sizeof(int)*3+sizeof(float)+sizeof(EMUFS_BLOCK_ID))*cant_header + 5*cant_header*10+1);*/
804         if (salida == NULL) {
805                 PERR("Error de malloc en salida");
806                 return NULL;
807         }
808         tmp = ptr;
809         pos_actualizada = 0;
810         (*ancho) = 0;
811         i = 0;
812         while (i<cant_header) {
813                 /* Verifico la pos_actual para el resaltado, asi queda coherente 
814                  * en el cambio de formato
815                  */
816                 if (((tmp - ptr) == *pos_actual) && (!pos_actualizada)) {
817                         (*pos_actual) = tmp1-salida;
818                         pos_actualizada = 1;
819                 }
820                 /* Pongo el ID del registro */
821                 sprintf(tmp1, "(%08lu)", *((EMUFS_REG_ID *)tmp));
822                 tmp1 += 10;
823                 tmp += sizeof(EMUFS_REG_ID);
824                 /* Cantidad de espacio que ocupa la data */
825                 sprintf(tmp1, "{%08lu}", *((EMUFS_REG_SIZE *)tmp));
826                 tam_data = *((EMUFS_REG_SIZE *)tmp) - sizeof(int)*3 - sizeof(float) - sizeof(EMUFS_BLOCK_ID);
827                 tmp1 += 10;
828                 tmp += sizeof(EMUFS_REG_SIZE);
829                 /* Pongo el campo numero */
830                 sprintf(tmp1, "[%08d]", *((int *)tmp));
831                 tmp1 += 10;
832                 tmp += sizeof(int);
833                 /* Pongo campo procdoi */
834                 sprintf(flotante, "[%5.2f]", *((float *)tmp));
835                 memcpy(tmp1, flotante, strlen(flotante));
836                 tmp1 += strlen(flotante);
837                 tmp += sizeof(float);
838                 /* Pongo campo numero_remito */
839                 sprintf(tmp1, "[%08d]", *((int *)tmp));
840                 tmp1 += 10;
841                 tmp += sizeof(int);
842                 /* Pongo numero de items */
843                 sprintf(tmp1, "[%08d]", *((int *)tmp));
844                 cant_items = *((int *)tmp);
845                 tmp1 += 10;
846                 tmp += sizeof(int);
847                 /* Pongo reg_nota */
848                 sprintf(tmp1, "(%08lu)", *((EMUFS_BLOCK_ID*)tmp));
849                 tmp1 += 10;
850                 tmp += sizeof(EMUFS_BLOCK_ID);
851
852                 if (pos_actualizada == 1) {
853                         (*ancho) = 60+strlen(flotante);
854                 }
855                 j = 0;
856                 PERR("Voy por la data");
857                 while (j < (tam_data-cant_items*sizeof(t_Item))) {
858                         if (*tmp == '\0') {
859                                 if (ant == (*tmp)){
860                                         (*tmp1) = '.';
861                                 } else {
862                                         (*tmp1) = '|';
863                                 }
864                         } else {
865                                 (*tmp1) = (*tmp);
866                         }
867                         ant = (*tmp);
868                         tmp++;
869                         tmp1++;
870                         if (pos_actualizada == 1)
871                                 (*ancho)++;
872                         j++;
873                 }
874                 /* Ahora proceso los items */
875                 k = 0;
876                 while (k < cant_items) {
877                         sprintf(tmp1, "[%08d]", *((int *)tmp));
878                         tmp1 += 10;
879                         tmp += sizeof(int);
880                         if (pos_actualizada == 1)
881                                 (*ancho)+=10;
882                         j = 0;
883                         while (j < (sizeof(t_Item)-sizeof(int))) {
884                                 if (*tmp == '\0') {
885                                         if (ant == (*tmp)){
886                                                 (*tmp1) = '.';
887                                         } else {
888                                                 (*tmp1) = '|';
889                                         }
890                                 } else {
891                                         (*tmp1) = (*tmp);
892                                 }
893                                 ant = (*tmp);
894                                 tmp++;
895                                 tmp1++;
896                                 if (pos_actualizada == 1)
897                                         (*ancho)++;
898                                 j++;
899                         }
900                         k++;
901                 }
902                 if (pos_actualizada == 1)
903                         pos_actualizada = 2;
904                 PERR(salida);
905                 i++;
906         }
907         /* llego no . hasta el final */
908         while (tmp < (ptr+(*size))) {
909                 (*tmp1) = '.';
910                 tmp1++;
911                 tmp++;
912         }
913         free(ptr);
914
915         PERR("Termine");
916         if (emu->tam_bloque > emu->tam_reg) {
917                 (*size) = tmp1-salida;
918         } else {
919                 (*size) = tmp1-salida;
920                 (*ancho) = tmp1-salida;
921         }
922         salida[*size-1] = '\0';
923
924         return salida;
925 }
926