rc: implement 9atoms ` split {command} syntax extension
This commit is contained in:
parent
cabbe0a84c
commit
3ec84c5d73
6 changed files with 23 additions and 6 deletions
|
@ -233,6 +233,8 @@ The value is a single string containing the components of the named variable
|
|||
separated by spaces. A variable with zero elements yields the empty string.
|
||||
.HP
|
||||
.BI `{ command }
|
||||
.HP
|
||||
.BI ` "split " { command }
|
||||
.br
|
||||
.I rc
|
||||
executes the
|
||||
|
@ -245,6 +247,8 @@ If
|
|||
.B $ifs
|
||||
is not otherwise set, its value is
|
||||
.BR "'\ \et\en'" .
|
||||
In the second form of the command, split is used instead of
|
||||
.BR $ifs .
|
||||
.HP
|
||||
.BI <{ command }
|
||||
.HP
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue