diff options
author | Nicholas Noll <nbnoll@eml.cc> | 2021-10-21 11:43:13 -0700 |
---|---|---|
committer | Nicholas Noll <nbnoll@eml.cc> | 2021-10-21 11:43:13 -0700 |
commit | faaf40e55e002212c0c28f7845dfa2322eb7ad05 (patch) | |
tree | 9c61e6125d054439019c3c037e46353597018870 /sys/cmd/rc/exec.c | |
parent | 5c20d687c495f2cb3f3a390d04854dcceb2ef74e (diff) |
feat(rc): string concatenation works
Diffstat (limited to 'sys/cmd/rc/exec.c')
-rw-r--r-- | sys/cmd/rc/exec.c | 49 |
1 files changed, 46 insertions, 3 deletions
diff --git a/sys/cmd/rc/exec.c b/sys/cmd/rc/exec.c index 6d0c0a9..ac0dc08 100644 --- a/sys/cmd/rc/exec.c +++ b/sys/cmd/rc/exec.c @@ -578,6 +578,52 @@ Xword(void) pushword(runner->code.exe[runner->code.i++].s); } +static +Word* +catlist(Word *l, Word *r, Word *tail) +{ + Word *w; + char *buf; + + if(l->link || r->link) + tail = catlist( (!l->link)?l:l->link, (!r->link)?r:r->link, tail); + + buf = emalloc(strlen(l->str)+strlen(r->str)+1); + strcpy(buf, l->str); + strcat(buf, r->str); + + w = makeword(buf, tail); + efree(buf); + + return w; +} + +void +Xconcatenate(void) +{ + int rn, ln; + Word *l = runner->args->word; + Word *r = runner->args->link->word; + Word *w = runner->args->link->link->word; + + ln = count(l), rn = count(r); + if(ln != 0 || rn != 0) { + if(ln == 0 || rn == 0){ + Xerror("null list in concatenation\n"); + return; + } + if(ln != 1 && rn != 1 && ln != rn) { + Xerror("mismatched list lengths in concatenation\n"); + return; + } + w = catlist(l, r, w); + } + + poplist(); + poplist(); + runner->args->word = w; +} + void Xdollar(void) { @@ -638,7 +684,6 @@ Xassign(void) poplist(); } - void Xreadcmd(void) { @@ -982,8 +1027,6 @@ Xreturn(void) exit(0); } - - void Xexit(void) { |