#include "registros.h"
+#include "idx.h"
/* Se encarga de reemplazar los \0 un caracter visual, y segurar un \0 al final */
-static char *procesar_registro(char *ptr, size_t size);
+static char *procesar_registro(char *ptr, EMUFS_REG_SIZE *size);
+
+#define ACT 0
+#define ANT 1
+#define SIG 2
void ver_registros(WINDOW *padre, int w, int h)
{
/* Ventanas donde mostrar las cosas */
WINDOW *actual[2], *ant[2], *sig[2];
- int c, scroll, actual_ancho;
- char *data;
+ EMUFS_REG_SIZE size;
+ int scroll, actual_ancho;
+ int max_scroll, c;
+ EMUFS_REG_ID ant_indice, total_indice; /* Indice de registro que tengo en ANT */
+ char *data[3];
EMUFS *fp;
+ int error;
fp = emufs_abrir("articulos");
- data = (char *)fp->leer_registro(fp, 0, &c, &scroll);
+ total_indice = emufs_idx_get_count(fp);
- data = procesar_registro(data, c);
+ ant_indice = 0;
+ data[ANT] = (char *)fp->leer_registro(fp, ant_indice, &size, &error);
+ data[ANT] = procesar_registro(data[ANT], &size);
+
+ data[ACT] = (char *)fp->leer_registro(fp, ant_indice+1, &size, &error);
+ data[ACT] = procesar_registro(data[ACT], &size);
+
+ data[SIG] = (char *)fp->leer_registro(fp, ant_indice+2, &size, &error);
+ data[SIG] = procesar_registro(data[SIG], &size);
+
+ max_scroll = size / (w/3-2) - (h-4);
+ if (max_scroll < 0) max_scroll = 0;
actual[0] = derwin(padre, h-2, w/3, 1, w/3);
actual_ancho = w/3-2;
actual[1] = derwin(actual[0], h-4, w/3-2, 1, 1);
box(actual[0], 0, 0);
ant[0] = derwin(padre, h-2, w/3, 1, 0);
+ ant[1] = derwin(ant[0], h-4, w/3-2, 1, 1);
box(ant[0], 0, 0);
sig[0] = derwin(padre, h-2, w/3, 1, w/3*2);
+ sig[1] = derwin(sig[0], h-4, w/3-2, 1, 1);
box(sig[0], 0, 0);
wattron(actual[1], A_BOLD);
- mvwaddstr(actual[1], 0, 0, data);
+ mvwaddstr(actual[1], 0, 0, data[ACT]);
wattroff(actual[1], A_BOLD);
+ mvwaddstr(sig[1], 0, 0, data[SIG]);
+ mvwaddstr(ant[1], 0, 0, data[ANT]);
+
wrefresh(sig[0]);
wrefresh(ant[0]);
wrefresh(actual[0]);
break;
case 'z':
scroll++;
+ if (scroll > max_scroll) scroll = max_scroll;
+ case 'k': /* Desplano los registros a derecha! */
+ if (ant_indice != EMUFS_NOT_FOUND) {
+ if (data[ANT]) free(data[ANT]);
+ if (data[ACT]) free(data[ACT]);
+ if (data[SIG]) free(data[SIG]);
+ ant_indice--;
+
+ data[ANT] = (char *)fp->leer_registro(fp, ant_indice, &size, &error);
+ data[ANT] = procesar_registro(data[ANT], &size);
+ data[ACT] = (char *)fp->leer_registro(fp, ant_indice+1, &size, &error);
+ data[ACT] = procesar_registro(data[ACT], &size);
+ data[SIG] = (char *)fp->leer_registro(fp, ant_indice+2, &size, &error);
+ data[SIG] = procesar_registro(data[SIG], &size);
+ }
+ break;
+ case 'l': /* Desplazo los registros a izquieda!! */
+ if (ant_indice+1 < total_indice-1) {
+ if (data[ANT]) free(data[ANT]);
+ if (data[ACT]) free(data[ACT]);
+ if (data[SIG]) free(data[SIG]);
+ ant_indice++;
+
+ data[ANT] = (char *)fp->leer_registro(fp, ant_indice, &size, &error);
+ data[ANT] = procesar_registro(data[ANT], &size);
+ data[ACT] = (char *)fp->leer_registro(fp, ant_indice+1, &size, &error);
+ data[ACT] = procesar_registro(data[ACT], &size);
+ data[SIG] = (char *)fp->leer_registro(fp, ant_indice+2, &size, &error);
+ data[SIG] = procesar_registro(data[SIG], &size);
+ }
}
+ /* Borro las ventanas */
werase(actual[1]);
+ werase(sig[1]);
+ werase(ant[1]);
+
+ /* Imprimo los registros */
wattron(actual[1], A_BOLD);
- mvwaddstr(actual[1], 0, 0, data+actual_ancho*scroll);
+ if (data[ACT]) mvwaddstr(actual[1], 0, 0, data[ACT]+actual_ancho*scroll);
wattroff(actual[1], A_BOLD);
+ if (data[SIG]) mvwaddstr(sig[1], 0, 0, data[SIG]);
+ if (data[ANT]) mvwaddstr(ant[1], 0, 0, data[ANT]);
+
+ /* Refrescos para todos!! */
+ wrefresh(sig[1]);
+ wrefresh(ant[1]);
wrefresh(actual[1]);
wrefresh(actual[0]);
wrefresh(padre);
delwin(actual[1]);
werase(actual[0]);
delwin(actual[0]);
+ delwin(ant[1]);
+ delwin(sig[1]);
werase(sig[0]);
delwin(sig[0]);
werase(ant[0]);
wrefresh(padre);
}
-static char *procesar_registro(char *ptr, size_t size)
+static char *procesar_registro(char *ptr, EMUFS_REG_SIZE *size)
{
char *tmp, *salida, *tmp1;
- salida = (char *)malloc(size-sizeof(unsigned int)+10+1);
+ if (ptr == NULL) return NULL;
+ salida = (char *)malloc((*size)-sizeof(unsigned int)+11);
sprintf(salida, "(%08d)", *((unsigned int *)ptr));
tmp1 = salida+10;
tmp = ptr+sizeof(unsigned int);
- while (tmp < (ptr+size)) {
+ while (tmp < (ptr + (*size))) {
if (*tmp == '\0') {
(*tmp1) = '|';
} else {
tmp1++;
}
free(ptr);
+ (*tmp1) = '\0';
+ (*size) = (*size)-sizeof(unsigned int)+11;
return salida;
}