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/exec.c | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) (limited to 'sys/cmd/rc/exec.c') 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); -- cgit v1.2.1