URI:
       tshell.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tshell.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 }