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 }