]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs_gui/tree_viewer.c
un poco mas de B+
[z.facultad/75.06/emufs.git] / emufs_gui / tree_viewer.c
1
2 #include "tree_viewer.h"
3 #include "emufs.h"
4
5 void sprint_ind(INDICE *idx, char *dst, B_NodoEntry e)
6 {
7         int error;
8         char * leido;
9         EMUFS_REG_SIZE dummy;
10
11         switch (idx->tipo_dato) {
12                 case IDX_INT:
13                         sprintf(dst, "(%d)%d", e.clave.i_clave, e.hijo_derecho);
14                         break;
15                 case IDX_FLOAT:
16                         sprintf(dst, "(%.2f)%d", e.clave.f_clave, e.hijo_derecho);
17                         break;
18                 case IDX_STRING:
19                         error = 0;
20                         leido = idx->emu_string->leer_registro(idx->emu_string, e.clave, &dummy, &error);
21                         sprintf(dst, "(%s)%d", leido, e.hijo_derecho);
22                         free(leido);
23                 }
24 }
25
26 int emufs_indice_b_ver(INDICE *idx, WINDOW *win, int w, int h, int id)
27 {
28         int y=0;
29         B_NodoHeader header;
30         B_NodoEntry *claves;
31         t_Form *form;
32         char *nodo;
33         char tmp[100];
34         int i;
35         int posibles_proximos[1000];
36         int proximo;
37
38         if (id == -1) return 0;
39
40         memset(posibles_proximos, -1, sizeof(int)*100);
41         do {
42                 y = 0;
43                 mvwaddstr(win, y++, 0, "Nombre : ");
44                 waddstr(win, idx->nombre);
45         
46                 /* Muestro la raiz */
47                 nodo = b_leer_nodo(idx, id);
48                 b_leer_header(nodo, &header);
49                 claves = b_leer_claves(nodo, &header);
50         
51                 mvwaddstr(win, y++, 0, "Nodo Nro ");
52                 sprintf(tmp, "%d", id);
53                 waddstr(win, tmp);
54                 mvwaddstr(win, y++, 0, "Nivel =  ");
55                 sprintf(tmp, "%d", header.nivel);
56                 waddstr(win, tmp);
57                 mvwaddstr(win, y++, 0, "Cantidad de hijo = ");
58                 sprintf(tmp, "%d", header.cant);
59                 waddstr(win, tmp);
60                 mvwaddstr(win, y++, 0, "Padre = ");
61                 sprintf(tmp, "%d", header.padre);
62                 waddstr(win, tmp);
63         
64                 /* Muestro las claves */
65                 mvwaddstr(win, y++, 0, "Claves");
66                 wmove(win, y, 0);
67                 sprintf(tmp, "%d", header.hijo_izquierdo);
68                 waddstr(win, tmp);
69                 for(i=0; i<header.cant; i++) {
70                         sprint_ind(idx, tmp, claves[i]);
71                         posibles_proximos[i] = claves[i].hijo_derecho;
72                         waddstr(win, tmp);
73                 }
74                 posibles_proximos[i++] = header.hijo_izquierdo;
75                 free(nodo);
76                 wrefresh(win);
77         
78                 form = form_crear(win);
79                 form_agregar_widget(form, INPUT, "Ver (-1 para volver)", 4, "");
80                 form_ejecutar(form, 0, h-2);
81                 proximo = form_obtener_valor_int(form, "Ver (-1 para volver)");
82
83                 /* Verifico que proximo sea un hijo */
84                 /* +1 por el hijo izquierdo */
85                 if (proximo != -1) {
86                         for(i=0; i<header.cant+1; i++) {
87                                 if (posibles_proximos[i] == proximo) break;
88                         }
89
90                         if (i>=(header.cant+1)) proximo = id; /* Si no es un nodo valido, lo anulo*/
91                 }
92
93                 /* Solo voy a otro nodo si no soy el mismo */
94                 if (proximo != id) {
95                         werase(win);
96                         wrefresh(win);
97                         emufs_indice_b_ver(idx, win, w, h, proximo);
98                 }
99         } while (proximo != -1);
100
101         werase(win);
102         wrefresh(win);
103         return 0;
104 }
105