rip out SHELL_ESCAPE define
[unix-history] / usr / src / usr.bin / window / var.c
index eca35ce..2837588 100644 (file)
@@ -1,6 +1,23 @@
+/*
+ * Copyright (c) 1983 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley.  The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)var.c       3.1 83/11/22";
-#endif
+static char sccsid[] = "@(#)var.c      3.10 (Berkeley) %G%";
+#endif /* not lint */
 
 #include "value.h"
 #include "var.h"
 
 #include "value.h"
 #include "var.h"
@@ -9,79 +26,113 @@ static      char *sccsid = "@(#)var.c       3.1 83/11/22";
 char *malloc();
 
 struct var *
 char *malloc();
 
 struct var *
-var_set(name, v)
+var_set1(head, name, v)
+struct var **head;
 char *name;
 struct value *v;
 {
 char *name;
 struct value *v;
 {
+       register struct var **p;
        register struct var *r;
        register struct var *r;
+       struct value val;
 
 
-       if ((r = var_lookup(name)) == 0) {
+       /* do this first, easier to recover */
+       val = *v;
+       if (val.v_type == V_STR && val.v_str != 0 &&
+           (val.v_str = str_cpy(val.v_str)) == 0)
+               return 0;
+       if (*(p = var_lookup1(head, name)) == 0) {
                r = (struct var *) malloc(sizeof (struct var));
                r = (struct var *) malloc(sizeof (struct var));
-               if (r == 0)
-                       return 0;
-               if ((r->r_name = str_cpy(name)) == 0) {
-                       free((char *) r);
+               if (r == 0) {
+                       val_free(val);
                        return 0;
                }
                        return 0;
                }
-               var_add(r);
-       }
-       r->r_val = *v;
-       if (v->v_type == V_STR) {
-               if ((r->r_val.v_str = str_cpy(v->v_str)) == 0) {
+               if ((r->r_name = str_cpy(name)) == 0) {
+                       val_free(val);
                        free((char *) r);
                        free((char *) r);
-                       str_free(r->r_name);
                        return 0;
                }
                        return 0;
                }
+               r->r_left = r->r_right = 0;
+               *p = r;
+       } else {
+               r = *p;
+               val_free(r->r_val);
        }
        }
+       r->r_val = val;
        return r;
 }
 
 struct var *
        return r;
 }
 
 struct var *
-var_lookup(name)
+var_setstr1(head, name, str)
+struct var **head;
 char *name;
 char *name;
+char *str;
 {
 {
-       register struct var *r;
-       register cmp;
+       struct value v;
 
 
-       for (r = var_head; r != 0;) {
-               if ((cmp = strcmp(name, r->r_name)) < 0)
-                       r = r->r_left;
-               else if (cmp > 0)
-                       r = r->r_right;
-               else
-                       break;
-       }
-       return r;
+       v.v_type = V_STR;
+       v.v_str = str;
+       return var_set1(head, name, &v);
 }
 
 }
 
-var_walk(func)
-int (*func)();
+struct var *
+var_setnum1(head, name, num)
+struct var **head;
+char *name;
+int num;
 {
 {
-       var_walk1(var_head, func);
+       struct value v;
+
+       v.v_type = V_NUM;
+       v.v_num = num;
+       return var_set1(head, name, &v);
 }
 
 }
 
-var_walk1(r, func)
-register struct var *r;
-int (*func)();
+var_unset1(head, name)
+struct var **head;
+char *name;
 {
 {
-       if (r == 0)
-               return;
-       var_walk1(r->r_left, func);
-       (*func)();
-       var_walk1(r->r_right, func);
+       register struct var **p;
+       register struct var *r;
+
+       if (*(p = var_lookup1(head, name)) == 0)
+               return -1;
+       r = *p;
+       *p = r->r_left;
+       while (*p != 0)
+               p = &(*p)->r_right;
+       *p = r->r_right;
+       val_free(r->r_val);
+       str_free(r->r_name);
+       free((char *) r);
+       return 0;
 }
 
 }
 
-var_add(r)
-register struct var *r;
+struct var **
+var_lookup1(p, name)
+register struct var **p;
+register char *name;
 {
 {
-       register struct var **p;
+       register cmp;
 
 
-       for (p = &var_head; *p != 0;) {
-               /* don't care about duplicate entries */
-               if (strcmp(r->r_name, (*p)->r_name) < 0)
+       while (*p != 0) {
+               if ((cmp = strcmp(name, (*p)->r_name)) < 0)
                        p = &(*p)->r_left;
                        p = &(*p)->r_left;
-               else
+               else if (cmp > 0)
                        p = &(*p)->r_right;
                        p = &(*p)->r_right;
+               else
+                       break;
        }
        }
-       *p = r;
+       return p;
+}
+
+var_walk1(r, func, a)
+register struct var *r;
+int (*func)();
+{
+       if (r == 0)
+               return 0;
+       if (var_walk1(r->r_left, func, a) < 0 || (*func)(a, r) < 0
+           || var_walk1(r->r_right, func, a) < 0)
+               return -1;
+       return 0;
 }
 }