]> git.llucax.com Git - z.facultad/75.06/emufs.git/blobdiff - emufs_gui/tree_viewer.c
Ordenamiento externo integrado a la GUI y funcionando 10 puntos :-)
[z.facultad/75.06/emufs.git] / emufs_gui / tree_viewer.c
index 3dc30d520eea93463a4f5ad255be0d5153311cbd..0c6e9683aceb37b2595fdbb02d31d4ccb9d7fe75 100644 (file)
@@ -1,5 +1,27 @@
 
 #include "tree_viewer.h"
+#include "emufs.h"
+
+void sprint_ind(INDICE *idx, char *dst, B_NodoEntry e)
+{
+       int error;
+       char * leido;
+       EMUFS_REG_SIZE dummy;
+
+       switch (idx->tipo_dato) {
+               case IDX_INT:
+                       sprintf(dst, "(%d)%d", e.clave.i_clave, e.hijo_derecho);
+                       break;
+               case IDX_FLOAT:
+                       sprintf(dst, "(%.2f)%d", e.clave.f_clave, e.hijo_derecho);
+                       break;
+               case IDX_STRING:
+                       error = 0;
+                       leido = idx->emu_string->leer_registro(idx->emu_string, e.clave, &dummy, &error);
+                       sprintf(dst, "(%s)%d", leido, e.hijo_derecho);
+                       free(leido);
+               }
+}
 
 int emufs_indice_b_ver(INDICE *idx, WINDOW *win, int w, int h, int id)
 {
@@ -10,10 +32,12 @@ int emufs_indice_b_ver(INDICE *idx, WINDOW *win, int w, int h, int id)
        char *nodo;
        char tmp[100];
        int i;
+       int posibles_proximos[1000];
        int proximo;
 
        if (id == -1) return 0;
 
+       memset(posibles_proximos, -1, sizeof(int)*100);
        do {
                y = 0;
                mvwaddstr(win, y++, 0, "Nombre : ");
@@ -42,15 +66,13 @@ int emufs_indice_b_ver(INDICE *idx, WINDOW *win, int w, int h, int id)
                wmove(win, y, 0);
                sprintf(tmp, "%d", header.hijo_izquierdo);
                waddstr(win, tmp);
+               fprintf(stderr, "CANT DE CLAVES = %d\n", header.cant);
                for(i=0; i<header.cant; i++) {
-                       sprintf(tmp, "(%d)%d",
-                                       claves[i].clave.i_clave,
-       /*                              claves[i].dato.id,
-                                       claves[i].dato.bloque,*/
-                                       claves[i].hijo_derecho
-                       );
+                       sprint_ind(idx, tmp, claves[i]);
+                       posibles_proximos[i] = claves[i].hijo_derecho;
                        waddstr(win, tmp);
                }
+               posibles_proximos[i++] = header.hijo_izquierdo;
                free(nodo);
                wrefresh(win);
        
@@ -58,12 +80,27 @@ int emufs_indice_b_ver(INDICE *idx, WINDOW *win, int w, int h, int id)
                form_agregar_widget(form, INPUT, "Ver (-1 para volver)", 4, "");
                form_ejecutar(form, 0, h-2);
                proximo = form_obtener_valor_int(form, "Ver (-1 para volver)");
-               werase(win);
-               wrefresh(win);
-               emufs_indice_b_ver(idx, win, w, h, proximo);
+
+               /* Verifico que proximo sea un hijo */
+               /* +1 por el hijo izquierdo */
+               if (proximo != -1) {
+                       for(i=0; i<header.cant+1; i++) {
+                               if (posibles_proximos[i] == proximo) break;
+                       }
+
+                       if (i>=(header.cant+1)) proximo = id; /* Si no es un nodo valido, lo anulo*/
+               }
+
+               /* Solo voy a otro nodo si no soy el mismo */
+               if (proximo != id) {
+                       werase(win);
+                       wrefresh(win);
+                       emufs_indice_b_ver(idx, win, w, h, proximo);
+               }
        } while (proximo != -1);
 
        werase(win);
        wrefresh(win);
+       return 0;
 }