static void fillnode (txtnode_t *pnode, txtnode_t *cnode) { cnode->time = Ttime; cnode->path = Spath (pnode->path, cnode->ko); switch (cnode->mode) { case TXT_SEEN: cnode->u.s.text = Sseen (cnode->ko, cnode->u.s.txtnode->path); buttondata[3].u.t = cnode->u.s.text; buttondata[4].u.u = (unsigned long) cnode->vo; cnode->u.s.wi = Gcreatewidget ( pnode->u.f.t.mwi, G_BUTTONWIDGET, 5, &buttondata[0] ); break; case TXT_ABSTRACT: cnode->u.a.text = Sabstract (cnode->ko, cnode->vo); buttondata[3].u.t = cnode->u.a.text; buttondata[4].u.u = (unsigned long) cnode->vo; cnode->u.a.wi = Gcreatewidget ( pnode->u.f.t.mwi, G_BUTTONWIDGET, 5, &buttondata[0] ); break; case TXT_FULL: if (cnode->ttype == T_TABLE) { cnode->u.f.t.ftext = Stfull (cnode->ko); cnode->u.f.t.ltext = "];"; buttondata[3].u.t = cnode->u.f.t.ftext; buttondata[4].u.u = (unsigned long) cnode->vo; cnode->u.f.t.fwi = Gcreatewidget ( pnode->u.f.t.mwi, G_BUTTONWIDGET, 5, &buttondata[0] ); cnode->u.f.t.mwi = Gcreatewidget ( pnode->u.f.t.mwi, G_ARRAYWIDGET, 2, &arraydata[0] ); buttondata[3].u.t = cnode->u.f.t.ltext; buttondata[4].u.u = (unsigned long) cnode->vo; cnode->u.f.t.lwi = Gcreatewidget ( pnode->u.f.t.mwi, G_BUTTONWIDGET, 5, &buttondata[0] ); } else { cnode->u.f.s.text = Ssfull (cnode->ko, cnode->vo); buttondata[3].u.t = cnode->u.f.s.text; buttondata[4].u.u = (unsigned long) cnode->vo; cnode->u.f.s.wi = Gcreatewidget ( pnode->u.f.t.mwi, G_BUTTONWIDGET, 5, &buttondata[0] ); } break; } }
void Dtrace (Tobj to, int offset) { dnode_t dnode; char *s; int i; indent = offset - 2; afternl = TRUE; if (Tgettype (to) != T_TABLE) { pr ((s = Ssfull (NULL, to))), free (s); return; } seeni = 0; dnode.vo = to; dnode.path = ""; update (&dnode); for (i = 0; i < seeni; i++) free (seenp[i].path), seenp[i].path = NULL; }
static void update (dnode_t *pnode) { Tkvindex_t tkvi; dnode_t *list, *cnode; seennode_t *seennode; char *s; long i, n; indent += 2; n = ((Ttable_t *) pnode->vo)->n; if (!(list = malloc (n * sizeof (dnode_t)))) panic1 (POS, "update", "list malloc failed"); for ( cnode = &list[0], Tgetfirst (pnode->vo, &tkvi); tkvi.kvp; cnode++, Tgetnext (&tkvi) ) { cnode->ko = tkvi.kvp->ko; cnode->vo = tkvi.kvp->vo; cnode->ttype = Tgettype (cnode->vo); } qsort ((char *) list, n, sizeof (dnode_t), cmp); for (i = 0, cnode = &list[0]; i < n; i++, cnode++) { cnode->path = Spath (pnode->path, cnode->ko); seennode = findseen (cnode); if (seennode) { pr ((s = Sseen (cnode->ko, seennode->path))), free (s); } else { add2seen (cnode); if (cnode->ttype == T_TABLE) { pr ((s = Stfull (cnode->ko))), free (s); update (cnode); pr ("];"); } else { pr ((s = Ssfull (cnode->ko, cnode->vo))), free (s); } } } free (list); indent -= 2; }