shell.c - 9base - revived minimalist port of Plan 9 userland to Unix
HTML git clone git://git.suckless.org/9base
DIR Log
DIR Files
DIR Refs
DIR README
DIR 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 }