plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

shell.c (1155B)


      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 	if(getenv("FORCERCFORMK") != nil)
     45 		shelldefault = &rcshell;
     46 	shellcmd = stow(shelldefault->name);
     47 	shellt = shelldefault;
     48 	setvar("MKSHELL", shellcmd);
     49 }
     50 
     51 void
     52 pushshell(void)
     53 {
     54 	Shellstack *s;
     55 
     56 	/* save */
     57 	s = Malloc(sizeof *s);
     58 	s->t = shellt;
     59 	s->w = shellcmd;
     60 	s->next = shellstack;
     61 	shellstack = s;
     62 
     63 	initshell();	/* reset to defaults */
     64 }
     65 
     66 void
     67 popshell(void)
     68 {
     69 	Shellstack *s;
     70 
     71 	if(shellstack == nil){
     72 		fprint(2, "internal shellstack error\n");
     73 		Exit();
     74 	}
     75 
     76 	s = shellstack;
     77 	shellstack = s->next;
     78 	shellt = s->t;
     79 	shellcmd = s->w;
     80 	setvar("MKSHELL", shellcmd);
     81 	free(s);
     82 }