9base

revived minimalist port of Plan 9 userland to Unix
git clone git://git.suckless.org/9base
Log | Files | Refs | README | LICENSE

shell.c (1093B)


      1 #include "mk.h"
      2 
      3 static Shell *shells[] = {
      4 	&rcshell,
      5 	&shshell
      6 };
      7 
      8 Shell *shelldefault = &shshell;
      9 
     10 Shell *shellt;
     11 Word *shellcmd;
     12 
     13 typedef struct Shellstack Shellstack;
     14 struct Shellstack
     15 {
     16 	Shell *t;
     17 	Word *w;
     18 	Shellstack *next;
     19 };
     20 
     21 Shellstack *shellstack;
     22 
     23 char*
     24 setshell(Word *w)
     25 {
     26 	int i;
     27 
     28 	if(w->s == nil)
     29 		return "shell name not found on line";
     30 
     31 	for(i=0; i<nelem(shells); i++)
     32 		if(shells[i]->matchname(w->s))
     33 			break;
     34 	if(i == nelem(shells))
     35 		return "cannot determine shell type";
     36 	shellt = shells[i];
     37 	shellcmd = w;
     38 	return nil;
     39 }
     40 
     41 void
     42 initshell(void)
     43 {
     44 	shellcmd = stow(shelldefault->name);
     45 	shellt = shelldefault;
     46 	setvar("MKSHELL", shellcmd);
     47 }
     48 
     49 void
     50 pushshell(void)
     51 {
     52 	Shellstack *s;
     53 
     54 	/* save */
     55 	s = Malloc(sizeof *s);
     56 	s->t = shellt;
     57 	s->w = shellcmd;
     58 	s->next = shellstack;
     59 	shellstack = s;
     60 
     61 	initshell();	/* reset to defaults */
     62 }
     63 
     64 void
     65 popshell(void)
     66 {
     67 	Shellstack *s;
     68 
     69 	if(shellstack == nil){
     70 		fprint(2, "internal shellstack error\n");
     71 		Exit();
     72 	}
     73 
     74 	s = shellstack;
     75 	shellstack = s->next;
     76 	shellt = s->t;
     77 	shellcmd = s->w;
     78 	setvar("MKSHELL", shellcmd);
     79 	free(s);
     80 }