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");
113 stats = fp->leer_estadisticas(fp);
115 wattron(padre, COLOR_PAIR(COLOR_BLUE));
116 mvwaddstr(padre, 0, 0, "Tipo de archivo : ");
117 wattroff(padre, COLOR_PAIR(COLOR_BLUE));
120 waddstr(padre, "Registro variable con bloque parametrizado.");
121 procesar = procesar_registro_tipo1;
124 waddstr(padre, "Registro variable sin bloques.");
125 actual[0] = msg_box(padre, w, h, "El tipo de archivo no contiene bloques.");
127 msg_box_free(padre, actual[0]);
131 procesar = procesar_registro_tipo3;
132 waddstr(padre, "Registro fijo con bloque parametrizado.");
137 indices_total = stats.cant_bloques;
139 fp->leer_bloque_raw(fp, indices_actual, &bloque_actual, &bloque_anterior, &bloque_siguiente, &size_actual, &size_anterior, &size_siguiete);
141 bloque_actual = procesar(fp, bloque_actual, &size_actual, &pos_actual, &ancho_registro);
143 bloque_siguiente = procesar(fp, bloque_siguiente, &size_siguiete, &pos_actual, &ancho_registro);
145 bloque_anterior = procesar(fp, bloque_anterior, &size_anterior, &pos_actual, &ancho_registro);
146 if (!bloque_siguiente) {
147 bloque_siguiente = (char *)malloc(size_siguiete);
148 memset(bloque_siguiente, 0, size_siguiete);
150 if (!bloque_anterior) {
151 bloque_anterior = (char *)malloc(size_anterior);
152 memset(bloque_anterior, 0, size_anterior);
154 pos_actual = size_anterior; /* Resalta desde el fin del bloque anterior */
155 ancho_registro = size_actual;
156 data = juntar_memoria(bloque_anterior, bloque_actual, bloque_siguiente, size_anterior, size_actual, size_siguiete);
158 PERR("HASTA ACA VOY BIEN");
160 max_scroll = (size_actual+size_anterior+size_siguiete) / (w-4) - (h-offset_alto-2);
161 if (max_scroll < 0) max_scroll = 0;
163 actual[0] = derwin(padre, h-offset_alto, w-2, 1, 1);
165 actual[1] = derwin(actual[0], h-offset_alto-2, w-4, 1, 1);
166 box(actual[0], 0, 0);
170 mostrar_info(padre, h, offset_alto, 0);
172 mvwaddnstr(actual[1], 0, 0, data, pos_actual);
173 wattron(actual[1], A_BOLD);
174 waddnstr(actual[1], data+pos_actual, ancho_registro);
175 wattroff(actual[1], A_BOLD);
176 waddnstr(actual[1], data+pos_actual+ancho_registro, size-(pos_actual+ancho_registro));
182 while ((c=getch()) != 13) {
186 dlg = newwin(4, 50, h/2-2, w/2-25);
188 indices_actual = preguntar_id(dlg, fp);
189 if (indices_actual < 0) indices_actual = 0;
190 if (indices_actual >= indices_total) indices_actual = indices_total-1;
196 if (data) free(data);
197 fp->leer_bloque_raw(fp, indices_actual, &bloque_actual, &bloque_anterior, &bloque_siguiente, &size_actual, &size_anterior, &size_siguiete);
198 bloque_actual = procesar(fp, bloque_actual, &size_actual, &pos_actual, &ancho_registro);
199 bloque_siguiente = procesar(fp, bloque_siguiente, &size_siguiete, &pos_actual, &ancho_registro);
200 bloque_anterior = procesar(fp, bloque_anterior, &size_anterior, &pos_actual, &ancho_registro);
201 pos_actual = size_anterior; /* Resalta desde el fin del bloque anterior */
202 ancho_registro = size_actual;
203 data = juntar_memoria(bloque_anterior, bloque_actual, bloque_siguiente, size_anterior, size_actual, size_siguiete);
205 case 'a': /* Scroll */
207 if (scroll < 0) scroll = 0;
209 case 'z': /* Scroll */
211 if (scroll > max_scroll) scroll = max_scroll;
214 if (indices_actual < indices_total) {
216 if (indices_actual >= indices_total) indices_actual = indices_total-1;
217 if (data) free(data);
218 fp->leer_bloque_raw(fp, indices_actual, &bloque_actual, &bloque_anterior, &bloque_siguiente, &size_actual, &size_anterior, &size_siguiete);
219 bloque_actual = procesar(fp, bloque_actual, &size_actual, &pos_actual, &ancho_registro);
220 bloque_siguiente = procesar(fp, bloque_siguiente, &size_siguiete, &pos_actual, &ancho_registro);
221 bloque_anterior = procesar(fp, bloque_anterior, &size_anterior, &pos_actual, &ancho_registro);
222 pos_actual = size_anterior; /* Resalta desde el fin del bloque anterior */
223 ancho_registro = size_actual;
224 data = juntar_memoria(bloque_anterior, bloque_actual, bloque_siguiente, size_anterior, size_actual, size_siguiete);
228 if (indices_actual != EMUFS_NOT_FOUND) {
230 if (indices_actual == EMUFS_NOT_FOUND) indices_actual = 0;
231 if (data) free(data);
232 fp->leer_bloque_raw(fp, indices_actual, &bloque_actual, &bloque_anterior, &bloque_siguiente, &size_actual, &size_anterior, &size_siguiete);
233 bloque_actual = procesar(fp, bloque_actual, &size_actual, &pos_actual, &ancho_registro);
234 bloque_siguiente = procesar(fp, bloque_siguiente, &size_siguiete, &pos_actual, &ancho_registro);
235 bloque_anterior = procesar(fp, bloque_anterior, &size_anterior, &pos_actual, &ancho_registro);
236 pos_actual = size_anterior; /* Resalta desde el fin del bloque anterior */
237 ancho_registro = size_actual;
238 data = juntar_memoria(bloque_anterior, bloque_actual, bloque_siguiente, size_anterior, size_actual, size_siguiete);
241 /* Borro las ventanas */
244 /* Imprimo los registros */
246 offset = scroll*actual_ancho; /* Cantidad de caracteres que tengo que saltar */
247 pos = pos_actual - offset; /* Cantidad de caracteres que hay antes de mi a imprimir */
248 mvwaddnstr(actual[1], 0, 0, data+offset, pos);
253 wattron(actual[1], A_BOLD);
254 waddnstr(actual[1], data+offset, ancho_registro+((pos<0)?pos:0));
255 wattroff(actual[1], A_BOLD);
256 offset += ancho_registro+((pos<0)?pos:0);
257 waddnstr(actual[1], data+offset, size-offset);
263 if (data) free(data);
271 void ver_registros(WINDOW *padre, int w, int h, int cual)
273 /* Ventanas donde mostrar las cosas */
274 char *(*procesar)(EMUFS*, char*, EMUFS_REG_SIZE*, int*, int*);
275 WINDOW *actual[2], *dlg;
277 int scroll, actual_ancho;
278 int max_scroll, c, offset_alto;
279 /* Indices que hay validos en IDX */
280 EMUFS_REG_ID *indices, indices_total, indices_actual;
281 char *data; /* Registros a mostrar en pantalla */
282 char codigo[50]; /* Variable para guardar el codigo actual para mandar a modificar */
284 int pos_actual, ancho_registro, offset, pos;
287 fp = emufs_abrir("articulos");
289 fp = emufs_abrir("facturas");
291 wattron(padre, COLOR_PAIR(COLOR_BLUE));
292 mvwaddstr(padre, 0, 0, "Tipo de archivo : ");
293 wattroff(padre, COLOR_PAIR(COLOR_BLUE));
296 waddstr(padre, "Registro variable con bloque parametrizado.");
297 procesar = procesar_registro_tipo1;
300 waddstr(padre, "Registro variable con sin bloques.");
301 procesar = procesar_registro_tipo2;
304 procesar = procesar_registro_tipo3;
305 waddstr(padre, "Registro fijo con bloque parametrizado.");
308 indices = emufs_idx_get(fp, &indices_total);
312 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
313 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
318 max_scroll = size / (w-4) - (h-offset_alto-2);
319 if (max_scroll < 0) max_scroll = 0;
321 actual[0] = derwin(padre, h-offset_alto, w-2, 1, 1);
323 actual[1] = derwin(actual[0], h-offset_alto-2, w-4, 1, 1);
324 box(actual[0], 0, 0);
328 mostrar_info(padre, h, offset_alto, 1);
331 mvwaddnstr(actual[1], 0, 0, data, pos_actual);
332 wattron(actual[1], A_BOLD);
333 waddnstr(actual[1], data+pos_actual, ancho_registro);
334 wattroff(actual[1], A_BOLD);
335 waddnstr(actual[1], data+pos_actual+ancho_registro, size-(pos_actual+ancho_registro));
342 while ((c=getch()) != 13) {
346 dlg = newwin(4, 50, h/2-2, w/2-25);
348 indices_actual = preguntar_id(dlg, fp);
349 if (indices_actual < 0) indices_actual = 0;
350 if (indices_actual >= indices_total) indices_actual = indices_total - 1;
359 if (indices_actual != EMUFS_NOT_FOUND)
360 fp->borrar_registro(fp, indices[indices_actual]);
363 indices = emufs_idx_get(fp, &indices_total);
364 if (indices_actual >= indices_total) {
365 indices_actual = indices_total - 1;
368 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
369 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
378 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
379 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
382 indices = emufs_idx_get(fp, &indices_total);
384 /* Tengo que re-pintar algunas cosas */
385 mostrar_info(padre, h, offset_alto, 1);
386 box(actual[0], 0, 0);
390 case 'm': /* Quiero editar !!! */
391 sprintf(codigo, "%lu", indices[indices_actual]);
393 art_modificar(codigo);
395 fact_modificar(codigo);
396 /* Vuelvo a cargar el articulo actual */
399 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
400 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
402 /* Tengo que re-pintar algunas cosas */
403 mostrar_info(padre, h, offset_alto, 1);
404 box(actual[0], 0, 0);
407 case 'a': /* Scroll */
409 if (scroll < 0) scroll = 0;
411 case 'z': /* Scroll */
413 if (scroll > max_scroll) scroll = max_scroll;
416 if (indices_actual < indices_total) {
418 if (indices_actual >= indices_total) indices_actual = indices_total-1;
419 if (data) free(data);
420 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
421 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
425 if (indices_actual != EMUFS_NOT_FOUND) {
427 if (indices_actual == EMUFS_NOT_FOUND) indices_actual = 0;
428 if (data) free(data);
429 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
430 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
434 /* Borro las ventanas */
437 /* Imprimo los registros */
439 offset = scroll*actual_ancho;
440 pos = pos_actual - offset;
441 mvwaddnstr(actual[1], 0, 0, data+offset, pos);
443 wattron(actual[1], A_BOLD);
444 waddnstr(actual[1], data+offset, ancho_registro);
445 wattroff(actual[1], A_BOLD);
446 offset += ancho_registro;
447 waddnstr(actual[1], data+offset, size-offset);
453 if (indices) free(indices);
454 if (data) free(data);
462 int preguntar_id(WINDOW *win, EMUFS *fp)
465 t_Form *form = form_crear(win);
466 form_agregar_widget(form, INPUT, "ID a buscar", 8, "");
469 form_set_valor(form, "ID a buscar", "");
470 form_ejecutar(form, 1,1);
472 n = form_obtener_valor_int(form, "ID a buscar");
479 char *procesar_registro_tipo3(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho)
481 char *tmp, *salida, *tmp1, pos_actualizada, ant;
482 int cant_header, i=0, j, tam_data;
483 if (ptr == NULL) return NULL;
485 PERR("Empieza el baile");
487 /* Calculo cuantos headers de registros va a haber en el archivo */
488 cant_header = emu->tam_bloque / (emu->tam_reg+sizeof(EMUFS_REG_ID));
489 if (cant_header == 0) cant_header++; /* Si tam_reg > tam_bloque, voy a tener solo 1 header */
490 tam_data = emu->tam_reg;
491 if (tam_data > (*size - sizeof(EMUFS_REG_ID)))
492 tam_data = *size - sizeof(EMUFS_REG_ID);
494 (*size) = (*size) - cant_header*sizeof(EMUFS_REG_ID)+cant_header*10+1;
495 tmp1 = salida = (char *)malloc(*size);
496 memset(salida, '.', *size);
497 if (salida == NULL) {
498 PERR("Error de malloc en salida");
504 while (i<cant_header) {
505 /* Verifico la pos_actual para el resaltado, asi queda coherente
506 * en el cambio de formato
508 if (((tmp - ptr) == *pos_actual) && (!pos_actualizada)) {
509 (*pos_actual) = tmp1-salida;
512 /* Pongo el ID del registro */
513 sprintf(tmp1, "(%08lu)", *((EMUFS_REG_ID *)tmp));
515 tmp += sizeof(EMUFS_REG_ID);
517 if (pos_actualizada == 1) {
521 while (j < (tam_data)) {
529 copy_char(tmp1, tmp);
534 if (pos_actualizada == 1)
538 if (pos_actualizada == 1)
545 salida[*size-1] = '\0';
550 char *procesar_registro_tipo1(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho)
552 char *tmp, *salida, *tmp1, pos_actualizada, ant;
553 EMUFS_REG_SIZE offset, curr_size, size_acumulado, old_size;
554 int cant_header, i=0, j, tam_data;
555 if (ptr == NULL) return NULL;
557 PERR("Empieza el baile");
561 /* Me salto el ID, que no me interesa saber su valor */
562 offset += sizeof(EMUFS_REG_ID);
563 /* Copio el tamaño del registro de la cabecera. */
564 memcpy(&curr_size, ptr + offset, sizeof(EMUFS_REG_SIZE));
565 offset += sizeof(EMUFS_REG_SIZE);
567 /* Desplazo el offset */
569 fprintf(stderr, "Tam = %lu\n", curr_size);
571 if (curr_size == 0) {
572 /* Si el tamaño de registro es 0, quiere decir que llegue a la
573 * parte que esta vacia */
579 } while (offset+sizeof(EMUFS_REG_SIZE)+sizeof(EMUFS_REG_ID) < (*size));
581 if (cant_header == 0) {
582 PERR("NO TENGO ITEMS");
583 memset(ptr, '.', *size);
589 /* El tamaño del nuevo array lo calculo asi :
593 (*size) = (*size) - sizeof(EMUFS_REG_ID)*cant_header - sizeof(EMUFS_REG_SIZE)*cant_header + cant_header*20+1;
594 tmp1 = salida = (char *)malloc(*size);
595 if (salida == NULL) {
596 PERR("Error de malloc en salida");
599 memset(salida, '.', *size);
605 while (i<cant_header) {
606 /* Verifico la pos_actual para el resaltado, asi queda coherente
607 * en el cambio de formato
609 if (((tmp - ptr) == *pos_actual) && (!pos_actualizada)) {
610 (*pos_actual) = tmp1-salida;
613 /* Pongo el ID del registro */
614 sprintf(tmp1, "(%08lu)", *((EMUFS_REG_ID *)tmp));
616 tmp += sizeof(EMUFS_REG_ID);
617 /* Cantidad de espacio que ocupa la data */
618 sprintf(tmp1, "{%08lu}", *((EMUFS_REG_SIZE *)tmp));
619 tam_data = *((EMUFS_REG_SIZE *)tmp);
620 if ((size_acumulado+tam_data) > old_size) {
621 tam_data = old_size - size_acumulado;
624 tmp += sizeof(EMUFS_REG_SIZE);
626 if (pos_actualizada == 1) {
630 PERR("Voy por la data");
632 while (j < tam_data) {
640 copy_char(tmp1, tmp);
645 if (pos_actualizada == 1)
649 size_acumulado += tam_data;
650 if (pos_actualizada == 1)
657 salida[*size-1] = '\0';
662 char *procesar_registro_tipo2(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho)
667 EMUFS_REG_SIZE tam_data;
668 if (ptr == NULL) return NULL;
670 (*size) = *size - sizeof(EMUFS_REG_SIZE) - sizeof(EMUFS_REG_ID) + 21;
671 (*ancho) = *size-101;
672 salida = (char *)malloc(*size);
673 memset(salida, '.', *size);
675 PERR("Voy por el espacio antes");
676 fprintf(stderr, "Pos Inicial %d\n", *pos_actual);
677 for(i=0; i < *pos_actual; i++) {
678 /* Los datos que tengo por ahora los pongo enmascarados! */
679 copy_char(&salida[i], in);
682 tmp = salida + *pos_actual;
683 in = ptr + *pos_actual;
685 PERR("Voy por el header");
687 sprintf(tmp, "(%08lu)", *((EMUFS_REG_ID *)in));
689 in += sizeof(EMUFS_REG_ID);
690 /* Tamaño de registro */
691 sprintf(tmp, "{%08lu}", *((EMUFS_REG_SIZE *)in));
692 tam_data = *((EMUFS_REG_SIZE *)in);
694 in += sizeof(EMUFS_REG_SIZE);
695 PERR("Voy por la data");
697 while (i < tam_data) {
703 PERR("Voy por el espacio despues");
707 salida[*size-1] = '\0';