diff options
author | Nicholas Noll <nbnoll@eml.cc> | 2021-10-09 10:30:50 -0700 |
---|---|---|
committer | Nicholas Noll <nbnoll@eml.cc> | 2021-10-09 10:30:50 -0700 |
commit | 6f2cac23a7e759c464ef52103fac929e1eeb6b10 (patch) | |
tree | d2412c7f82fc47bdb6dc47d82b685982e63cefe7 /sys/cmd/rc/word.c | |
parent | 80f92a7109c0bce2f4220ff1ce04ec8fd6fb9f8c (diff) |
feat(rc): added shell
Diffstat (limited to 'sys/cmd/rc/word.c')
-rw-r--r-- | sys/cmd/rc/word.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/sys/cmd/rc/word.c b/sys/cmd/rc/word.c new file mode 100644 index 0000000..84ff40c --- /dev/null +++ b/sys/cmd/rc/word.c @@ -0,0 +1,64 @@ +#include "rc.h" + +void +pushlist(void) +{ + List *ls; + + alloc(ls); + ls->words = nil; + ls->link = shell->stack, shell->stack = ls; +} + +void +freelist(Word *w) +{ + Word *it; + while (w) { + it = w->link; + efree(w->word); + efree(w); + w = it; + } +} + +void +poplist(void) +{ + List *ls = shell->stack; + if (!ls) + panicf("shell stack underflow"); + + freelist(ls->words); + shell->stack = ls->link; + efree(ls); +} + +int +count(Word *w) +{ + int n; + for (n=0; w; n++) + w = w->link; + return n; +} + +Word* +newword(char *w, Word *link) +{ + Word *wd; + + alloc(wd); + wd->word = strdup(w); + wd->link = link; + + return wd; +} + +void +pushword(char *w) +{ + if (shell->stack == nil) + panicf("no active stack"); + shell->stack->words = newword(w, shell->stack->words); +} |