+
+char *juntar_memoria(char *s1, char *s2, char *s3, int size1, int size2, int size3)
+{
+ char *salida;
+ int tam=0;
+ if (s1) tam += size1;
+ if (s2) tam += size2;
+ if (s3) tam += size3;
+ salida = (char *)malloc(tam);
+ if (salida == NULL) {
+ free(s1);
+ free(s2);
+ free(s3);
+ return NULL;
+ }
+
+ if (s1) memcpy(salida, s1, size1);
+ if (s2) memcpy(salida+size2, s2, size2);
+ if (s3) memcpy(salida+size2+size3, s3, size3);
+ if (s1) free(s1);
+ if (s2) free(s2);
+ if (s3) free(s3);
+ return salida;
+}
+
+void ver_bloques(WINDOW *padre, int w, int h, int cual)
+{
+ /* Ventanas donde mostrar las cosas */
+ char *(*procesar)(EMUFS*, char*, EMUFS_REG_SIZE*, int*, int*);
+ WINDOW *actual[2], *dlg;
+ EMUFS_REG_SIZE size, size_actual, size_siguiete, size_anterior;
+ int scroll, actual_ancho;
+ int max_scroll, c, offset_alto;
+ /* Indices que hay validos en IDX */
+ EMUFS_REG_ID indices_total, indices_actual;
+ char *bloque_actual, *bloque_anterior, *bloque_siguiente;
+ char *data; /* Registros a mostrar en pantalla */
+ EMUFS *fp;
+ int pos_actual, ancho_registro, offset, pos;
+ EMUFS_Estadisticas stats;
+
+ if (cual == 0)
+ fp = emufs_abrir("articulos");
+ else if (cual == 1)
+ fp = emufs_abrir("facturas");
+ else if (cual == 2)
+ fp = emufs_abrir("notas");
+
+ stats = fp->leer_estadisticas(fp);
+
+ wattron(padre, COLOR_PAIR(COLOR_BLUE));
+ mvwaddstr(padre, 0, 0, "Tipo de archivo : ");
+ wattroff(padre, COLOR_PAIR(COLOR_BLUE));
+ switch (fp->tipo) {
+ case T1:
+ waddstr(padre, "Registro variable con bloque parametrizado.");
+ if (cual == 0)
+ procesar = procesar_registro_articulo_tipo1;
+ else
+ procesar = procesar_registro_factura_tipo1;
+ break;
+ case T2:
+ waddstr(padre, "Registro variable sin bloques.");
+ actual[0] = msg_box(padre, w, h, "El tipo de archivo no contiene bloques.");
+ getch();
+ msg_box_free(padre, actual[0]);
+ return;
+ break;
+ case T3:
+ if (cual == 0)
+ procesar = procesar_registro_articulo_tipo3;
+ else
+ procesar = procesar_registro_factura_tipo3;
+ waddstr(padre, "Registro fijo con bloque parametrizado.");
+ }
+
+
+ indices_actual = 0;
+ indices_total = stats.cant_bloques;
+ /* Leo */
+ fp->leer_bloque_raw(fp, indices_actual, &bloque_actual, &bloque_anterior, &bloque_siguiente, &size_actual, &size_anterior, &size_siguiete);
+ pos_actual = 0;
+ bloque_actual = procesar(fp, bloque_actual, &size_actual, &pos_actual, &ancho_registro);
+ pos_actual = 0;
+ bloque_siguiente = procesar(fp, bloque_siguiente, &size_siguiete, &pos_actual, &ancho_registro);
+ pos_actual = 0;
+ bloque_anterior = procesar(fp, bloque_anterior, &size_anterior, &pos_actual, &ancho_registro);
+ if (!bloque_siguiente) {
+ bloque_siguiente = (char *)malloc(size_siguiete);
+ memset(bloque_siguiente, 0, size_siguiete);
+ }
+ if (!bloque_anterior) {
+ bloque_anterior = (char *)malloc(size_anterior);
+ memset(bloque_anterior, 0, size_anterior);
+ }
+ pos_actual = size_anterior; /* Resalta desde el fin del bloque anterior */
+ ancho_registro = size_actual;
+ data = juntar_memoria(bloque_anterior, bloque_actual, bloque_siguiente, size_anterior, size_actual, size_siguiete);
+
+ PERR("HASTA ACA VOY BIEN");
+ offset_alto = 8;
+ max_scroll = (size_actual+size_anterior+size_siguiete) / (w-4) - (h-offset_alto-2);
+ if (max_scroll < 0) max_scroll = 0;
+
+ actual[0] = derwin(padre, h-offset_alto, w-2, 1, 1);
+ actual_ancho = w-4;
+ actual[1] = derwin(actual[0], h-offset_alto-2, w-4, 1, 1);
+ box(actual[0], 0, 0);
+
+ curs_set(0);
+
+ mostrar_info(padre, h, offset_alto);
+
+ mvwaddnstr(actual[1], 0, 0, data, pos_actual);
+ wattron(actual[1], A_BOLD);
+ waddnstr(actual[1], data+pos_actual, ancho_registro);
+ wattroff(actual[1], A_BOLD);
+ waddnstr(actual[1], data+pos_actual+ancho_registro, size-(pos_actual+ancho_registro));