#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); }