aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/rc/exec.c
diff options
context:
space:
mode:
authorNicholas <nbnoll@eml.cc>2021-11-15 18:43:39 -0800
committerNicholas <nbnoll@eml.cc>2021-11-15 18:43:39 -0800
commit5baa63ab502c98f6f62368302d92b6b90f9fcd26 (patch)
treebbfa323a387b94f8eef21c90a27e26f1d7d14728 /src/cmd/rc/exec.c
parentd2c554ee0deeb64a805549d230ff8467ff6601f4 (diff)
Feat: globbing
Introduced shell globbing
Diffstat (limited to 'src/cmd/rc/exec.c')
-rw-r--r--src/cmd/rc/exec.c47
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();