#include "mk.h" static Shell *shells[] = { &rcshell, &shshell }; Shell *shelldefault = &shshell; Shell *shellt; Word *shellcmd; typedef struct Shellstack Shellstack; struct Shellstack { Shell *t; Word *w; Shellstack *next; }; Shellstack *shellstack; char* setshell(Word *w) { int i; if(w->s == nil) return "shell name not found on line"; for(i=0; imatchname(w->s)) break; if(i == nelem(shells)) return "cannot determine shell type"; shellt = shells[i]; shellcmd = w; return nil; } void initshell(void) { shellcmd = stow(shelldefault->name); shellt = shelldefault; setvar("MKSHELL", shellcmd); } void pushshell(void) { Shellstack *s; /* save */ s = Malloc(sizeof *s); s->t = shellt; s->w = shellcmd; s->next = shellstack; shellstack = s; initshell(); /* reset to defaults */ } void popshell(void) { Shellstack *s; if(shellstack == nil){ fprint(2, "internal shellstack error\n"); Exit(); } s = shellstack; shellstack = s->next; shellt = s->t; shellcmd = s->w; setvar("MKSHELL", shellcmd); free(s); }