static void buildlist (txtnode_t *pnode) { Tkvindex_t tkvi; Tobj ko, vo; int vtype; txtnode_t *cnode; pnode->u.f.t.n = ((Ttable_t *) pnode->vo)->n; if (!(pnode->u.f.t.list = malloc ( max (pnode->u.f.t.n, 1) * sizeof (txtnode_t) ))) panic (POS, "buildlist", "list malloc failed"); for ( cnode = &pnode->u.f.t.list[0], Tgetfirst (pnode->vo, &tkvi); tkvi.kvp; Tgetnext (&tkvi) ) { ko = tkvi.kvp->ko, vo = tkvi.kvp->vo; vtype = Tgettype (vo); if (vtype == T_CODE && TCgettype (vo, TCgetnext ( vo, TCgetnext (vo, TCgetnext (vo, TCgetfp (vo, 0))) )) == C_INTERNAL) { pnode->u.f.t.n--; continue; } *cnode = defnode; cnode->vo = vo; cnode->ko = ko; cnode->ttype = vtype; cnode++; } qsort ( (char *) pnode->u.f.t.list, pnode->u.f.t.n, sizeof (txtnode_t), cmp ); }
static void eforinst(Tobj co, int ci) { volatile jmp_buf *opljbufp; volatile jmp_buf pljbuf; volatile Tobj tblo, c1o; volatile Tkvindex_t tkvi; volatile tnk_t tnk; volatile long km, t; volatile int ei1, ei2, si; c1o = (volatile Tobj) co; /* protect argument from longjmp */ ei1 = TCgetfp(c1o, ci); ei2 = TCgetnext(c1o, ei1); si = TCgetnext(c1o, ei2); if (getvar((Tobj) c1o, ei1, (tnk_t *) & tnk) == -1) { err(ERRNOLHS, ERR3, c1o, ei1); return; } if (tnk.type == TNK_O) km = Mpushmark(tnk.u.tnko.ko); if (!(tblo = (volatile Tobj) eeval((Tobj) c1o, ei2))) { if (tnk.type == TNK_O) Mpopmark(km); err(ERRNORHS, ERR4, c1o, ei2); return; } if (Tgettype(tblo) != T_TABLE) { err(ERRNOTATABLE, ERR1, c1o, ei2); return; } PUSHJMP(opljbufp, pljbufp1, pljbuf); t = Tgettime(tblo); for (Tgetfirst((Tobj) tblo, (Tkvindex_t *) & tkvi); tkvi.kvp; Tgetnext((Tkvindex_t *) & tkvi)) { setvar(tnk, tkvi.kvp->ko); if (setjmp(*pljbufp1) != 0) { if (pljtype == PLJ_CONTINUE) continue; else if (pljtype == PLJ_BREAK) break; } eeval((Tobj) c1o, si); if (t != Tgettime(tblo)) { err(ERRTABLECHANGED, ERR1, c1o, ei2); break; } } POPJMP(opljbufp, pljbufp1); if (tnk.type == TNK_O) Mpopmark(km); }
static void rebuildlist (txtnode_t *pnode) { Tkvindex_t tkvi; Tobj ko, vo; int vtype; txtnode_t *cnode; txtnode_t *olist, *nlist; txtnode_t tmpnode; int on, nn, i, j, cmpval; cmpval = 0; olist = pnode->u.f.t.list; on = pnode->u.f.t.n; pnode->u.f.t.n = ((Ttable_t *) pnode->vo)->n; if (!(pnode->u.f.t.list = malloc ( max (pnode->u.f.t.n, 1) * sizeof (txtnode_t) ))) panic (POS, "rebuildlist", "list malloc failed"); for ( cnode = &pnode->u.f.t.list[0], Tgetfirst (pnode->vo, &tkvi); tkvi.kvp; Tgetnext (&tkvi) ) { ko = tkvi.kvp->ko, vo = tkvi.kvp->vo; vtype = Tgettype (vo); if (vtype == T_CODE && TCgettype (vo, TCgetnext ( vo, TCgetnext (vo, TCgetnext (vo, TCgetfp (vo, 0))) )) == C_INTERNAL) { pnode->u.f.t.n--; continue; } *cnode = defnode; cnode->vo = vo; cnode->ko = ko; cnode->ttype = vtype; cnode++; } qsort ((char *) pnode->u.f.t.list, pnode->u.f.t.n, sizeof (txtnode_t), cmp); nlist = pnode->u.f.t.list; nn = pnode->u.f.t.n; for (i = 0, j = 0; i < nn; i++) { while (j < on && (cmpval = cmp (&olist[j], &nlist[i])) < 0) j++; if (j < on && cmpval == 0 && nlist[i].vo == olist[j].vo) tmpnode = olist[j], olist[j] = nlist[i], nlist[i] = tmpnode, j++; } for (j = 0; j < on; j++) unfillnode (&olist[j]); free (olist); }
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; }