date and time created 83/11/22 12:48:04 by edward
authorEdward Wang <edward@ucbvax.Berkeley.EDU>
Wed, 23 Nov 1983 04:48:04 +0000 (20:48 -0800)
committerEdward Wang <edward@ucbvax.Berkeley.EDU>
Wed, 23 Nov 1983 04:48:04 +0000 (20:48 -0800)
SCCS-vsn: usr.bin/window/var.c 3.1

usr/src/usr.bin/window/var.c [new file with mode: 0644]

diff --git a/usr/src/usr.bin/window/var.c b/usr/src/usr.bin/window/var.c
new file mode 100644 (file)
index 0000000..eca35ce
--- /dev/null
@@ -0,0 +1,87 @@
+#ifndef lint
+static char *sccsid = "@(#)var.c       3.1 83/11/22";
+#endif
+
+#include "value.h"
+#include "var.h"
+#include "string.h"
+
+char *malloc();
+
+struct var *
+var_set(name, v)
+char *name;
+struct value *v;
+{
+       register struct var *r;
+
+       if ((r = var_lookup(name)) == 0) {
+               r = (struct var *) malloc(sizeof (struct var));
+               if (r == 0)
+                       return 0;
+               if ((r->r_name = str_cpy(name)) == 0) {
+                       free((char *) r);
+                       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) {
+                       free((char *) r);
+                       str_free(r->r_name);
+                       return 0;
+               }
+       }
+       return r;
+}
+
+struct var *
+var_lookup(name)
+char *name;
+{
+       register struct var *r;
+       register cmp;
+
+       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;
+}
+
+var_walk(func)
+int (*func)();
+{
+       var_walk1(var_head, func);
+}
+
+var_walk1(r, func)
+register struct var *r;
+int (*func)();
+{
+       if (r == 0)
+               return;
+       var_walk1(r->r_left, func);
+       (*func)();
+       var_walk1(r->r_right, func);
+}
+
+var_add(r)
+register struct var *r;
+{
+       register struct var **p;
+
+       for (p = &var_head; *p != 0;) {
+               /* don't care about duplicate entries */
+               if (strcmp(r->r_name, (*p)->r_name) < 0)
+                       p = &(*p)->r_left;
+               else
+                       p = &(*p)->r_right;
+       }
+       *p = r;
+}