From a93cc453bd8072e7d79ebe8f00614e1b99eb5852 Mon Sep 17 00:00:00 2001 From: Nicholas Date: Mon, 15 Nov 2021 18:54:20 -0800 Subject: Feat: added match keyword However, it is not tested in the slightest. --- src/cmd/rc/exec.c | 22 ++++++++++++++++++++++ src/cmd/rc/exec.h | 1 + src/cmd/rc/syntax.y | 3 ++- 3 files changed, 25 insertions(+), 1 deletion(-) (limited to 'src/cmd') diff --git a/src/cmd/rc/exec.c b/src/cmd/rc/exec.c index 62375df..2bdaebd 100644 --- a/src/cmd/rc/exec.c +++ b/src/cmd/rc/exec.c @@ -711,6 +711,28 @@ Xgoto(void) runner->code.i = runner->code.exe[runner->code.i].i; } +void +Xmatch(void) +{ + Word *p; + Word *s; + + for(p=runner->args->word; p; p=p->link){ + for(s=runner->args->link->word; s; s=s->link){ + if(match(s->str, p->str, 0)) + goto match; + } + } +nomatch: + runner->status = 0; + goto cleanup; +match: + runner->status = 1; +cleanup: + poplist(); + poplist(); +} + void Xcase(void) { diff --git a/src/cmd/rc/exec.h b/src/cmd/rc/exec.h index 78250f1..d14c0f6 100644 --- a/src/cmd/rc/exec.h +++ b/src/cmd/rc/exec.h @@ -8,6 +8,7 @@ */ void Xcase(void); +void Xmatch(void); void Xmark(void); // Xmark marks stack location for word void Xindex(void); // Xindex void Xlocal(void); // Xlocal(name,val) create local variable, assign value diff --git a/src/cmd/rc/syntax.y b/src/cmd/rc/syntax.y index 9750002..78a7ae2 100644 --- a/src/cmd/rc/syntax.y +++ b/src/cmd/rc/syntax.y @@ -93,6 +93,7 @@ cmd: | assign cmd %prec Tbang { $$ = hangchild1($1, $2, 2); } | Tbang cmd { $$ = maketree1(Tbang, $2); } | Tsubshell cmd { $$ = maketree1(Tsubshell, $2); } +| Ttwiddle word words { $$ = hangchild2($1, $2, 0, $3, 1); } | Tfor '(' word ')' nl cmd { $$ = hangchild3($1, $3, nil, $6); } | Tfor '(' word Tin words ')' nl cmd { $$ = hangchild3($1, $3, $5, $8); } | Twhile paren nl cmd { $$ = hangchild2($1, $2, 0, $4, 1); } @@ -127,7 +128,7 @@ nonkeyword: //| Tredir block { $$ = hangchild1($1, $2, 0); $$->type = Tpipefd; } keyword: - Tfor|Tin|Twhile|Tif|Telse|Tswitch|Tcase|Tbang|Tsubshell|Tfunc + Tfor|Tin|Twhile|Tif|Telse|Tswitch|Tcase|Tbang|Tsubshell|Ttwiddle|Tfunc words: /* empty */ { $$ = nil; } -- cgit v1.2.1