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] = Campo numerico");
62 mvwaddstr(padre, h-offset_alto+4, 48, "(XXX) = ID de registro");
63 mvwaddstr(padre, h-offset_alto+5, 48, "{XXX} = Tam. de registro");
64 mvwaddstr(padre, h-offset_alto+6, 48, " . = Esp. Libre");
67 char *juntar_memoria(char *s1, char *s2, char *s3, int size1, int size2, int size3)
74 salida = (char *)malloc(tam);
82 if (s1) memcpy(salida, s1, size1); else size1 = 0;
83 if (s2) memcpy(salida+size1, s2, size2); else size2 = 0;
84 if (s3) memcpy(salida+size1+size2, s3, size3);
91 void ver_bloques(WINDOW *padre, int w, int h, int cual)
93 /* Ventanas donde mostrar las cosas */
94 char *(*procesar)(EMUFS*, char*, EMUFS_REG_SIZE*, int*, int*);
95 WINDOW *actual[2], *dlg;
96 EMUFS_REG_SIZE size, size_actual, size_siguiete, size_anterior;
97 int scroll, actual_ancho;
98 int max_scroll, c, offset_alto;
99 /* Indices que hay validos en IDX */
100 EMUFS_REG_ID indices_total, indices_actual;
101 char *bloque_actual, *bloque_anterior, *bloque_siguiente;
102 char *data; /* Registros a mostrar en pantalla */
104 int pos_actual, ancho_registro, offset, pos;
105 EMUFS_Estadisticas stats;
108 fp = emufs_abrir("articulos");
110 fp = emufs_abrir("facturas");
112 fp = emufs_abrir("notas");
114 stats = fp->leer_estadisticas(fp);
116 wattron(padre, COLOR_PAIR(COLOR_BLUE));
117 mvwaddstr(padre, 0, 0, "Tipo de archivo : ");
118 wattroff(padre, COLOR_PAIR(COLOR_BLUE));
121 waddstr(padre, "Registro variable con bloque parametrizado.");
122 procesar = procesar_registro_tipo1;
125 waddstr(padre, "Registro variable sin bloques.");
126 actual[0] = msg_box(padre, w, h, "El tipo de archivo no contiene bloques.");
128 msg_box_free(padre, actual[0]);
132 procesar = procesar_registro_tipo3;
133 waddstr(padre, "Registro fijo con bloque parametrizado.");
138 indices_total = stats.cant_bloques;
140 fp->leer_bloque_raw(fp, indices_actual, &bloque_actual, &bloque_anterior, &bloque_siguiente, &size_actual, &size_anterior, &size_siguiete);
142 bloque_actual = procesar(fp, bloque_actual, &size_actual, &pos_actual, &ancho_registro);
144 bloque_siguiente = procesar(fp, bloque_siguiente, &size_siguiete, &pos_actual, &ancho_registro);
146 bloque_anterior = procesar(fp, bloque_anterior, &size_anterior, &pos_actual, &ancho_registro);
147 if (!bloque_siguiente) {
148 bloque_siguiente = (char *)malloc(size_siguiete);
149 memset(bloque_siguiente, 0, size_siguiete);
151 if (!bloque_anterior) {
152 bloque_anterior = (char *)malloc(size_anterior);
153 memset(bloque_anterior, 0, size_anterior);
155 pos_actual = size_anterior; /* Resalta desde el fin del bloque anterior */
156 ancho_registro = size_actual;
157 data = juntar_memoria(bloque_anterior, bloque_actual, bloque_siguiente, size_anterior, size_actual, size_siguiete);
159 PERR("HASTA ACA VOY BIEN");
161 max_scroll = (size_actual+size_anterior+size_siguiete) / (w-4) - (h-offset_alto-2);
162 if (max_scroll < 0) max_scroll = 0;
164 actual[0] = derwin(padre, h-offset_alto, w-2, 1, 1);
166 actual[1] = derwin(actual[0], h-offset_alto-2, w-4, 1, 1);
167 box(actual[0], 0, 0);
171 mostrar_info(padre, h, offset_alto, 0);
173 mvwaddnstr(actual[1], 0, 0, data, pos_actual);
174 wattron(actual[1], A_BOLD);
175 waddnstr(actual[1], data+pos_actual, ancho_registro);
176 wattroff(actual[1], A_BOLD);
177 waddnstr(actual[1], data+pos_actual+ancho_registro, size-(pos_actual+ancho_registro));
183 while ((c=getch()) != 13) {
187 dlg = newwin(4, 50, h/2-2, w/2-25);
189 indices_actual = preguntar_id(dlg, fp);
190 if (indices_actual < 0) indices_actual = 0;
191 if (indices_actual > indices_total) indices_actual = indices_total-1;
198 case 'a': /* Scroll */
200 if (scroll < 0) scroll = 0;
202 case 'z': /* Scroll */
204 if (scroll > max_scroll) scroll = max_scroll;
207 if (indices_actual < indices_total) {
209 if (indices_actual >= indices_total) indices_actual = indices_total-1;
210 if (data) free(data);
211 fp->leer_bloque_raw(fp, indices_actual, &bloque_actual, &bloque_anterior, &bloque_siguiente, &size_actual, &size_anterior, &size_siguiete);
212 bloque_actual = procesar(fp, bloque_actual, &size_actual, &pos_actual, &ancho_registro);
213 bloque_siguiente = procesar(fp, bloque_siguiente, &size_siguiete, &pos_actual, &ancho_registro);
214 bloque_anterior = procesar(fp, bloque_anterior, &size_anterior, &pos_actual, &ancho_registro);
215 pos_actual = size_anterior; /* Resalta desde el fin del bloque anterior */
216 ancho_registro = size_actual;
217 data = juntar_memoria(bloque_anterior, bloque_actual, bloque_siguiente, size_anterior, size_actual, size_siguiete);
221 if (indices_actual != EMUFS_NOT_FOUND) {
223 if (indices_actual == EMUFS_NOT_FOUND) indices_actual = 0;
224 if (data) free(data);
225 fp->leer_bloque_raw(fp, indices_actual, &bloque_actual, &bloque_anterior, &bloque_siguiente, &size_actual, &size_anterior, &size_siguiete);
226 bloque_actual = procesar(fp, bloque_actual, &size_actual, &pos_actual, &ancho_registro);
227 bloque_siguiente = procesar(fp, bloque_siguiente, &size_siguiete, &pos_actual, &ancho_registro);
228 bloque_anterior = procesar(fp, bloque_anterior, &size_anterior, &pos_actual, &ancho_registro);
229 pos_actual = size_anterior; /* Resalta desde el fin del bloque anterior */
230 ancho_registro = size_actual;
231 data = juntar_memoria(bloque_anterior, bloque_actual, bloque_siguiente, size_anterior, size_actual, size_siguiete);
234 /* Borro las ventanas */
237 /* Imprimo los registros */
239 offset = scroll*actual_ancho; /* Cantidad de caracteres que tengo que saltar */
240 pos = pos_actual - offset; /* Cantidad de caracteres que hay antes de mi a imprimir */
241 mvwaddnstr(actual[1], 0, 0, data+offset, pos);
246 wattron(actual[1], A_BOLD);
247 waddnstr(actual[1], data+offset, ancho_registro+((pos<0)?pos:0));
248 wattroff(actual[1], A_BOLD);
249 offset += ancho_registro+((pos<0)?pos:0);
250 waddnstr(actual[1], data+offset, size-offset);
256 if (data) free(data);
264 void ver_registros(WINDOW *padre, int w, int h, int cual)
266 /* Ventanas donde mostrar las cosas */
267 char *(*procesar)(EMUFS*, char*, EMUFS_REG_SIZE*, int*, int*);
268 WINDOW *actual[2], *dlg;
270 int scroll, actual_ancho;
271 int max_scroll, c, offset_alto;
272 /* Indices que hay validos en IDX */
273 EMUFS_REG_ID *indices, indices_total, indices_actual;
274 char *data; /* Registros a mostrar en pantalla */
275 char codigo[50]; /* Variable para guardar el codigo actual para mandar a modificar */
277 int pos_actual, ancho_registro, offset, pos;
280 fp = emufs_abrir("articulos");
282 fp = emufs_abrir("facturas");
284 wattron(padre, COLOR_PAIR(COLOR_BLUE));
285 mvwaddstr(padre, 0, 0, "Tipo de archivo : ");
286 wattroff(padre, COLOR_PAIR(COLOR_BLUE));
289 waddstr(padre, "Registro variable con bloque parametrizado.");
290 procesar = procesar_registro_tipo1;
293 waddstr(padre, "Registro variable con sin bloques.");
294 procesar = procesar_registro_tipo2;
297 procesar = procesar_registro_tipo3;
298 waddstr(padre, "Registro fijo con bloque parametrizado.");
301 indices = emufs_idx_get(fp, &indices_total);
305 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
306 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
311 max_scroll = size / (w-4) - (h-offset_alto-2);
312 if (max_scroll < 0) max_scroll = 0;
314 actual[0] = derwin(padre, h-offset_alto, w-2, 1, 1);
316 actual[1] = derwin(actual[0], h-offset_alto-2, w-4, 1, 1);
317 box(actual[0], 0, 0);
321 mostrar_info(padre, h, offset_alto, 1);
324 mvwaddnstr(actual[1], 0, 0, data, pos_actual);
325 wattron(actual[1], A_BOLD);
326 waddnstr(actual[1], data+pos_actual, ancho_registro);
327 wattroff(actual[1], A_BOLD);
328 waddnstr(actual[1], data+pos_actual+ancho_registro, size-(pos_actual+ancho_registro));
335 while ((c=getch()) != 13) {
339 dlg = newwin(4, 50, h/2-2, w/2-25);
341 preguntar_id(dlg, fp);
350 if (indices_actual != EMUFS_NOT_FOUND)
351 fp->borrar_registro(fp, indices[indices_actual]);
354 indices = emufs_idx_get(fp, &indices_total);
355 if (indices_actual >= indices_total) {
356 indices_actual = indices_total - 1;
359 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
360 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
369 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
370 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
373 indices = emufs_idx_get(fp, &indices_total);
375 /* Tengo que re-pintar algunas cosas */
376 mostrar_info(padre, h, offset_alto, 1);
377 box(actual[0], 0, 0);
381 case 'm': /* Quiero editar !!! */
382 sprintf(codigo, "%lu", indices[indices_actual]);
384 art_modificar(codigo);
386 fact_modificar(codigo);
387 /* Vuelvo a cargar el articulo actual */
390 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
391 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
393 /* Tengo que re-pintar algunas cosas */
394 mostrar_info(padre, h, offset_alto, 1);
395 box(actual[0], 0, 0);
398 case 'a': /* Scroll */
400 if (scroll < 0) scroll = 0;
402 case 'z': /* Scroll */
404 if (scroll > max_scroll) scroll = max_scroll;
407 if (indices_actual < indices_total) {
409 if (indices_actual >= indices_total) indices_actual = indices_total-1;
410 if (data) free(data);
411 data = (char *)fp->leer_registro_raw(fp, indices[indices_actual], &size, &pos_actual);
412 data = procesar(fp, data, &size, &pos_actual, &ancho_registro);
416 if (indices_actual != EMUFS_NOT_FOUND) {
418 if (indices_actual == EMUFS_NOT_FOUND) indices_actual = 0;
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 /* Borro las ventanas */
428 /* Imprimo los registros */
430 offset = scroll*actual_ancho;
431 pos = pos_actual - offset;
432 mvwaddnstr(actual[1], 0, 0, data+offset, pos);
434 wattron(actual[1], A_BOLD);
435 waddnstr(actual[1], data+offset, ancho_registro);
436 wattroff(actual[1], A_BOLD);
437 offset += ancho_registro;
438 waddnstr(actual[1], data+offset, size-offset);
444 if (indices) free(indices);
445 if (data) free(data);
453 int preguntar_id(WINDOW *win, EMUFS *fp)
456 t_Form *form = form_crear(win);
457 form_agregar_widget(form, INPUT, "ID a buscar", 8, "");
460 form_set_valor(form, "ID a buscar", "");
461 form_ejecutar(form, 1,1);
463 n = form_obtener_valor_int(form, "ID a buscar");
470 char *procesar_registro_tipo3(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho)
472 char *tmp, *salida, *tmp1, pos_actualizada, ant;
473 int cant_header, i=0, j, tam_data;
474 if (ptr == NULL) return NULL;
476 PERR("Empieza el baile");
478 /* Calculo cuantos headers de registros va a haber en el archivo */
479 cant_header = emu->tam_bloque / (emu->tam_reg+sizeof(EMUFS_REG_ID));
480 if (cant_header == 0) cant_header++; /* Si tam_reg > tam_bloque, voy a tener solo 1 header */
481 tam_data = emu->tam_reg;
482 if (tam_data > (*size - sizeof(EMUFS_REG_ID)))
483 tam_data = *size - sizeof(EMUFS_REG_ID);
485 (*size) = (*size) - cant_header*sizeof(EMUFS_REG_ID)+cant_header*10+1;
486 tmp1 = salida = (char *)malloc(*size);
487 memset(salida, '.', *size);
488 if (salida == NULL) {
489 PERR("Error de malloc en salida");
495 while (i<cant_header) {
496 /* Verifico la pos_actual para el resaltado, asi queda coherente
497 * en el cambio de formato
499 if (((tmp - ptr) == *pos_actual) && (!pos_actualizada)) {
500 (*pos_actual) = tmp1-salida;
503 /* Pongo el ID del registro */
504 sprintf(tmp1, "(%08lu)", *((EMUFS_REG_ID *)tmp));
506 tmp += sizeof(EMUFS_REG_ID);
508 if (pos_actualizada == 1) {
512 while (j < (tam_data)) {
520 copy_char(tmp1, tmp);
525 if (pos_actualizada == 1)
529 if (pos_actualizada == 1)
536 salida[*size-1] = '\0';
541 char *procesar_registro_tipo1(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho)
543 char *tmp, *salida, *tmp1, pos_actualizada, ant;
544 EMUFS_REG_SIZE offset, curr_size, size_acumulado, old_size;
545 int cant_header, i=0, j, tam_data;
546 if (ptr == NULL) return NULL;
548 PERR("Empieza el baile");
552 /* Me salto el ID, que no me interesa saber su valor */
553 offset += sizeof(EMUFS_REG_ID);
554 /* Copio el tamaño del registro de la cabecera. */
555 memcpy(&curr_size, ptr + offset, sizeof(EMUFS_REG_SIZE));
556 offset += sizeof(EMUFS_REG_SIZE);
558 /* Desplazo el offset */
560 fprintf(stderr, "Tam = %lu\n", curr_size);
562 if (curr_size == 0) {
563 /* Si el tamaño de registro es 0, quiere decir que llegue a la
564 * parte que esta vacia */
570 } while (offset+sizeof(EMUFS_REG_SIZE)+sizeof(EMUFS_REG_ID) < (*size));
572 if (cant_header == 0) {
573 PERR("NO TENGO ITEMS");
574 memset(ptr, '.', *size);
580 /* El tamaño del nuevo array lo calculo asi :
584 (*size) = (*size) - sizeof(EMUFS_REG_ID)*cant_header - sizeof(EMUFS_REG_SIZE)*cant_header + cant_header*20+1;
585 tmp1 = salida = (char *)malloc(*size);
586 if (salida == NULL) {
587 PERR("Error de malloc en salida");
590 memset(salida, '.', *size);
596 while (i<cant_header) {
597 /* Verifico la pos_actual para el resaltado, asi queda coherente
598 * en el cambio de formato
600 if (((tmp - ptr) == *pos_actual) && (!pos_actualizada)) {
601 (*pos_actual) = tmp1-salida;
604 /* Pongo el ID del registro */
605 sprintf(tmp1, "(%08lu)", *((EMUFS_REG_ID *)tmp));
607 tmp += sizeof(EMUFS_REG_ID);
608 /* Cantidad de espacio que ocupa la data */
609 sprintf(tmp1, "{%08lu}", *((EMUFS_REG_SIZE *)tmp));
610 tam_data = *((EMUFS_REG_SIZE *)tmp);
611 if ((size_acumulado+tam_data) > old_size) {
612 tam_data = old_size - size_acumulado;
615 tmp += sizeof(EMUFS_REG_SIZE);
617 if (pos_actualizada == 1) {
621 PERR("Voy por la data");
623 while (j < tam_data) {
631 copy_char(tmp1, tmp);
636 if (pos_actualizada == 1)
640 size_acumulado += tam_data;
641 if (pos_actualizada == 1)
648 salida[*size-1] = '\0';
653 char *procesar_registro_tipo2(EMUFS *emu, char *ptr, EMUFS_REG_SIZE *size, int *pos_actual, int *ancho)
658 EMUFS_REG_SIZE tam_data;
659 if (ptr == NULL) return NULL;
661 (*size) = *size - sizeof(EMUFS_REG_SIZE) - sizeof(EMUFS_REG_ID) + 21;
662 (*ancho) = *size-101;
663 salida = (char *)malloc(*size);
664 memset(salida, '.', *size);
666 PERR("Voy por el espacio antes");
667 for(i=0; i < *pos_actual; i++) {
668 /* Los datos que tengo por ahora los pongo enmascarados! */
669 copy_char(&salida[i], in);
672 tmp = salida + *pos_actual;
673 in = ptr + *pos_actual;
675 PERR("Voy por el header");
677 sprintf(tmp, "(%08lu)", *((EMUFS_REG_ID *)in));
679 in += sizeof(EMUFS_REG_ID);
680 /* Tamaño de registro */
681 sprintf(tmp, "{%08lu}", *((EMUFS_REG_SIZE *)in));
682 tam_data = *((EMUFS_REG_SIZE *)in);
684 in += sizeof(EMUFS_REG_SIZE);
685 PERR("Voy por la data");
687 while (i < tam_data) {
693 PERR("Voy por el espacio despues");
697 salida[*size-1] = '\0';