BSD 4 release
[unix-history] / usr / src / cmd / csh / sh.set.c
index b849c95..9228f54 100644 (file)
@@ -1,4 +1,5 @@
-/* Copyright (c) 1979 Regents of the University of California */
+static char *sccsid = "@(#)sh.set.c 4.1 10/9/80";
+
 #include "sh.h"
 
 /*
 #include "sh.h"
 
 /*
@@ -10,6 +11,7 @@ doset(v)
 {
        register char *p;
        char *vp, op;
 {
        register char *p;
        char *vp, op;
+       char **vecp;
        bool hadsub;
        int subscr;
 
        bool hadsub;
        int subscr;
 
@@ -21,7 +23,7 @@ doset(v)
        }
        do {
                hadsub = 0;
        }
        do {
                hadsub = 0;
-               for (vp = p; letter(*p); p++)
+               for (vp = p; alnum(*p); p++)
                        continue;
                if (vp == p)
                        goto setsyn;
                        continue;
                if (vp == p)
                        goto setsyn;
@@ -53,14 +55,30 @@ setsyn:
                                        break;
                                e++;
                        }
                                        break;
                                e++;
                        }
-                       p = *e, *e = 0, set1(vp, saveblk(v), &shvhed), *e = p;
+                       p = *e;
+                       *e = 0;
+                       vecp = saveblk(v);
+                       set1(vp, vecp, &shvhed);
+                       *e = p;
                        v = e + 1;
                } else if (hadsub)
                        asx(vp, subscr, savestr(p));
                else
                        set(vp, savestr(p));
                        v = e + 1;
                } else if (hadsub)
                        asx(vp, subscr, savestr(p));
                else
                        set(vp, savestr(p));
-               if (strcmp(vp, "path") == 0)
+               if (eq(vp, "path")) {
+                       exportpath(adrof("path")->vec);
                        dohash();
                        dohash();
+               } else if (eq(vp, "histchars")) {
+                       register char *p = value("histchars");
+
+                       HIST = *p++;
+                       HISTSUB = *p;
+               } else if (eq(vp, "user"))
+                       setenv("USER", value(vp));
+               else if (eq(vp, "term"))
+                       setenv("TERM", value(vp));
+               else if (eq(vp, "home"))
+                       setenv("HOME", value(vp));
        } while (p = *v++);
 }
 
        } while (p = *v++);
 }
 
@@ -248,10 +266,12 @@ char *
 savestr(s)
        register char *s;
 {
 savestr(s)
        register char *s;
 {
+       register char *n;
 
        if (s == 0)
                s = "";
 
        if (s == 0)
                s = "";
-       return (strcpy(calloc(1, strlen(s) + 1), s));
+       strcpy(n = calloc(1, strlen(s) + 1), s);
+       return (n);
 }
 
 static char *putp;
 }
 
 static char *putp;
@@ -439,6 +459,10 @@ unset(v)
 {
 
        unset1(v, &shvhed);
 {
 
        unset1(v, &shvhed);
+       if (adrof("histchars") == 0) {
+               HIST = '!';
+               HISTSUB = '^';
+       }
 }
 
 unset1(v, head)
 }
 
 unset1(v, head)
@@ -454,10 +478,8 @@ unset1(v, head)
                cnt = 0;
                while (vp = madrof(var, head))
                        unsetv1(vp->name, head), cnt++;
                cnt = 0;
                while (vp = madrof(var, head))
                        unsetv1(vp->name, head), cnt++;
-/*
                if (cnt == 0)
                if (cnt == 0)
-                       setname(var), bferr("No match");
-*/
+                       setname(var);
        }
 }
 
        }
 }
 
@@ -481,7 +503,7 @@ unsetv1(var, head)
        shprev->link = vp->link;
        blkfree(vp->vec);
        xfree(vp->name);
        shprev->link = vp->link;
        blkfree(vp->vec);
        xfree(vp->name);
-       xfree(vp);
+       xfree((char *)vp);
 }
 
 setNS(cp)
 }
 
 setNS(cp)
@@ -511,10 +533,23 @@ shift(v)
        lshift(argv->vec, 1);
 }
 
        lshift(argv->vec, 1);
 }
 
-deletev(cp)
-       register char *cp;
+exportpath(val)
+char **val;
 {
 {
-
-       if (adrof(cp))
-               unsetv(cp);
+       char exppath[BUFSIZ];
+       register char *dir;
+
+       exppath[0] = 0;
+       if (val)
+               while (*val) {
+                       if (strlen(*val) + strlen(exppath) + 2 > BUFSIZ) {
+                               printf("Warning: ridiculously long PATH truncated\n");
+                               break;
+                       }
+                       strcat(exppath, *val++);
+                       if (*val == 0 || eq(*val, ")"))
+                               break;
+                       strcat(exppath, ":");
+               }
+       setenv("PATH", exppath);
 }
 }