]> git.llucax.com Git - z.facultad/75.06/emufs.git/blob - emufs_gui/tree_viewer.c
Expongo el obtener siguiente de secuencial indexado, via la funcion en indince obtene...
[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                 fprintf(stderr, "CANT DE CLAVES = %d\n", header.cant);
70                 for(i=0; i<header.cant; i++) {
71                         sprint_ind(idx, tmp, claves[i]);
72                         posibles_proximos[i] = claves[i].hijo_derecho;
73                         waddstr(win, tmp);
74                 }
75                 posibles_proximos[i++] = header.hijo_izquierdo;
76                 free(nodo);
77                 wrefresh(win);
78         
79                 form = form_crear(win);
80                 form_agregar_widget(form, INPUT, "Ver (-1 para volver)", 4, "");
81                 form_ejecutar(form, 0, h-2);
82                 proximo = form_obtener_valor_int(form, "Ver (-1 para volver)");
83
84                 /* Verifico que proximo sea un hijo */
85                 /* +1 por el hijo izquierdo */
86                 if (proximo != -1) {
87                         for(i=0; i<header.cant+1; i++) {
88                                 if (posibles_proximos[i] == proximo) break;
89                         }
90
91                         if (i>=(header.cant+1)) proximo = id; /* Si no es un nodo valido, lo anulo*/
92                 }
93
94                 /* Solo voy a otro nodo si no soy el mismo */
95                 if (proximo != id) {
96                         werase(win);
97                         wrefresh(win);
98                         emufs_indice_b_ver(idx, win, w, h, proximo);
99                 }
100         } while (proximo != -1);
101
102         werase(win);
103         wrefresh(win);
104         return 0;
105 }
106