aboutsummaryrefslogtreecommitdiff
path: root/sys/cmd/rc/exec.c
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/exec.c
parent91c673b37782d4cd90e5cf9a8e4491723e6c04bf (diff)
feat: file globbing in shell. added dynamic.mk
Diffstat (limited to 'sys/cmd/rc/exec.c')
-rw-r--r--sys/cmd/rc/exec.c120
1 files changed, 120 insertions, 0 deletions
diff --git a/sys/cmd/rc/exec.c b/sys/cmd/rc/exec.c
index 2879678..d4822a7 100644
--- a/sys/cmd/rc/exec.c
+++ b/sys/cmd/rc/exec.c
@@ -1,9 +1,93 @@
#include "rc.h"
+#define W0 shell->stack->words
+// -----------------------------------------------------------------------
+// helper functions
+
+static
+void
+setstatus(char *s)
+{
+ setvar("status", newword(s, nil));
+}
+
+static
+void
+pushredir(int type, int from, int to)
+{
+ Redir *r;
+
+ alloc(r);
+ r->type = type;
+ r->from = from;
+ r->to = to;
+ r->link = shell->redir, shell->redir = r;
+}
+
+// -----------------------------------------------------------------------
+// interpreter functions
+
void
Xerror(char *s)
{
+ if(!strcmp(argv0, "rc")||!strcmp(argv0, "/bin/rc"))
+ pfmt(errio, "rc: %s: %r\n", s);
+ else
+ pfmt(errio, "rc (%s): %s: %r\n", argv0, s);
+ flush(&errio);
+ setstatus("error");
+ while(!shell->interactive)
+ Xkill();
+}
+
+void
+Xappend(void)
+{
+ int fd;
+ char *path;
+
+ switch(count(W0)) {
+ default:
+ Xerror(">> requires a singleton list");
+ return;
+ case 0:
+ Xerror(">> requires one file");
+ return;
+ case 1:
+ ;
+ }
+
+ path = shell->stack->words->word;
+ if ((fd=open(path, 1))< 0 && (fd=creat(path, 0666L))<0) {
+ pfmt(errio, "%s: ", path);
+ Xerror("can't open");
+ return;
+ }
+ lseek(fd, 0L, 2);
+ pushredir(Fopen, fd, shell->ip++->i);
+ poplist();
+}
+
+void
+Xassign(void)
+{
+ Var *v;
+ if(count(W0)!=1) {
+ Xerror("variable name not singleton");
+ return;
+ }
+ unglob(W0->word);
+ v = vlookup(W0->word);
+ poplist();
+ globlist();
+ freelist(v->val);
+
+ v->val = W0;
+ if(v->update)
+ v->update(v);
+ W0 = nil;
+ poplist();
}
void
@@ -17,3 +101,39 @@ Xword(void)
{
pushword(shell->ip++->s);
}
+
+void Xasync(void);
+void Xcat(void);
+void Xclose(void);
+void Xcmdsub(void);
+void Xcount(void);
+void Xdol(void);
+void Xdup(void);
+void Xexit(void);
+void Xfalse(void);
+void Xflatten(void);
+void Xfor(void);
+void Xfunc(void);
+void Xglob(void);
+void Xif(void);
+void Xjump(void);
+void Xkill(void);
+void Xlocal(void);
+void Xmark(void);
+void Xmatch(void);
+void Xnegate(void);
+void Xpipe(void);
+void Xpipefd(void);
+void Xpipewait(void);
+void Xpop(void);
+void Xpopredir(void);
+void Xrdwr(void);
+void Xread(void);
+void Xsub(void);
+void Xsimple(void);
+void Xsubshell(void);
+void Xtrue(void);
+void Xunfunc(void);
+void Xunlocal(void);
+void Xword(void);
+void Xwrite(void);