From 5baa63ab502c98f6f62368302d92b6b90f9fcd26 Mon Sep 17 00:00:00 2001 From: Nicholas Date: Mon, 15 Nov 2021 18:43:39 -0800 Subject: Feat: globbing Introduced shell globbing --- src/cmd/rc/exec.c | 47 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 10 deletions(-) (limited to 'src/cmd/rc/exec.c') diff --git a/src/cmd/rc/exec.c b/src/cmd/rc/exec.c index a551d52..62375df 100644 --- a/src/cmd/rc/exec.c +++ b/src/cmd/rc/exec.c @@ -103,8 +103,7 @@ freelist(Word *w) } -static -void +static void pushlist(void) { List *stack = emalloc(sizeof(*stack)); @@ -115,8 +114,7 @@ pushlist(void) runner->args = stack; } -static -void +static void poplist(void) { List *stack = runner->args; @@ -128,6 +126,24 @@ poplist(void) efree(stack); } +static void +globargs(void) +{ + Word *arg; + + globmatch = nil; + globlist(runner->args->word); + poplist(); + pushlist(); + if(globmatch){ + for(arg=globmatch; arg->link; arg = arg->link) + ; + arg->link= runner->args->word; + runner->args->word = globmatch; + } +} + + /* system interop */ static Word* @@ -792,7 +808,7 @@ Xdollar(void) return; } s = runner->args->word->str; - // deglob(s); + deglob(s); n = 0; for(t = s;'0'<=*t && *t<='9';t++) @@ -846,7 +862,7 @@ getindex(Word *array, int len, Word *index, Word *tail) tail = getindex(array, len, index->link, tail); s = index->str; - //deglob(s) + deglob(s); m = 0, n = 0; while('0' <= *s && *s <= '9') @@ -881,7 +897,7 @@ Xindex(void) return; } s = runner->args->word->str; - //deglob(s) + deglob(s); val = var(s)->val; poplist(); @@ -934,6 +950,12 @@ Xjoin(void) efree(s); } +void +Xglob(void) +{ + globargs(); +} + void Xassign(void) { @@ -943,11 +965,11 @@ Xassign(void) Xerror("variable name not singleton!\n"); return; } - //deglob(runq->argv->words->word); + deglob(runner->args->word->str); v = var(runner->args->word->str); poplist(); - //globlist(); + globargs(); freewords(v->val); v->val = runner->args->word; v->new = 1; @@ -991,7 +1013,7 @@ Xlocal(void) Xerror("variable name must be singleton\n"); return; } - //deglob(shell->args->word->str); + deglob(runner->args->word->str); runner->local = makevar(strdup(runner->args->word->str), runner->local); runner->local->val = copywords(runner->args->link->word, nil); @@ -1141,6 +1163,7 @@ Xbasic(void) int pid, status; struct Builtin *b; + globargs(); arg = runner->args->word; if(!arg){ Xerror("empty argument list\n"); @@ -1189,6 +1212,8 @@ Xcount(void) } str = runner->args->word->str; + deglob(str); + arg = var(str)->val; poplist(); @@ -1209,6 +1234,8 @@ Xflat(void) } str = runner->args->word->str; + deglob(str); + arg = var(str)->val; poplist(); -- cgit v1.2.1