static void setvar(tnk_t tnk, Tobj vo) { switch (tnk.type) { case TNK_LI: Mresetmark(lvarp[flvari + tnk.u.li].m, (lvarp[flvari + tnk.u.li].o = vo)); break; case TNK_O: Tinso(tnk.u.tnko.to, tnk.u.tnko.ko, vo); break; default: switch (tnk.u.tnks.kt) { case C_STRING: Tinss(tnk.u.tnks.to, TCgetstring(tnk.u.tnks.co, tnk.u.tnks.vi), vo); break; case C_INTEGER: Tinsi(tnk.u.tnks.to, TCgetinteger(tnk.u.tnks.co, tnk.u.tnks.vi), vo); break; case C_REAL: Tinsr(tnk.u.tnks.to, TCgetreal(tnk.u.tnks.co, tnk.u.tnks.vi), vo); break; } break; } }
static int getvar(Tobj co, int ci, tnk_t * tnkp) { Tobj cvo, cko, cto; Ctype_t ct, vt; long m; int vi, ovi, nn, ni; if ((ct = TCgettype(co, ci)) == C_LVAR) { nn = (int) TCgetinteger(co, (ni = TCgetnext(co, TCgetfp(co, ci)))); cvo = cto = lvarp[flvari + nn].o; vi = TCgetnext(co, ni); if (vi != C_NULL && (!cvo || Tgettype(cvo) != T_TABLE)) Mresetmark(lvarp[flvari + nn].m, (lvarp[flvari + nn].o = cvo = cto = Ttable(0))); } else if (ct == C_GVAR) { /* else it's a global variable */ cvo = root; vi = TCgetfp(co, ci); } else { return -1; } ovi = -1; while (vi != C_NULL) { cto = cvo; if ((vt = TCgettype(co, vi)) == C_STRING) { cvo = Tfinds(cto, TCgetstring(co, vi)); } else if (vt == C_INTEGER) { cvo = Tfindi(cto, TCgetinteger(co, vi)); } else if (vt == C_REAL) { cvo = Tfindr(cto, TCgetreal(co, vi)); } else { if (!(cko = eeval(co, vi)) || !(T_ISSTRING(cko) || T_ISNUMBER(cko))) return -1; cvo = Tfindo(cto, cko); } ovi = vi, vi = TCgetnext(co, vi); if (vi != C_NULL && (!cvo || Tgettype(cvo) != T_TABLE)) { if (vt == C_STRING) Tinss(cto, TCgetstring(co, ovi), (cvo = Ttable(0))); else if (vt == C_INTEGER) Tinsi(cto, TCgetinteger(co, ovi), (cvo = Ttable(0))); else if (vt == C_REAL) Tinsr(cto, TCgetreal(co, ovi), (cvo = Ttable(0))); else m = Mpushmark(cko), Tinso(cto, cko, (cvo = Ttable(0))), Mpopmark(m); } } if (ct == C_LVAR && ovi == -1) { tnkp->type = TNK_LI; tnkp->u.li = nn; } else { switch (vt) { case C_STRING: case C_INTEGER: case C_REAL: tnkp->type = TNK_S; tnkp->u.tnks.kt = vt; tnkp->u.tnks.to = cto; tnkp->u.tnks.co = co; tnkp->u.tnks.vi = ovi; break; default: tnkp->type = TNK_O; tnkp->u.tnko.to = cto; tnkp->u.tnko.ko = cko; break; } } return 0; }
int Isplit (int argc, lvar_t *argv) { Tobj so, fo; char *sp, *sp2, *s; char fc, tc, qmode; long rtnm, rtni; int bufi, qflag; if ( Tgettype ((so = argv[0].o)) != T_STRING || Tgettype ((fo = argv[1].o)) != T_STRING ) return L_FAILURE; qflag = (argc == 3) ? FALSE : TRUE; sp = Tgetstring (so); s = Tgetstring (fo); if (s[0] == '\\' && s[1] == 'n') fc = '\n'; else fc = s[0]; rtno = Ttable (4); rtnm = Mpushmark (rtno); rtni = 0; if (s[0] == 0) { for (sp2 = sp; *sp2; sp2++) { tc = *(sp2 + 1), *(sp2 + 1) = '\000'; Tinsi (rtno, rtni++, Tstring (sp2)); *(sp2 + 1) = tc; } } else if (qflag && (fc == ' ' || fc == ' ')) { while (*sp == fc) sp++; while (*sp) { bufi = 0; qmode = 0; for (sp2 = sp; *sp2; sp2++) { if (bufi == bufn) growbufp (bufn + BUFINCR); if (*sp2 == '"' || *sp2 == '\'') { if (qmode) { if (qmode == *sp2) qmode = 0; else bufp[bufi++] = *sp2; } else qmode = *sp2; } else if (*sp2 == fc && !qmode) break; else bufp[bufi++] = *sp2; } if (bufi == bufn) growbufp (bufn + BUFINCR); bufp[bufi] = 0; Tinsi (rtno, rtni++, Tstring (bufp)); while (*sp2 == fc) sp2++; sp = sp2; } } else { while (*sp) { for (sp2 = sp; *sp2 && *sp2 != fc; sp2++) ; tc = *sp2, *sp2 = '\000'; Tinsi (rtno, rtni++, Tstring (sp)); *sp2 = tc; if (*sp2) { sp2++; if (!*sp2) Tinsi (rtno, rtni++, Tstring ("")); } sp = sp2; } } Mpopmark (rtnm); return L_SUCCESS; }