aboutsummaryrefslogtreecommitdiff
path: root/sys/cmd/rc/rc.h
diff options
context:
space:
mode:
authorNicholas Noll <nbnoll@eml.cc>2020-06-20 11:30:56 -0700
committerNicholas Noll <nbnoll@eml.cc>2020-06-20 11:30:56 -0700
commit955516759cfed29122439938632964fed4f8a347 (patch)
tree6cc0c6300e2b3d5b4e0c08103ecd9c9e939bc1c8 /sys/cmd/rc/rc.h
parent91c673b37782d4cd90e5cf9a8e4491723e6c04bf (diff)
feat: file globbing in shell. added dynamic.mk
Diffstat (limited to 'sys/cmd/rc/rc.h')
-rw-r--r--sys/cmd/rc/rc.h75
1 files changed, 66 insertions, 9 deletions
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);