summaryrefslogtreecommitdiff
path: root/sys/src/cmd
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2016-06-30 19:09:27 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2016-06-30 19:09:27 +0200
commit3ec84c5d7364c8ed4602561743bf35e3b399e53d (patch)
tree7a61b62553d8f938b223ca35d91b30fdab048fbb /sys/src/cmd
parentcabbe0a84c7aae53316347185a5bdf8095bac9c8 (diff)
rc: implement 9atoms ` split {command} syntax extension
Diffstat (limited to 'sys/src/cmd')
-rw-r--r--sys/src/cmd/rc/code.c12
-rw-r--r--sys/src/cmd/rc/exec.c2
-rw-r--r--sys/src/cmd/rc/havefork.c6
-rw-r--r--sys/src/cmd/rc/pcmd.c2
-rw-r--r--sys/src/cmd/rc/syn.y3
5 files changed, 19 insertions, 6 deletions
diff --git a/sys/src/cmd/rc/code.c b/sys/src/cmd/rc/code.c
index 9ec637988..927273275 100644
--- a/sys/src/cmd/rc/code.c
+++ b/sys/src/cmd/rc/code.c
@@ -125,9 +125,19 @@ outcode(tree *t, int eflag)
emitf(Xconc);
break;
case '`':
+ emitf(Xmark);
+ if(c0){
+ outcode(c0, 0);
+ emitf(Xglob);
+ } else {
+ emitf(Xmark);
+ emitf(Xword);
+ emits(estrdup("ifs"));
+ emitf(Xdol);
+ }
emitf(Xbackq);
p = emiti(0);
- outcode(c0, 0);
+ outcode(c1, 0);
emitf(Xexit);
stuffdot(p);
break;
diff --git a/sys/src/cmd/rc/exec.c b/sys/src/cmd/rc/exec.c
index dd194db87..10cb76935 100644
--- a/sys/src/cmd/rc/exec.c
+++ b/sys/src/cmd/rc/exec.c
@@ -208,7 +208,7 @@ main(int argc, char *argv[])
* Xappend(file)[fd] open file to append
* Xassign(name, val) assign val to name
* Xasync{... Xexit} make thread for {}, no wait
- * Xbackq{... Xreturn} make thread for {}, push stdout
+ * Xbackq(split){... Xreturn} make thread for {}, push stdout
* Xbang complement condition
* Xcase(pat, value){...} exec code on match, leave (value) on
* stack
diff --git a/sys/src/cmd/rc/havefork.c b/sys/src/cmd/rc/havefork.c
index 7f359423b..ad5a80298 100644
--- a/sys/src/cmd/rc/havefork.c
+++ b/sys/src/cmd/rc/havefork.c
@@ -85,10 +85,11 @@ Xbackq(void)
int pfd[2];
char *s, *wd, *ewd, *stop;
struct io *f;
- var *ifs = vlook("ifs");
word *v, *nextv;
- stop = ifs->val? ifs->val->word: "";
+ stop = "";
+ if(runq->argv && runq->argv->words)
+ stop = runq->argv->words->word;
if(pipe(pfd)<0){
Xerror("can't make pipe");
return;
@@ -135,6 +136,7 @@ Xbackq(void)
free(wd);
closeio(f);
Waitfor(pid, 0);
+ poplist(); /* ditch split in "stop" */
/* v points to reversed arglist -- reverse it onto argv */
while(v){
nextv = v->next;
diff --git a/sys/src/cmd/rc/pcmd.c b/sys/src/cmd/rc/pcmd.c
index 8caf60a28..889892370 100644
--- a/sys/src/cmd/rc/pcmd.c
+++ b/sys/src/cmd/rc/pcmd.c
@@ -32,7 +32,7 @@ pcmd(io *f, tree *t)
break;
case '^': pfmt(f, "%t^%t", c0, c1);
break;
- case '`': pfmt(f, "`%t", c0);
+ case '`': pfmt(f, "`%t%t", c0, c1);
break;
case ANDAND: pfmt(f, "%t && %t", c0, c1);
break;
diff --git a/sys/src/cmd/rc/syn.y b/sys/src/cmd/rc/syn.y
index c7de35313..051c9e88e 100644
--- a/sys/src/cmd/rc/syn.y
+++ b/sys/src/cmd/rc/syn.y
@@ -83,7 +83,8 @@ comword: '$' word {$$=tree1('$', $2);}
| '"' word {$$=tree1('"', $2);}
| COUNT word {$$=tree1(COUNT, $2);}
| WORD
-| '`' brace {$$=tree1('`', $2);}
+| '`' brace {$$=tree2('`', (struct tree*)0, $2);}
+| '`' word brace {$$=tree2('`', $2, $3);}
| '(' words ')' {$$=tree1(PAREN, $2);}
| REDIR brace {$$=mung1($1, $2); $$->type=PIPEFD;}
keyword: FOR|IN|WHILE|IF|NOT|TWIDDLE|BANG|SUBSHELL|SWITCH|FN