int Iquote (int argc, lvar_t *argv) { Tobj so, ao, qo; char *s, *s1, *s2, *qs, *as; char buf2[50]; int n, bufi; if ( (Tgettype ((so = argv[0].o)) != T_STRING && !T_ISNUMBER (so)) || (argc > 1 && Tgettype ((qo = argv[1].o)) != T_STRING) || (argc > 2 && Tgettype ((ao = argv[2].o)) != T_STRING) ) return L_FAILURE; switch (Tgettype (so)) { case T_STRING: s = Tgetstring (so); break; case T_INTEGER: sprintf (buf2, "%ld", Tgetinteger (so)); s = &buf2[0]; break; case T_REAL: sprintf (buf2, "%f", Tgetreal (so)); s = &buf2[0]; break; } if (argc > 1) qs = Tgetstring (qo); else qs = "'\""; if (argc > 2) as = Tgetstring (ao); else as = NULL; bufi = 0; if ((n = strlen (s) + 3) * 2 > bufn) growbufp (n * 2); /* the *2 is max for chars to quote */ if (as) bufp[bufi++] = *as; for (s1 = s; *s1; s1++) { for (s2 = qs; *s2; s2++) if (*s1 == *s2) { bufp[bufi++] = '\\', bufp[bufi++] = *s1; break; } if (!*s2) { switch (*s1) { case '\n': bufp[bufi++] = '\\', bufp[bufi++] = 'n'; break; case '\r': bufp[bufi++] = '\\', bufp[bufi++] = 'r'; break; default: bufp[bufi++] = *s1; break; } } } if (as) bufp[bufi++] = *as; bufp[bufi] = '\000'; rtno = Tstring (bufp); return L_SUCCESS; }
int Itypeof (int argc, lvar_t *argv) { if (T_ISTABLE (argv[0].o)) rtno = Tstring ("table"); else if (T_ISSTRING (argv[0].o)) rtno = Tstring ("string"); else if (T_ISNUMBER (argv[0].o)) rtno = Tstring ("number"); return L_SUCCESS; }
int Iremove (int argc, lvar_t *argv) { Tobj tblo, keyo; if (argc == 2) tblo = argv[1].o, keyo = argv[0].o; else tblo = root, keyo = argv[0].o; if (T_ISTABLE (tblo) && (T_ISNUMBER (keyo) || T_ISSTRING (keyo))) Tdelo (tblo, keyo); return L_SUCCESS; }
int Iwritegraph (int argc, lvar_t *argv) { int ioi; if ( !T_ISNUMBER (argv[0].o) || !T_ISTABLE (argv[1].o) || !T_ISINTEGER (argv[2].o) ) return L_FAILURE; if ((ioi = Tgetnumber (argv[0].o)) < 0 || ioi >= ion) return L_FAILURE; D2Lwritegraph (ioi, argv[1].o, Tgetinteger (argv[2].o)); return L_SUCCESS; }
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; }