diff options
author | Nicholas Noll <nbnoll@eml.cc> | 2021-10-09 10:30:50 -0700 |
---|---|---|
committer | Nicholas Noll <nbnoll@eml.cc> | 2021-10-09 10:30:50 -0700 |
commit | 6f2cac23a7e759c464ef52103fac929e1eeb6b10 (patch) | |
tree | d2412c7f82fc47bdb6dc47d82b685982e63cefe7 /sys/cmd/rc/main.c | |
parent | 80f92a7109c0bce2f4220ff1ce04ec8fd6fb9f8c (diff) |
feat(rc): added shell
Diffstat (limited to 'sys/cmd/rc/main.c')
-rw-r--r-- | sys/cmd/rc/main.c | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/sys/cmd/rc/main.c b/sys/cmd/rc/main.c new file mode 100644 index 0000000..b4a355e --- /dev/null +++ b/sys/cmd/rc/main.c @@ -0,0 +1,86 @@ +#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); +} |