summaryrefslogtreecommitdiffstats
path: root/src/cmd/mk/shell.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2005-01-04 22:41:27 +0000
committerrsc <devnull@localhost>2005-01-04 22:41:27 +0000
commit9aa1c92f743a7bf2ac0b062b0c075dc610b3e335 (patch)
treee3be39332a1893959b3257aa797a65740fc1c1ec /src/cmd/mk/shell.c
parent02f38ca68ce484b2aad15fad4d59c4d43ef7eb1b (diff)
downloadplan9port-9aa1c92f743a7bf2ac0b062b0c075dc610b3e335.tar.gz
plan9port-9aa1c92f743a7bf2ac0b062b0c075dc610b3e335.zip
add new | syntax.
syntax will change.
Diffstat (limited to 'src/cmd/mk/shell.c')
-rw-r--r--src/cmd/mk/shell.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/cmd/mk/shell.c b/src/cmd/mk/shell.c
new file mode 100644
index 00000000..a4ac3f93
--- /dev/null
+++ b/src/cmd/mk/shell.c
@@ -0,0 +1,76 @@
+#include "mk.h"
+
+static Shell *shells[] = {
+ &shshell,
+ &rcshell
+};
+
+Shell *shellt;
+Word *shellcmd;
+
+typedef struct Shellstack Shellstack;
+struct Shellstack
+{
+ Shell *t;
+ Word *w;
+ Shellstack *next;
+};
+
+Shellstack *shellstack;
+
+char*
+setshell(Word *w)
+{
+ int i;
+
+ if(w->s == nil)
+ return "shell name not found on line";
+
+ for(i=0; i<nelem(shells); i++)
+ if(shells[i]->matchname(w->s))
+ break;
+ if(i == nelem(shells))
+ return "cannot determine shell type";
+ shellt = shells[i];
+ shellcmd = w;
+ return nil;
+}
+
+void
+initshell(void)
+{
+ shellcmd = stow(shells[0]->name);
+ shellt = shells[0];
+}
+
+void
+pushshell(void)
+{
+ Shellstack *s;
+
+ /* save */
+ s = Malloc(sizeof *s);
+ s->t = shellt;
+ s->w = shellcmd;
+ s->next = shellstack;
+ shellstack = s;
+
+ initshell(); /* reset to defaults */
+}
+
+void
+popshell(void)
+{
+ Shellstack *s;
+
+ if(shellstack == nil){
+ fprint(2, "internal shellstack error\n");
+ Exit();
+ }
+
+ s = shellstack;
+ shellstack = s->next;
+ shellt = s->t;
+ shellcmd = s->w;
+ free(s);
+}