Blob


1 #include "mk.h"
3 static Shell *shells[] = {
4 &rcshell,
5 &shshell
6 };
8 Shell *shelldefault = &shshell;
10 Shell *shellt;
11 Word *shellcmd;
13 typedef struct Shellstack Shellstack;
14 struct Shellstack
15 {
16 Shell *t;
17 Word *w;
18 Shellstack *next;
19 };
21 Shellstack *shellstack;
23 char*
24 setshell(Word *w)
25 {
26 int i;
28 if(w->s == nil)
29 return "shell name not found on line";
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 }
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 }
51 void
52 pushshell(void)
53 {
54 Shellstack *s;
56 /* save */
57 s = Malloc(sizeof *s);
58 s->t = shellt;
59 s->w = shellcmd;
60 s->next = shellstack;
61 shellstack = s;
63 initshell(); /* reset to defaults */
64 }
66 void
67 popshell(void)
68 {
69 Shellstack *s;
71 if(shellstack == nil){
72 fprint(2, "internal shellstack error\n");
73 Exit();
74 }
76 s = shellstack;
77 shellstack = s->next;
78 shellt = s->t;
79 shellcmd = s->w;
80 setvar("MKSHELL", shellcmd);
81 free(s);
82 }