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