#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; i<nelem(shells); i++) | |
if(shells[i]->matchname(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); | |
} |