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;
251 pos = pos_actual - offset;
252 mvwaddnstr(actual[1], 0, 0, data+offset, pos);
254 wattron(actual[1], A_BOLD);
255 waddnstr(actual[1], data+offset, ancho_registro);
256 wattroff(actual[1], A_BOLD);
257 offset += ancho_registro;
258 waddnstr(actual[1], data+offset, size-offset);
264 if (data) free(data);
272 void ver_registros(WINDOW *padre, int w, int h, int cual)
274 /* Ventanas donde mostrar las cosas */
275 char *(*procesar)(EMUFS*, char*, EMUFS_REG_SIZE*, int*, int*);
276 WINDOW *actual[2], *dlg;
278 int scroll, actual_ancho;
279 int max_scroll, c, offset_alto;
280 /* Indices que hay validos en IDX */
281 EMUFS_REG_ID *indices, indices_total, indices_actual;
282 char *data; /* Registros a mostrar en pantalla */
283 char codigo[50]; /* Variable para guardar el codigo actual para mandar a modificar */
285 int pos_actual, ancho_registro, offset, pos, n, i;
288 fp = emufs_abrir("articulos");
289 else if (cual == 1) fp = emufs_abrir("facturas");
290 else if (cual == 2) fp = emufs_abrir("notas");
296 wattron(padre, COLOR_PAIR(COLOR_BLUE));
297 mvwaddstr(padre, 0, 0, "Tipo de archivo : ");
298 wattroff(padre, COLOR_PAIR(COLOR_BLUE));
301 waddstr(padre, "Registro variable con bloque parametrizado.");
302 procesar = procesar_registro_tipo1;
305 waddstr(padre, "Registro variable sin bloques.");
306 procesar = procesar_registro_tipo2;
309 procesar = procesar_registro_tipo3;
310 waddstr(padre, "Registro fijo con bloque parametrizado.");
313 indices = emufs_idx_get(fp, &indices_total);
317 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
318 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
323 max_scroll = size / (w-4) - (h-offset_alto-2);
324 if (max_scroll < 0) max_scroll = 0;
326 actual[0] = derwin(padre, h-offset_alto, w-2, 1, 1);
328 actual[1] = derwin(actual[0], h-offset_alto-2, w-4, 1, 1);
329 box(actual[0], 0, 0);
333 mostrar_info(padre, h, offset_alto, 1);
336 mvwaddnstr(actual[1], 0, 0, data, pos_actual);
337 wattron(actual[1], A_BOLD);
338 waddnstr(actual[1], data+pos_actual, ancho_registro);
339 wattroff(actual[1], A_BOLD);
340 waddnstr(actual[1], data+pos_actual+ancho_registro, size-(pos_actual+ancho_registro));
347 while ((c=getch()) != 13) {
351 dlg = newwin(4, 50, h/2-2, w/2-25);
353 n = preguntar_id(dlg, fp);
354 /* Busco la posicion dentro del id */
355 for(i=0; i< indices_total; i++) {
356 if (indices[i] == n) {
357 n = -1; /* LO ENCONTRE! */
363 if (data) free(data);
364 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
365 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
375 if (indices_actual != EMUFS_NOT_FOUND)
376 fp->borrar_registro(fp, indices[indices_actual]);
379 indices = emufs_idx_get(fp, &indices_total);
380 if (indices_actual >= indices_total) {
381 indices_actual = indices_total - 1;
384 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
385 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
389 if (cual == 2) break;
395 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
396 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
399 indices = emufs_idx_get(fp, &indices_total);
401 /* Tengo que re-pintar algunas cosas */
402 mostrar_info(padre, h, offset_alto, 1);
403 box(actual[0], 0, 0);
407 case 'm': /* Quiero editar !!! */
408 if (cual == 2) break;
409 sprintf(codigo, "%lu", indices[indices_actual]);
411 art_modificar(codigo);
413 fact_modificar(codigo);
414 /* Vuelvo a cargar el articulo actual */
417 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
418 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
420 /* Tengo que re-pintar algunas cosas */
421 mostrar_info(padre, h, offset_alto, 1);
422 box(actual[0], 0, 0);
425 case 'a': /* Scroll */
427 if (scroll < 0) scroll = 0;
429 case 'z': /* Scroll */
431 if (scroll > max_scroll) scroll = max_scroll;
434 if (indices_actual < indices_total) {
436 if (indices_actual >= indices_total) indices_actual = indices_total-1;
437 if (data) free(data);
438 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
439 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
443 if (indices_actual != EMUFS_NOT_FOUND) {
445 if (indices_actual == EMUFS_NOT_FOUND) indices_actual = 0;
446 if (data) free(data);
447 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
448 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
452 /* Borro las ventanas */
455 /* Imprimo los registros */
457 offset = scroll*actual_ancho;
458 pos = pos_actual - offset;
459 mvwaddnstr(actual[1], 0, 0, data+offset, pos);
461 wattron(actual[1], A_BOLD);
462 waddnstr(actual[1], data+offset, ancho_registro);
463 wattroff(actual[1], A_BOLD);
464 offset += ancho_registro;
465 waddnstr(actual[1], data+offset, size-offset);
471 if (indices) free(indices);
472 if (data) free(data);
480 int preguntar_id(WINDOW *win, EMUFS *fp)
483 t_Form *form = form_crear(win);
484 form_agregar_widget(form, INPUT, "ID a buscar", 8, "");
487 form_set_valor(form, "ID a buscar", "");
488 form_ejecutar(form, 1,1);
490 n = form_obtener_valor_int(form, "ID a buscar");
497 char *procesar_registro_tipo3(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho)
499 char *tmp, *salida, *tmp1, pos_actualizada, ant;
500 int cant_header, i=0, j, tam_data;
501 if (ptr == NULL) return NULL;
503 PERR("Empieza el baile");
505 /* Calculo cuantos headers de registros va a haber en el archivo */
506 cant_header = emu->tam_bloque / (emu->tam_reg+sizeof(EMUFS_REG_ID));
507 if (cant_header == 0) cant_header++; /* Si tam_reg > tam_bloque, voy a tener solo 1 header */
508 tam_data = emu->tam_reg;
509 if (tam_data > (*size - sizeof(EMUFS_REG_ID)))
510 tam_data = *size - sizeof(EMUFS_REG_ID);
512 (*size) = (*size) - cant_header*sizeof(EMUFS_REG_ID)+cant_header*10+1;
513 tmp1 = salida = (char *)malloc(*size);
514 memset(salida, '.', *size);
515 if (salida == NULL) {
516 PERR("Error de malloc en salida");
522 while (i<cant_header) {
523 /* Verifico la pos_actual para el resaltado, asi queda coherente
524 * en el cambio de formato
526 if (((tmp - ptr) == *pos_actual) && (!pos_actualizada)) {
527 (*pos_actual) = tmp1-salida;
530 /* Pongo el ID del registro */
531 sprintf(tmp1, "(%08lu)", *((EMUFS_REG_ID *)tmp));
533 tmp += sizeof(EMUFS_REG_ID);
535 if (pos_actualizada == 1) {
540 while (j < (tam_data)) {
548 copy_char(tmp1, tmp);
553 if (pos_actualizada == 1)
557 if (pos_actualizada == 1)
564 salida[*size-1] = '\0';
569 char *procesar_registro_tipo1(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho)
571 char *tmp, *salida, *tmp1, pos_actualizada, ant;
572 EMUFS_REG_SIZE offset, curr_size, size_acumulado, old_size;
573 int cant_header, i=0, j, tam_data;
574 if (ptr == NULL) return NULL;
576 PERR("Empieza el baile");
580 /* Me salto el ID, que no me interesa saber su valor */
581 offset += sizeof(EMUFS_REG_ID);
582 /* Copio el tamaño del registro de la cabecera. */
583 memcpy(&curr_size, ptr + offset, sizeof(EMUFS_REG_SIZE));
584 offset += sizeof(EMUFS_REG_SIZE);
586 /* Desplazo el offset */
588 fprintf(stderr, "Tam = %lu\n", curr_size);
590 if (curr_size == 0) {
591 /* Si el tamaño de registro es 0, quiere decir que llegue a la
592 * parte que esta vacia */
598 } while (offset+sizeof(EMUFS_REG_SIZE)+sizeof(EMUFS_REG_ID) < (*size));
600 if (cant_header == 0) {
601 PERR("NO TENGO ITEMS");
602 memset(ptr, '.', *size);
608 /* El tamaño del nuevo array lo calculo asi :
612 (*size) = (*size) - sizeof(EMUFS_REG_ID)*cant_header - sizeof(EMUFS_REG_SIZE)*cant_header + cant_header*20+1;
613 tmp1 = salida = (char *)malloc(*size);
614 if (salida == NULL) {
615 PERR("Error de malloc en salida");
618 memset(salida, '.', *size);
624 while (i<cant_header) {
625 /* Verifico la pos_actual para el resaltado, asi queda coherente
626 * en el cambio de formato
628 if (((tmp - ptr) == *pos_actual) && (!pos_actualizada)) {
629 (*pos_actual) = tmp1-salida;
632 /* Pongo el ID del registro */
633 sprintf(tmp1, "(%08lu)", *((EMUFS_REG_ID *)tmp));
635 tmp += sizeof(EMUFS_REG_ID);
636 /* Cantidad de espacio que ocupa la data */
637 sprintf(tmp1, "{%08lu}", *((EMUFS_REG_SIZE *)tmp));
638 tam_data = *((EMUFS_REG_SIZE *)tmp);
639 if ((size_acumulado+tam_data) > old_size) {
640 tam_data = old_size - size_acumulado;
643 tmp += sizeof(EMUFS_REG_SIZE);
645 if (pos_actualizada == 1) {
649 PERR("Voy por la data");
651 while (j < tam_data) {
659 copy_char(tmp1, tmp);
664 if (pos_actualizada == 1)
668 size_acumulado += tam_data;
669 if (pos_actualizada == 1)
676 salida[*size-1] = '\0';
681 char *procesar_registro_tipo2(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho)
686 EMUFS_REG_SIZE tam_data;
687 if (ptr == NULL) return NULL;
689 (*size) = *size - sizeof(EMUFS_REG_SIZE) - sizeof(EMUFS_REG_ID) + 21;
690 (*ancho) = *size-101;
691 salida = (char *)malloc(*size);
692 memset(salida, '.', *size);
694 PERR("Voy por el espacio antes");
696 fprintf(stderr, "Pos Inicial %d\n", *pos_actual);
700 for(i=0; i < *pos_actual; i++) {
706 PERR("Voy por el header");
708 sprintf(tmp, "(%08lu)", *((EMUFS_REG_ID *)in));
710 in += sizeof(EMUFS_REG_ID);
711 /* Tamaño de registro */
712 sprintf(tmp, "{%08lu}", *((EMUFS_REG_SIZE *)in));
713 tam_data = *((EMUFS_REG_SIZE *)in);
715 in += sizeof(EMUFS_REG_SIZE);
716 PERR("Voy por la data");
718 while (i < tam_data) {
724 PERR("Voy por el espacio despues");
725 for(i=0; i < 100-*pos_actual; i++) {
733 salida[*size-1] = '\0';