80 lines · 1.1 KB · C
RawDownload
#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;} voidinitshell(void){	shellcmd = stow(shelldefault->name);	shellt = shelldefault;	setvar("MKSHELL", shellcmd);} voidpushshell(void){	Shellstack *s; 	/* save */	s = Malloc(sizeof *s);	s->t = shellt;	s->w = shellcmd;	s->next = shellstack;	shellstack = s; 	initshell();	/* reset to defaults */} voidpopshell(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);}