/* LEFTY builtin */ int C2Lreadcsmessage (int argc, lvar_t *argv) { #if 0 /* not finished yet */ io_t *p; int ioi, n; Msg_call_t msg; Tobj to; int tm; ioi = Tgetnumber (argv[0].o); if (ioi < 0 || ioi >= ion) return L_FAILURE; p = &iop[ioi]; fseek (p->ofp, 0L, 1); if ((n = msgrecv (fileno (p->ifp), &msg)) <= 0) return L_FAILURE; to = Ttable (6); tm = Mpushmark (to); Tinss (to, "id", Tinteger (MSG_CHANNEL_USR (msg.channel))); Tinss (to, "pid", Tinteger (MSG_CHANNEL_SYS (msg.channel))); rtno = to; Mpopmark (tm); #endif return L_SUCCESS; }
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; } }
/* shortcut: this function executes a piece of code that corresponds to <internal func name> = function () internal "<internal func name>"; */ Tobj Efunction(Tobj co, char *ifnam) { Tobj v1o; int fi; fi = TCgetnext(co, TCgetfp(co, TCgetfp(co, 0))); v1o = Tcode(TCgetaddr(co, fi), fi, (int) TCgetinteger(co, TCgetfp(co, fi))); Tinss(root, ifnam, v1o); return v1o; }
void Einit(void) { root = Ttable(100); rootm = Mpushmark(root); Tinss(root, "null", (null = Ttable(2))); rtno = NULL; pljbufp1 = pljbufp2 = NULL, pljtype = 0; eljbufp = NULL; lvarp = Marrayalloc((long) LVARINCR * LVARSIZE); lvarn = LVARINCR; llvari = 0; flvari = 0; sinfop = Marrayalloc((long) SINFOINCR * SINFOSIZE); sinfon = SINFOINCR; sinfoi = 0; Erun = FALSE; running = 0; Eoktorun = FALSE; }
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; }