From d1caabb4cd9f283f8e21e742c42e1ceb454133dc Mon Sep 17 00:00:00 2001 From: Nicholas Noll Date: Tue, 16 Nov 2021 15:21:55 -0800 Subject: Feat: added fd duplications --- src/cmd/rc/code.c | 13 +++++++++++++ src/cmd/rc/exec.c | 13 +++++++++++++ src/cmd/rc/exec.h | 2 ++ src/cmd/rc/lex.c | 35 +++++++++++++++++++---------------- 4 files changed, 47 insertions(+), 16 deletions(-) (limited to 'src/cmd') diff --git a/src/cmd/rc/code.c b/src/cmd/rc/code.c index 748c964..47266e4 100644 --- a/src/cmd/rc/code.c +++ b/src/cmd/rc/code.c @@ -349,6 +349,19 @@ walk(Tree *node) case Tpipefd: #endif + case Tdup: + if(node->redir.type == Rdupfd){ + emitf(Xdup); + emiti(node->redir.fd[0]); + emiti(node->redir.fd[1]); + }else{ + emitf(Xclose); + emiti(node->redir.fd[0]); + } + walk(node->child[1]); + emitf(Xpopredir); + break; + case Tredir: emitf(Xmark); walk(node->child[0]); diff --git a/src/cmd/rc/exec.c b/src/cmd/rc/exec.c index 28941a0..9ebb517 100644 --- a/src/cmd/rc/exec.c +++ b/src/cmd/rc/exec.c @@ -688,6 +688,19 @@ Xword(void) pushword(runner->code.exe[runner->code.i++].s); } +void +Xclose(void) +{ + pushredir(Rclose, runner->code.exe[runner->code.i++].i, 0); +} + +void +Xdup(void) +{ + pushredir(Rclose, runner->code.exe[runner->code.i].i, runner->code.exe[runner->code.i+1].i); + runner->code.i += 2; +} + void Xwrite(void) { diff --git a/src/cmd/rc/exec.h b/src/cmd/rc/exec.h index d7eee73..992af35 100644 --- a/src/cmd/rc/exec.h +++ b/src/cmd/rc/exec.h @@ -14,6 +14,8 @@ void Xwrite(void); void Xread(void); void Xrdwr(void); void Xappend(void); +void Xclose(void); +void Xdup(void); void Xdelhere(void); void Xcase(void); void Xfunc(void); diff --git a/src/cmd/rc/lex.c b/src/cmd/rc/lex.c index a22dc7d..b02a403 100644 --- a/src/cmd/rc/lex.c +++ b/src/cmd/rc/lex.c @@ -467,7 +467,7 @@ yylex(void) *w++='['; c = advance(); *w++ = c; - if(c<'0' || '9'type == Tpipe ? "pipe syntax" : "redirection syntax"); @@ -484,23 +484,26 @@ yylex(void) *w++ = '='; if(node->type==Tredir) node->type = Tdup; + c = advance(); + + if(c < '0' || '9' < c){ + if(node->type == Tpipe) + goto badredir; + node->redir.type = Rclose; + }else{ + node->redir.type = Rdupfd; + node->redir.fd[1] = node->redir.fd[0]; + node->redir.fd[0] = 0; + do{ + node->redir.fd[0] = 10*node->redir.fd[0]+(c-'0'); + *w++ = c; + c = advance(); + }while('0'<=c && c<='9'); + } } - if(c < '0' || '9' < c){ - if(node->type == Tpipe) - goto badredir; - node->redir.type = Rclose; - }else{ - node->redir.type = Rdupfd; - node->redir.fd[1] = node->redir.fd[0]; - node->redir.fd[0] = 0; - do{ - node->redir.fd[0] = 10*node->redir.fd[0]+(c-'0'); - *w++ = c; - c = advance(); - }while('0'<=c && c<='9'); - } - if(c != ']' || (node->type == Tdup && (node->redir.type = Rhere || node->redir.type == Rappend))) + if(c != ']' + || (node->type == Tdup && (node->redir.type == Rhere || node->redir.type == Rappend))) goto badredir; *w++ = ']'; } -- cgit v1.2.1