diff options
author | Nicholas <nbnoll@eml.cc> | 2021-11-15 18:43:39 -0800 |
---|---|---|
committer | Nicholas <nbnoll@eml.cc> | 2021-11-15 18:43:39 -0800 |
commit | 5baa63ab502c98f6f62368302d92b6b90f9fcd26 (patch) | |
tree | bbfa323a387b94f8eef21c90a27e26f1d7d14728 /src/cmd/rc/exec.c | |
parent | d2c554ee0deeb64a805549d230ff8467ff6601f4 (diff) |
Feat: globbing
Introduced shell globbing
Diffstat (limited to 'src/cmd/rc/exec.c')
-rw-r--r-- | src/cmd/rc/exec.c | 47 |
1 files changed, 37 insertions, 10 deletions
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(); @@ -935,6 +951,12 @@ Xjoin(void) } void +Xglob(void) +{ + globargs(); +} + +void Xassign(void) { Var *v; @@ -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(); |