10 /* Se encarga de reemplazar los \0 un caracter visual, y segurar un \0 al final */
11 static char *procesar_registro_tipo2(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho);
12 static char *procesar_registro_tipo3(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho);
13 static char *procesar_registro_tipo1(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho);
15 static int preguntar_id(WINDOW *win, EMUFS *fp);
17 void copy_char(char *dst, char *src)
19 /* Todos los espacidores los pongo iguales */
20 if (isspace(*src)) *dst = ' ';
21 else if (iscntrl(*src)) *dst = '*';
25 void mostrar_info(WINDOW *padre, int h, int offset_alto, int opt)
28 wattron(padre, A_BOLD);
29 wattron(padre, COLOR_PAIR(COLOR_RED));
30 mvwaddstr(padre, h-offset_alto+1, 5, "Teclas :");
31 wattroff(padre, A_BOLD);
32 wattroff(padre, COLOR_PAIR(COLOR_RED));
33 mvwaddstr(padre, h-offset_alto+2, 8, "Salir = ENTER");
34 mvwaddstr(padre, h-offset_alto+3, 8, "Scroll = A/Z");
35 mvwaddstr(padre, h-offset_alto+4, 8, "Seleccionar registros = K/L");
37 mvwaddstr(padre, h-offset_alto+5, 8, "Acciones: ");
39 wattron(padre, A_BOLD);
41 wattroff(padre, A_BOLD);
42 waddstr(padre, "regar ");
43 wattron(padre, A_BOLD);
45 wattroff(padre, A_BOLD);
46 waddstr(padre, "ofidicar ");
47 wattron(padre, A_BOLD);
49 wattroff(padre, A_BOLD);
50 waddstr(padre, "liminar ");
52 mvwaddstr(padre, h-offset_alto+6, 8, "Buscar ID : B");
55 wattron(padre, A_BOLD);
56 wattron(padre, COLOR_PAIR(COLOR_RED));
57 mvwaddstr(padre, h-offset_alto+1, 45, "Leyenda :");
58 wattroff(padre, A_BOLD);
59 wattroff(padre, COLOR_PAIR(COLOR_RED));
60 mvwaddstr(padre, h-offset_alto+2, 48, " | = Separador de campo");
61 mvwaddstr(padre, h-offset_alto+3, 48, "(XXX) = ID de registro");
62 mvwaddstr(padre, h-offset_alto+4, 48, "{XXX} = Tam. de registro");
63 mvwaddstr(padre, h-offset_alto+5, 48, " . = Esp. Libre");
66 char *juntar_memoria(char *s1, char *s2, char *s3, int size1, int size2, int size3)
73 salida = (char *)malloc(tam);
81 if (s1) memcpy(salida, s1, size1); else size1 = 0;
82 if (s2) memcpy(salida+size1, s2, size2); else size2 = 0;
83 if (s3) memcpy(salida+size1+size2, s3, size3);
90 void ver_bloques(WINDOW *padre, int w, int h, int cual)
92 /* Ventanas donde mostrar las cosas */
93 char *(*procesar)(EMUFS*, char*, EMUFS_REG_SIZE*, int*, int*);
94 WINDOW *actual[2], *dlg;
95 EMUFS_REG_SIZE size, size_actual, size_siguiete, size_anterior;
96 int scroll, actual_ancho;
97 int max_scroll, c, offset_alto;
98 /* Indices que hay validos en IDX */
99 EMUFS_REG_ID indices_total, indices_actual;
100 char *bloque_actual, *bloque_anterior, *bloque_siguiente;
101 char *data; /* Registros a mostrar en pantalla */
103 int pos_actual, ancho_registro, offset, pos;
104 EMUFS_Estadisticas stats;
107 fp = emufs_abrir("articulos");
109 fp = emufs_abrir("facturas");
111 fp = emufs_abrir("notas");
117 stats = fp->leer_estadisticas(fp);
119 wattron(padre, COLOR_PAIR(COLOR_BLUE));
120 mvwaddstr(padre, 0, 0, "Tipo de archivo : ");
121 wattroff(padre, COLOR_PAIR(COLOR_BLUE));
125 waddstr(padre, "Registro variable con bloque parametrizado.");
126 procesar = procesar_registro_tipo1;
129 waddstr(padre, "Registro variable sin bloques.");
130 actual[0] = msg_box(padre, w, h, "El tipo de archivo no contiene bloques.");
132 msg_box_free(padre, actual[0]);
137 procesar = procesar_registro_tipo3;
138 waddstr(padre, "Registro fijo con bloque parametrizado.");
143 indices_total = stats.cant_bloques;
145 fp->leer_bloque_raw(fp, indices_actual, &bloque_actual, &bloque_anterior, &bloque_siguiente, &size_actual, &size_anterior, &size_siguiete);
147 bloque_actual = procesar(fp, bloque_actual, &size_actual, &pos_actual, &ancho_registro);
149 bloque_siguiente = procesar(fp, bloque_siguiente, &size_siguiete, &pos_actual, &ancho_registro);
151 bloque_anterior = procesar(fp, bloque_anterior, &size_anterior, &pos_actual, &ancho_registro);
152 if (!bloque_siguiente) {
153 bloque_siguiente = (char *)malloc(size_siguiete);
154 memset(bloque_siguiente, 0, size_siguiete);
156 if (!bloque_anterior) {
157 bloque_anterior = (char *)malloc(size_anterior);
158 memset(bloque_anterior, 0, size_anterior);
160 pos_actual = size_anterior; /* Resalta desde el fin del bloque anterior */
161 ancho_registro = size_actual;
162 data = juntar_memoria(bloque_anterior, bloque_actual, bloque_siguiente, size_anterior, size_actual, size_siguiete);
164 PERR("HASTA ACA VOY BIEN");
166 max_scroll = (size_actual+size_anterior+size_siguiete) / (w-4) - (h-offset_alto-2);
167 if (max_scroll < 0) max_scroll = 0;
169 actual[0] = derwin(padre, h-offset_alto, w-2, 1, 1);
171 actual[1] = derwin(actual[0], h-offset_alto-2, w-4, 1, 1);
172 box(actual[0], 0, 0);
176 mostrar_info(padre, h, offset_alto, 0);
178 mvwaddnstr(actual[1], 0, 0, data, pos_actual);
179 wattron(actual[1], A_BOLD);
180 waddnstr(actual[1], data+pos_actual, ancho_registro);
181 wattroff(actual[1], A_BOLD);
182 waddnstr(actual[1], data+pos_actual+ancho_registro, size-(pos_actual+ancho_registro));
188 while ((c=getch()) != 13) {
192 dlg = newwin(4, 50, h/2-2, w/2-25);
194 indices_actual = preguntar_id(dlg, fp);
195 if (indices_actual < 0) indices_actual = 0;
196 if (indices_actual >= indices_total) indices_actual = indices_total-1;
202 if (data) free(data);
203 fp->leer_bloque_raw(fp, indices_actual, &bloque_actual, &bloque_anterior, &bloque_siguiente, &size_actual, &size_anterior, &size_siguiete);
204 bloque_actual = procesar(fp, bloque_actual, &size_actual, &pos_actual, &ancho_registro);
205 bloque_siguiente = procesar(fp, bloque_siguiente, &size_siguiete, &pos_actual, &ancho_registro);
206 bloque_anterior = procesar(fp, bloque_anterior, &size_anterior, &pos_actual, &ancho_registro);
207 pos_actual = size_anterior; /* Resalta desde el fin del bloque anterior */
208 ancho_registro = size_actual;
209 data = juntar_memoria(bloque_anterior, bloque_actual, bloque_siguiente, size_anterior, size_actual, size_siguiete);
211 case 'a': /* Scroll */
213 if (scroll < 0) scroll = 0;
215 case 'z': /* Scroll */
217 if (scroll > max_scroll) scroll = max_scroll;
220 if (indices_actual < indices_total) {
222 if (indices_actual >= indices_total) indices_actual = indices_total-1;
223 if (data) free(data);
224 fp->leer_bloque_raw(fp, indices_actual, &bloque_actual, &bloque_anterior, &bloque_siguiente, &size_actual, &size_anterior, &size_siguiete);
225 bloque_actual = procesar(fp, bloque_actual, &size_actual, &pos_actual, &ancho_registro);
226 bloque_siguiente = procesar(fp, bloque_siguiente, &size_siguiete, &pos_actual, &ancho_registro);
227 bloque_anterior = procesar(fp, bloque_anterior, &size_anterior, &pos_actual, &ancho_registro);
228 pos_actual = size_anterior; /* Resalta desde el fin del bloque anterior */
229 ancho_registro = size_actual;
230 data = juntar_memoria(bloque_anterior, bloque_actual, bloque_siguiente, size_anterior, size_actual, size_siguiete);
234 if (indices_actual != EMUFS_NOT_FOUND) {
236 if (indices_actual == EMUFS_NOT_FOUND) indices_actual = 0;
237 if (data) free(data);
238 fp->leer_bloque_raw(fp, indices_actual, &bloque_actual, &bloque_anterior, &bloque_siguiente, &size_actual, &size_anterior, &size_siguiete);
239 bloque_actual = procesar(fp, bloque_actual, &size_actual, &pos_actual, &ancho_registro);
240 bloque_siguiente = procesar(fp, bloque_siguiente, &size_siguiete, &pos_actual, &ancho_registro);
241 bloque_anterior = procesar(fp, bloque_anterior, &size_anterior, &pos_actual, &ancho_registro);
242 pos_actual = size_anterior; /* Resalta desde el fin del bloque anterior */
243 ancho_registro = size_actual;
244 data = juntar_memoria(bloque_anterior, bloque_actual, bloque_siguiente, size_anterior, size_actual, size_siguiete);
247 /* Borro las ventanas */
250 /* Imprimo los registros */
252 offset = scroll*actual_ancho;
253 pos = pos_actual - offset;
254 mvwaddnstr(actual[1], 0, 0, data+offset, pos);
256 wattron(actual[1], A_BOLD);
257 waddnstr(actual[1], data+offset, ancho_registro);
258 wattroff(actual[1], A_BOLD);
259 offset += ancho_registro;
260 waddnstr(actual[1], data+offset, size-offset);
266 if (data) free(data);
274 void ver_registros(WINDOW *padre, int w, int h, int cual)
276 /* Ventanas donde mostrar las cosas */
277 char *(*procesar)(EMUFS*, char*, EMUFS_REG_SIZE*, int*, int*);
278 WINDOW *actual[2], *dlg;
280 int scroll, actual_ancho;
281 int max_scroll, c, offset_alto;
282 /* Indices que hay validos en IDX */
283 EMUFS_REG_ID *indices, indices_total, indices_actual;
284 char *data; /* Registros a mostrar en pantalla */
285 char codigo[50]; /* Variable para guardar el codigo actual para mandar a modificar */
287 int pos_actual, ancho_registro, offset, pos, n, i;
290 fp = emufs_abrir("articulos");
291 else if (cual == 1) fp = emufs_abrir("facturas");
292 else if (cual == 2) fp = emufs_abrir("notas");
298 wattron(padre, COLOR_PAIR(COLOR_BLUE));
299 mvwaddstr(padre, 0, 0, "Tipo de archivo : ");
300 wattroff(padre, COLOR_PAIR(COLOR_BLUE));
304 waddstr(padre, "Registro variable con bloque parametrizado.");
305 procesar = procesar_registro_tipo1;
308 waddstr(padre, "Registro variable sin bloques.");
309 procesar = procesar_registro_tipo2;
313 procesar = procesar_registro_tipo3;
314 waddstr(padre, "Registro fijo con bloque parametrizado.");
317 indices = emufs_idx_get(fp, &indices_total);
321 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
322 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
327 max_scroll = size / (w-4) - (h-offset_alto-2);
328 if (max_scroll < 0) max_scroll = 0;
330 actual[0] = derwin(padre, h-offset_alto, w-2, 1, 1);
332 actual[1] = derwin(actual[0], h-offset_alto-2, w-4, 1, 1);
333 box(actual[0], 0, 0);
337 mostrar_info(padre, h, offset_alto, 1);
340 mvwaddnstr(actual[1], 0, 0, data, pos_actual);
341 wattron(actual[1], A_BOLD);
342 waddnstr(actual[1], data+pos_actual, ancho_registro);
343 wattroff(actual[1], A_BOLD);
344 waddnstr(actual[1], data+pos_actual+ancho_registro, size-(pos_actual+ancho_registro));
351 while ((c=getch()) != 13) {
355 dlg = newwin(4, 50, h/2-2, w/2-25);
357 n = preguntar_id(dlg, fp);
358 /* Busco la posicion dentro del id */
359 for(i=0; i< indices_total; i++) {
360 if (indices[i] == n) {
361 n = -1; /* LO ENCONTRE! */
367 if (data) free(data);
368 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
369 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
379 if (indices_actual != EMUFS_NOT_FOUND)
380 /*fp->borrar_registro(fp, indices[indices_actual]); XXX*/
383 indices = emufs_idx_get(fp, &indices_total);
384 if (indices_actual >= indices_total) {
385 indices_actual = indices_total - 1;
388 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
389 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
393 if (cual == 2) break;
399 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
400 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
403 indices = emufs_idx_get(fp, &indices_total);
405 /* Tengo que re-pintar algunas cosas */
406 mostrar_info(padre, h, offset_alto, 1);
407 box(actual[0], 0, 0);
411 case 'm': /* Quiero editar !!! */
412 if (cual == 2) break;
413 sprintf(codigo, "%lu", indices[indices_actual]);
415 art_modificar(codigo);
417 fact_modificar(codigo);
418 /* Vuelvo a cargar el articulo actual */
421 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
422 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
424 /* Tengo que re-pintar algunas cosas */
425 mostrar_info(padre, h, offset_alto, 1);
426 box(actual[0], 0, 0);
429 case 'a': /* Scroll */
431 if (scroll < 0) scroll = 0;
433 case 'z': /* Scroll */
435 if (scroll > max_scroll) scroll = max_scroll;
438 if (indices_actual < indices_total) {
440 if (indices_actual >= indices_total) indices_actual = indices_total-1;
441 if (data) free(data);
442 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
443 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
447 if (indices_actual != EMUFS_NOT_FOUND) {
449 if (indices_actual == EMUFS_NOT_FOUND) indices_actual = 0;
450 if (data) free(data);
451 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
452 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
456 /* Borro las ventanas */
459 /* Imprimo los registros */
461 offset = scroll*actual_ancho;
462 pos = pos_actual - offset;
463 mvwaddnstr(actual[1], 0, 0, data+offset, pos);
465 wattron(actual[1], A_BOLD);
466 waddnstr(actual[1], data+offset, ancho_registro);
467 wattroff(actual[1], A_BOLD);
468 offset += ancho_registro;
469 waddnstr(actual[1], data+offset, size-offset);
475 if (indices) free(indices);
476 if (data) free(data);
484 int preguntar_id(WINDOW *win, EMUFS *fp)
487 t_Form *form = form_crear(win);
488 form_agregar_widget(form, INPUT, "ID a buscar", 8, "");
491 form_set_valor(form, "ID a buscar", "");
492 form_ejecutar(form, 1,1);
494 n = form_obtener_valor_int(form, "ID a buscar");
501 char *procesar_registro_tipo3(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho)
503 char *tmp, *salida, *tmp1, pos_actualizada, ant;
504 int cant_header, i=0, j, tam_data;
505 if (ptr == NULL) return NULL;
507 PERR("Empieza el baile");
509 /* Calculo cuantos headers de registros va a haber en el archivo */
510 cant_header = emu->tam_bloque / (emu->tam_reg+sizeof(EMUFS_REG_ID));
511 if (cant_header == 0) cant_header++; /* Si tam_reg > tam_bloque, voy a tener solo 1 header */
512 tam_data = emu->tam_reg;
513 if (tam_data > (*size - sizeof(EMUFS_REG_ID)))
514 tam_data = *size - sizeof(EMUFS_REG_ID);
516 (*size) = (*size) - cant_header*sizeof(EMUFS_REG_ID)+cant_header*10+1;
517 tmp1 = salida = (char *)malloc(*size);
518 memset(salida, '.', *size);
519 if (salida == NULL) {
520 PERR("Error de malloc en salida");
526 while (i<cant_header) {
527 /* Verifico la pos_actual para el resaltado, asi queda coherente
528 * en el cambio de formato
530 if (((tmp - ptr) == *pos_actual) && (!pos_actualizada)) {
531 (*pos_actual) = tmp1-salida;
534 /* Pongo el ID del registro */
535 sprintf(tmp1, "(%08lu)", *((EMUFS_REG_ID *)tmp));
537 tmp += sizeof(EMUFS_REG_ID);
539 if (pos_actualizada == 1) {
544 while (j < (tam_data)) {
552 copy_char(tmp1, tmp);
557 if (pos_actualizada == 1)
561 if (pos_actualizada == 1)
568 salida[*size-1] = '\0';
573 char *procesar_registro_tipo1(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho)
575 char *tmp, *salida, *tmp1, pos_actualizada, ant;
576 EMUFS_REG_SIZE offset, curr_size, size_acumulado, old_size;
577 int cant_header, i=0, j, tam_data;
578 if (ptr == NULL) return NULL;
580 PERR("Empieza el baile");
584 /* Me salto el ID, que no me interesa saber su valor */
585 offset += sizeof(EMUFS_REG_ID);
586 /* Copio el tamaño del registro de la cabecera. */
587 memcpy(&curr_size, ptr + offset, sizeof(EMUFS_REG_SIZE));
588 offset += sizeof(EMUFS_REG_SIZE);
590 /* Desplazo el offset */
592 fprintf(stderr, "Tam = %lu\n", curr_size);
594 if (curr_size == 0) {
595 /* Si el tamaño de registro es 0, quiere decir que llegue a la
596 * parte que esta vacia */
602 } while (offset+sizeof(EMUFS_REG_SIZE)+sizeof(EMUFS_REG_ID) < (*size));
604 if (cant_header == 0) {
605 PERR("NO TENGO ITEMS");
606 memset(ptr, '.', *size);
612 /* El tamaño del nuevo array lo calculo asi :
616 (*size) = (*size) - sizeof(EMUFS_REG_ID)*cant_header - sizeof(EMUFS_REG_SIZE)*cant_header + cant_header*20+1;
617 tmp1 = salida = (char *)malloc(*size);
618 if (salida == NULL) {
619 PERR("Error de malloc en salida");
622 memset(salida, '.', *size);
628 while (i<cant_header) {
629 /* Verifico la pos_actual para el resaltado, asi queda coherente
630 * en el cambio de formato
632 if (((tmp - ptr) == *pos_actual) && (!pos_actualizada)) {
633 (*pos_actual) = tmp1-salida;
636 /* Pongo el ID del registro */
637 sprintf(tmp1, "(%08lu)", *((EMUFS_REG_ID *)tmp));
639 tmp += sizeof(EMUFS_REG_ID);
640 /* Cantidad de espacio que ocupa la data */
641 sprintf(tmp1, "{%08lu}", *((EMUFS_REG_SIZE *)tmp));
642 tam_data = *((EMUFS_REG_SIZE *)tmp);
643 if ((size_acumulado+tam_data) > old_size) {
644 tam_data = old_size - size_acumulado;
647 tmp += sizeof(EMUFS_REG_SIZE);
649 if (pos_actualizada == 1) {
653 PERR("Voy por la data");
655 while (j < tam_data) {
663 copy_char(tmp1, tmp);
668 if (pos_actualizada == 1)
672 size_acumulado += tam_data;
673 if (pos_actualizada == 1)
680 salida[*size-1] = '\0';
685 char *procesar_registro_tipo2(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho)
690 EMUFS_REG_SIZE tam_data;
691 if (ptr == NULL) return NULL;
693 (*size) = *size - sizeof(EMUFS_REG_SIZE) - sizeof(EMUFS_REG_ID) + 21;
694 (*ancho) = *size-101;
695 salida = (char *)malloc(*size);
696 memset(salida, '.', *size);
698 PERR("Voy por el espacio antes");
700 fprintf(stderr, "Pos Inicial %d\n", *pos_actual);
704 for(i=0; i < *pos_actual; i++) {
710 PERR("Voy por el header");
712 sprintf(tmp, "(%08lu)", *((EMUFS_REG_ID *)in));
714 in += sizeof(EMUFS_REG_ID);
715 /* Tamaño de registro */
716 sprintf(tmp, "{%08lu}", *((EMUFS_REG_SIZE *)in));
717 tam_data = *((EMUFS_REG_SIZE *)in);
719 in += sizeof(EMUFS_REG_SIZE);
720 PERR("Voy por la data");
722 while (i < tam_data) {
728 PERR("Voy por el espacio despues");
729 for(i=0; i < 100-*pos_actual; i++) {
737 salida[*size-1] = '\0';