From 955516759cfed29122439938632964fed4f8a347 Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Sat, 20 Jun 2020 11:30:56 -0700 Subject: feat: file globbing in shell. added dynamic.mk --- sys/cmd/rc/rc.h | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 66 insertions(+), 9 deletions(-) (limited to 'sys/cmd/rc/rc.h') diff --git a/sys/cmd/rc/rc.h b/sys/cmd/rc/rc.h index 7146aa0..f32a737 100644 --- a/sys/cmd/rc/rc.h +++ b/sys/cmd/rc/rc.h @@ -43,6 +43,13 @@ enum Rrdwr = 7, }; +enum +{ + Fopen = 1, + Fdup = 2, + Fclose = 3, +}; + // ----------------------------------------------------------------------- // main types @@ -50,6 +57,7 @@ typedef union Code Code; typedef struct Word Word; typedef struct List List; typedef struct Var Var; +typedef struct Redir Redir; typedef struct Tree Tree; typedef struct Builtin Builtin; typedef struct Thread Thread; @@ -74,12 +82,26 @@ struct List List *link; }; +struct Redir +{ + uchar type; + short from, to; + Redir *link; +}; + struct Var { - string name; + string name; Word *val; - Code *func; - Var *link; + struct { + Code *func, *ip; + uint funcnew : 1; + }; + struct { + uint new : 1; + void (*update)(Var*); + }; + Var *link; }; struct Tree @@ -107,7 +129,9 @@ struct Thread { Code *code, *ip; List *stack; + Redir *redir, *root; Var *local; + uchar interactive : 1; struct { uchar eof : 1; int line; @@ -145,16 +169,48 @@ extern Var *globals[1021]; /* for now must be prime */ * notation: * (var1, var2, ...) : items from stack * [var1, var2, ...] : items from code stream - * -> moves value + * {var1, var2, ...} : jump block from code stream + * -> moves value (stack) [code stream] */ -extern void Xmark(void); /* Xmark: delimit stack with new list */ -extern void Xword(void); /* Xword[val] -> (val) */ +extern void Xappend(void); /* Xappend(file)[fd]: open file to append */ extern void Xassign(void); /* Xassign(name, val): assign name to val */ +extern void Xasync(void); /* Xasync(cmd): run command asynchronously */ +extern void Xcat(void); /* Xcat(list1, list2): concatenate strings */ +extern void Xclose(void); /* Xclose[fd]: close file descriptor */ +extern void Xcmdsub(void); /* Xcmdsub(cmd): use output of command as input to other */ +extern void Xcount(void); /* Xcount(name) -> (number): count items in list*/ extern void Xdol(void); /* Xdol(name): get variable value */ -extern void Xsimple(void); /* Xsimple(args): run command */ +extern void Xdup(void); /* Xdup[i, j]: duplicate file descriptor */ extern void Xexit(void); /* Xexit: exit with status */ -extern void Xerror(char *s); /* Xerror: report an error */ -extern void Xparse(void); +extern void Xfalse(void); /* Xfalse{...}: run only if $status=1 */ +extern void Xflatten(void); /* Xflatten(list) -> (string): flatten list */ +extern void Xfor(void); /* Xfor(list): flatten list */ +extern void Xfunc(void); /* Xfunc(name){... Xreturn}: define function */ +extern void Xglob(void); /* Xglob(list): globs value */ +extern void Xif(void); /* Xif: execute if $status */ +extern void Xjump(void); /* Xjump[addr]: jump to address */ +extern void Xkill(void); /* Xkill kill thread */ +extern void Xlocal(void); /* Xlocal(name, val): define local variable */ +extern void Xmark(void); /* Xmark: delimit stack with new list */ +extern void Xmatch(void); /* Xmatch(pat, str): sets status with result */ +extern void Xnegate(void); /* Xnegate: negate condition */ +extern void Xpipe(void); /* Xpipe[i j]{... Xkill}{... Xkill}: construct a pipe between 2 threads*/ +extern void Xpipefd(void); /* Xpipe[type]{... Xkill}: connect {} to a pipe */ +extern void Xpipewait(void); /* Xpipewait: wait on a pipe */ +extern void Xpop(void); /* Xpop(value): pops value from stack */ +extern void Xpopredir(void); /* Xpopredir(value): pops redir from redir stack */ +extern void Xrdwr(void); /* Xrdwr(file)[fd]: open file for reads/writes */ +extern void Xread(void); /* Xread(file)[fd]: open file for reads */ +extern void Xsub(void); /* Xsub(list, index): subscript list */ +extern void Xsimple(void); /* Xsimple(args): run command */ +extern void Xsubshell(void); /* Xsubshell(args): run command in a subshell */ +extern void Xtrue(void); /* Xtrue{...}: run only if $status=0 */ +extern void Xunfunc(void); /* Xunfunc(name) undefine function */ +extern void Xunlocal(void); /* Xunlocal(name) undefine local */ +extern void Xword(void); /* Xword[val] -> (val) */ +extern void Xwrite(void); /* Xwrite(file)[fd]: open file to write */ + +extern void Xerror(char *s); /* Xerror report an error */ // ----------------------------------------------------------------------- // shell functions @@ -228,6 +284,7 @@ Tree *wordnode(char *w); Var *newvar(char *name, Var *link); Var *gvlookup(char *name); Var *vlookup(char *name); +void setvar(char *name, Word *val); int kwlookup(char *name); void initkw(void); -- cgit v1.2.1