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));
124 waddstr(padre, "Registro variable con bloque parametrizado.");
125 procesar = procesar_registro_tipo1;
128 waddstr(padre, "Registro variable sin bloques.");
129 actual[0] = msg_box(padre, w, h, "El tipo de archivo no contiene bloques.");
131 msg_box_free(padre, actual[0]);
135 procesar = procesar_registro_tipo3;
136 waddstr(padre, "Registro fijo con bloque parametrizado.");
141 indices_total = stats.cant_bloques;
143 fp->leer_bloque_raw(fp, indices_actual, &bloque_actual, &bloque_anterior, &bloque_siguiente, &size_actual, &size_anterior, &size_siguiete);
145 bloque_actual = procesar(fp, bloque_actual, &size_actual, &pos_actual, &ancho_registro);
147 bloque_siguiente = procesar(fp, bloque_siguiente, &size_siguiete, &pos_actual, &ancho_registro);
149 bloque_anterior = procesar(fp, bloque_anterior, &size_anterior, &pos_actual, &ancho_registro);
150 if (!bloque_siguiente) {
151 bloque_siguiente = (char *)malloc(size_siguiete);
152 memset(bloque_siguiente, 0, size_siguiete);
154 if (!bloque_anterior) {
155 bloque_anterior = (char *)malloc(size_anterior);
156 memset(bloque_anterior, 0, size_anterior);
158 pos_actual = size_anterior; /* Resalta desde el fin del bloque anterior */
159 ancho_registro = size_actual;
160 data = juntar_memoria(bloque_anterior, bloque_actual, bloque_siguiente, size_anterior, size_actual, size_siguiete);
162 PERR("HASTA ACA VOY BIEN");
164 max_scroll = (size_actual+size_anterior+size_siguiete) / (w-4) - (h-offset_alto-2);
165 if (max_scroll < 0) max_scroll = 0;
167 actual[0] = derwin(padre, h-offset_alto, w-2, 1, 1);
169 actual[1] = derwin(actual[0], h-offset_alto-2, w-4, 1, 1);
170 box(actual[0], 0, 0);
174 mostrar_info(padre, h, offset_alto, 0);
176 mvwaddnstr(actual[1], 0, 0, data, pos_actual);
177 wattron(actual[1], A_BOLD);
178 waddnstr(actual[1], data+pos_actual, ancho_registro);
179 wattroff(actual[1], A_BOLD);
180 waddnstr(actual[1], data+pos_actual+ancho_registro, size-(pos_actual+ancho_registro));
186 while ((c=getch()) != 13) {
190 dlg = newwin(4, 50, h/2-2, w/2-25);
192 indices_actual = preguntar_id(dlg, fp);
193 if (indices_actual < 0) indices_actual = 0;
194 if (indices_actual >= indices_total) indices_actual = indices_total-1;
200 if (data) free(data);
201 fp->leer_bloque_raw(fp, indices_actual, &bloque_actual, &bloque_anterior, &bloque_siguiente, &size_actual, &size_anterior, &size_siguiete);
202 bloque_actual = procesar(fp, bloque_actual, &size_actual, &pos_actual, &ancho_registro);
203 bloque_siguiente = procesar(fp, bloque_siguiente, &size_siguiete, &pos_actual, &ancho_registro);
204 bloque_anterior = procesar(fp, bloque_anterior, &size_anterior, &pos_actual, &ancho_registro);
205 pos_actual = size_anterior; /* Resalta desde el fin del bloque anterior */
206 ancho_registro = size_actual;
207 data = juntar_memoria(bloque_anterior, bloque_actual, bloque_siguiente, size_anterior, size_actual, size_siguiete);
209 case 'a': /* Scroll */
211 if (scroll < 0) scroll = 0;
213 case 'z': /* Scroll */
215 if (scroll > max_scroll) scroll = max_scroll;
218 if (indices_actual < indices_total) {
220 if (indices_actual >= indices_total) indices_actual = indices_total-1;
221 if (data) free(data);
222 fp->leer_bloque_raw(fp, indices_actual, &bloque_actual, &bloque_anterior, &bloque_siguiente, &size_actual, &size_anterior, &size_siguiete);
223 bloque_actual = procesar(fp, bloque_actual, &size_actual, &pos_actual, &ancho_registro);
224 bloque_siguiente = procesar(fp, bloque_siguiente, &size_siguiete, &pos_actual, &ancho_registro);
225 bloque_anterior = procesar(fp, bloque_anterior, &size_anterior, &pos_actual, &ancho_registro);
226 pos_actual = size_anterior; /* Resalta desde el fin del bloque anterior */
227 ancho_registro = size_actual;
228 data = juntar_memoria(bloque_anterior, bloque_actual, bloque_siguiente, size_anterior, size_actual, size_siguiete);
232 if (indices_actual != EMUFS_NOT_FOUND) {
234 if (indices_actual == EMUFS_NOT_FOUND) indices_actual = 0;
235 if (data) free(data);
236 fp->leer_bloque_raw(fp, indices_actual, &bloque_actual, &bloque_anterior, &bloque_siguiente, &size_actual, &size_anterior, &size_siguiete);
237 bloque_actual = procesar(fp, bloque_actual, &size_actual, &pos_actual, &ancho_registro);
238 bloque_siguiente = procesar(fp, bloque_siguiente, &size_siguiete, &pos_actual, &ancho_registro);
239 bloque_anterior = procesar(fp, bloque_anterior, &size_anterior, &pos_actual, &ancho_registro);
240 pos_actual = size_anterior; /* Resalta desde el fin del bloque anterior */
241 ancho_registro = size_actual;
242 data = juntar_memoria(bloque_anterior, bloque_actual, bloque_siguiente, size_anterior, size_actual, size_siguiete);
245 /* Borro las ventanas */
248 /* Imprimo los registros */
250 offset = scroll*actual_ancho; /* Cantidad de caracteres que tengo que saltar */
251 pos = pos_actual - offset; /* Cantidad de caracteres que hay antes de mi a imprimir */
252 mvwaddnstr(actual[1], 0, 0, data+offset, pos);
257 wattron(actual[1], A_BOLD);
258 waddnstr(actual[1], data+offset, ancho_registro+((pos<0)?pos:0));
259 wattroff(actual[1], A_BOLD);
260 offset += ancho_registro+((pos<0)?pos:0);
261 waddnstr(actual[1], data+offset, size-offset);
267 if (data) free(data);
275 void ver_registros(WINDOW *padre, int w, int h, int cual)
277 /* Ventanas donde mostrar las cosas */
278 char *(*procesar)(EMUFS*, char*, EMUFS_REG_SIZE*, int*, int*);
279 WINDOW *actual[2], *dlg;
281 int scroll, actual_ancho;
282 int max_scroll, c, offset_alto;
283 /* Indices que hay validos en IDX */
284 EMUFS_REG_ID *indices, indices_total, indices_actual;
285 char *data; /* Registros a mostrar en pantalla */
286 char codigo[50]; /* Variable para guardar el codigo actual para mandar a modificar */
288 int pos_actual, ancho_registro, offset, pos, n, i;
291 fp = emufs_abrir("articulos");
292 else if (cual == 1) fp = emufs_abrir("facturas");
293 else if (cual == 2) fp = emufs_abrir("notas");
299 wattron(padre, COLOR_PAIR(COLOR_BLUE));
300 mvwaddstr(padre, 0, 0, "Tipo de archivo : ");
301 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;
312 procesar = procesar_registro_tipo3;
313 waddstr(padre, "Registro fijo con bloque parametrizado.");
316 indices = emufs_idx_get(fp, &indices_total);
320 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
321 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
326 max_scroll = size / (w-4) - (h-offset_alto-2);
327 if (max_scroll < 0) max_scroll = 0;
329 actual[0] = derwin(padre, h-offset_alto, w-2, 1, 1);
331 actual[1] = derwin(actual[0], h-offset_alto-2, w-4, 1, 1);
332 box(actual[0], 0, 0);
336 mostrar_info(padre, h, offset_alto, 1);
339 mvwaddnstr(actual[1], 0, 0, data, pos_actual);
340 wattron(actual[1], A_BOLD);
341 waddnstr(actual[1], data+pos_actual, ancho_registro);
342 wattroff(actual[1], A_BOLD);
343 waddnstr(actual[1], data+pos_actual+ancho_registro, size-(pos_actual+ancho_registro));
350 while ((c=getch()) != 13) {
354 dlg = newwin(4, 50, h/2-2, w/2-25);
356 n = preguntar_id(dlg, fp);
357 /* Busco la posicion dentro del id */
358 for(i=0; i< indices_total; i++) {
359 if (indices[i] == n) {
360 n = -1; /* LO ENCONTRE! */
366 if (data) free(data);
367 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
368 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
378 if (indices_actual != EMUFS_NOT_FOUND)
379 fp->borrar_registro(fp, indices[indices_actual]);
382 indices = emufs_idx_get(fp, &indices_total);
383 if (indices_actual >= indices_total) {
384 indices_actual = indices_total - 1;
387 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
388 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
397 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
398 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
401 indices = emufs_idx_get(fp, &indices_total);
403 /* Tengo que re-pintar algunas cosas */
404 mostrar_info(padre, h, offset_alto, 1);
405 box(actual[0], 0, 0);
409 case 'm': /* Quiero editar !!! */
410 sprintf(codigo, "%lu", indices[indices_actual]);
412 art_modificar(codigo);
414 fact_modificar(codigo);
415 /* Vuelvo a cargar el articulo actual */
418 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
419 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
421 /* Tengo que re-pintar algunas cosas */
422 mostrar_info(padre, h, offset_alto, 1);
423 box(actual[0], 0, 0);
426 case 'a': /* Scroll */
428 if (scroll < 0) scroll = 0;
430 case 'z': /* Scroll */
432 if (scroll > max_scroll) scroll = max_scroll;
435 if (indices_actual < indices_total) {
437 if (indices_actual >= indices_total) indices_actual = indices_total-1;
438 if (data) free(data);
439 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
440 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
444 if (indices_actual != EMUFS_NOT_FOUND) {
446 if (indices_actual == EMUFS_NOT_FOUND) indices_actual = 0;
447 if (data) free(data);
448 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
449 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
453 /* Borro las ventanas */
456 /* Imprimo los registros */
458 offset = scroll*actual_ancho;
459 pos = pos_actual - offset;
460 mvwaddnstr(actual[1], 0, 0, data+offset, pos);
462 wattron(actual[1], A_BOLD);
463 waddnstr(actual[1], data+offset, ancho_registro);
464 wattroff(actual[1], A_BOLD);
465 offset += ancho_registro;
466 waddnstr(actual[1], data+offset, size-offset);
472 if (indices) free(indices);
473 if (data) free(data);
481 int preguntar_id(WINDOW *win, EMUFS *fp)
484 t_Form *form = form_crear(win);
485 form_agregar_widget(form, INPUT, "ID a buscar", 8, "");
488 form_set_valor(form, "ID a buscar", "");
489 form_ejecutar(form, 1,1);
491 n = form_obtener_valor_int(form, "ID a buscar");
498 char *procesar_registro_tipo3(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho)
500 char *tmp, *salida, *tmp1, pos_actualizada, ant;
501 int cant_header, i=0, j, tam_data;
502 if (ptr == NULL) return NULL;
504 PERR("Empieza el baile");
506 /* Calculo cuantos headers de registros va a haber en el archivo */
507 cant_header = emu->tam_bloque / (emu->tam_reg+sizeof(EMUFS_REG_ID));
508 if (cant_header == 0) cant_header++; /* Si tam_reg > tam_bloque, voy a tener solo 1 header */
509 tam_data = emu->tam_reg;
510 if (tam_data > (*size - sizeof(EMUFS_REG_ID)))
511 tam_data = *size - sizeof(EMUFS_REG_ID);
513 (*size) = (*size) - cant_header*sizeof(EMUFS_REG_ID)+cant_header*10+1;
514 tmp1 = salida = (char *)malloc(*size);
515 memset(salida, '.', *size);
516 if (salida == NULL) {
517 PERR("Error de malloc en salida");
523 while (i<cant_header) {
524 /* Verifico la pos_actual para el resaltado, asi queda coherente
525 * en el cambio de formato
527 if (((tmp - ptr) == *pos_actual) && (!pos_actualizada)) {
528 (*pos_actual) = tmp1-salida;
531 /* Pongo el ID del registro */
532 sprintf(tmp1, "(%08lu)", *((EMUFS_REG_ID *)tmp));
534 tmp += sizeof(EMUFS_REG_ID);
536 if (pos_actualizada == 1) {
541 while (j < (tam_data)) {
549 copy_char(tmp1, tmp);
554 if (pos_actualizada == 1)
558 if (pos_actualizada == 1)
565 salida[*size-1] = '\0';
570 char *procesar_registro_tipo1(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho)
572 char *tmp, *salida, *tmp1, pos_actualizada, ant;
573 EMUFS_REG_SIZE offset, curr_size, size_acumulado, old_size;
574 int cant_header, i=0, j, tam_data;
575 if (ptr == NULL) return NULL;
577 PERR("Empieza el baile");
581 /* Me salto el ID, que no me interesa saber su valor */
582 offset += sizeof(EMUFS_REG_ID);
583 /* Copio el tamaño del registro de la cabecera. */
584 memcpy(&curr_size, ptr + offset, sizeof(EMUFS_REG_SIZE));
585 offset += sizeof(EMUFS_REG_SIZE);
587 /* Desplazo el offset */
589 fprintf(stderr, "Tam = %lu\n", curr_size);
591 if (curr_size == 0) {
592 /* Si el tamaño de registro es 0, quiere decir que llegue a la
593 * parte que esta vacia */
599 } while (offset+sizeof(EMUFS_REG_SIZE)+sizeof(EMUFS_REG_ID) < (*size));
601 if (cant_header == 0) {
602 PERR("NO TENGO ITEMS");
603 memset(ptr, '.', *size);
609 /* El tamaño del nuevo array lo calculo asi :
613 (*size) = (*size) - sizeof(EMUFS_REG_ID)*cant_header - sizeof(EMUFS_REG_SIZE)*cant_header + cant_header*20+1;
614 tmp1 = salida = (char *)malloc(*size);
615 if (salida == NULL) {
616 PERR("Error de malloc en salida");
619 memset(salida, '.', *size);
625 while (i<cant_header) {
626 /* Verifico la pos_actual para el resaltado, asi queda coherente
627 * en el cambio de formato
629 if (((tmp - ptr) == *pos_actual) && (!pos_actualizada)) {
630 (*pos_actual) = tmp1-salida;
633 /* Pongo el ID del registro */
634 sprintf(tmp1, "(%08lu)", *((EMUFS_REG_ID *)tmp));
636 tmp += sizeof(EMUFS_REG_ID);
637 /* Cantidad de espacio que ocupa la data */
638 sprintf(tmp1, "{%08lu}", *((EMUFS_REG_SIZE *)tmp));
639 tam_data = *((EMUFS_REG_SIZE *)tmp);
640 if ((size_acumulado+tam_data) > old_size) {
641 tam_data = old_size - size_acumulado;
644 tmp += sizeof(EMUFS_REG_SIZE);
646 if (pos_actualizada == 1) {
650 PERR("Voy por la data");
652 while (j < tam_data) {
660 copy_char(tmp1, tmp);
665 if (pos_actualizada == 1)
669 size_acumulado += tam_data;
670 if (pos_actualizada == 1)
677 salida[*size-1] = '\0';
682 char *procesar_registro_tipo2(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho)
687 EMUFS_REG_SIZE tam_data;
688 if (ptr == NULL) return NULL;
690 (*size) = *size - sizeof(EMUFS_REG_SIZE) - sizeof(EMUFS_REG_ID) + 21;
691 (*ancho) = *size-101;
692 salida = (char *)malloc(*size);
693 memset(salida, '.', *size);
695 PERR("Voy por el espacio antes");
697 fprintf(stderr, "Pos Inicial %d\n", *pos_actual);
701 for(i=0; i < *pos_actual; i++) {
707 PERR("Voy por el header");
709 sprintf(tmp, "(%08lu)", *((EMUFS_REG_ID *)in));
711 in += sizeof(EMUFS_REG_ID);
712 /* Tamaño de registro */
713 sprintf(tmp, "{%08lu}", *((EMUFS_REG_SIZE *)in));
714 tam_data = *((EMUFS_REG_SIZE *)in);
716 in += sizeof(EMUFS_REG_SIZE);
717 PERR("Voy por la data");
719 while (i < tam_data) {
725 PERR("Voy por el espacio despues");
726 for(i=0; i < 100-*pos_actual; i++) {
734 salida[*size-1] = '\0';