#include "rc.h" /* globals */ Thread *shell = nil; int ntrap = 0; Io *errio; /* main execution */ void dotrap(void) { exit(1); } void bootup(Code *c, int off, Var *vars) { Thread *sh; alloc(sh); sh->code = c, c->i++; sh->ip = sh->code + off; sh->local = vars; sh->stack = nil; sh->link = shell, shell = sh; } int main(int argc, char *argv[]) { int i; Code *ip, sh[32]; ARGBEGIN { } ARGEND; errio = openfd(2); initkw(); ip = sh; memset(sh, 0, sizeof(sh)); /* * NOTE: first element of code is a reference count * bootup runs: * 1. *=argv[1:] * 2. . rcmain $* */ #if 0 ip++->i = 1; ip++->f = Xmark; ip++->f = Xword; ip++->s = "*"; ip++->f = Xassign; ip++->f = Xmark; ip++->f = Xmark; ip++->s = "*"; ip++->f = Xdol; ip++->s = "rcmain"; ip++->f = Xword; ip++->s = "."; ip++->f = Xsimple; ip++->f = Xexit; ip++->i = 0; bootup(sh, 1, nil); pushlist(); for (i = argc-1; i != 0; i--) pushword(argv[i]); for (;;) { shell->ip++->f(); if (ntrap) dotrap(); } #else bootup(sh, 1, nil); shell->cmd.io = openfd(0); while (parse()) ; #endif exit(0); }