From 425ef692da7e74112f88f0b368f3286dba84f846 Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Thu, 18 Jun 2020 19:45:40 -0700 Subject: feat: working parser for rc shell language --- sys/cmd/rc/main.c | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 sys/cmd/rc/main.c (limited to 'sys/cmd/rc/main.c') diff --git a/sys/cmd/rc/main.c b/sys/cmd/rc/main.c new file mode 100644 index 0000000..baaf6bc --- /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); + parse(); + +#endif + exit(0); +} -- cgit v1.2.1