fixes from Lou Salkind at NYU
[unix-history] / usr / src / usr.bin / window / var.c
CommitLineData
4ae9aa77 1#ifndef lint
e1d25671 2static char *sccsid = "@(#)var.c 3.4 84/01/13";
4ae9aa77
EW
3#endif
4
5#include "value.h"
6#include "var.h"
7#include "string.h"
8
9char *malloc();
10
11struct var *
12var_set(name, v)
13char *name;
14struct value *v;
15{
b44eb60a 16 register struct var **p;
4ae9aa77 17 register struct var *r;
b44eb60a 18 struct value val;
4ae9aa77 19
b44eb60a
EW
20 /* do this first, easier to recover */
21 val = *v;
22 if (val.v_type == V_STR && (val.v_str = str_cpy(val.v_str)) == 0)
23 return 0;
24 if (*(p = var_lookup1(name)) == 0) {
4ae9aa77 25 r = (struct var *) malloc(sizeof (struct var));
b44eb60a
EW
26 if (r == 0) {
27 val_free(val);
4ae9aa77
EW
28 return 0;
29 }
b44eb60a
EW
30 if ((r->r_name = str_cpy(name)) == 0) {
31 val_free(val);
4ae9aa77 32 free((char *) r);
4ae9aa77
EW
33 return 0;
34 }
b44eb60a
EW
35 r->r_left = r->r_right = 0;
36 *p = r;
37 } else {
38 r = *p;
39 val_free(r->r_val);
4ae9aa77 40 }
b44eb60a 41 r->r_val = val;
4ae9aa77
EW
42 return r;
43}
44
a21d3dfe
EW
45struct var *
46var_setstr(name, str)
47char *name;
48char *str;
49{
50 struct value v;
51
52 v.v_type = V_STR;
53 v.v_str = str;
54 return var_set(name, &v);
55}
56
57struct var *
58var_setnum(name, num)
59char *name;
60int num;
61{
62 struct value v;
63
64 v.v_type = V_NUM;
65 v.v_num = num;
66 return var_set(name, &v);
67}
68
b44eb60a 69var_unset(name)
4ae9aa77
EW
70char *name;
71{
b44eb60a 72 register struct var **p;
4ae9aa77 73 register struct var *r;
b44eb60a
EW
74
75 if (*(p = var_lookup1(name)) == 0)
76 return -1;
77 r = *p;
78 *p = r->r_left;
79 while (*p != 0)
80 p = &(*p)->r_right;
81 *p = r->r_right;
82 val_free(r->r_val);
83 str_free(r->r_name);
84 free((char *) r);
85 return 0;
86}
87
88struct var **
89var_lookup1(name)
90register char *name;
91{
92 register struct var **p;
4ae9aa77
EW
93 register cmp;
94
b44eb60a
EW
95 for (p = &var_head; *p != 0;) {
96 if ((cmp = strcmp(name, (*p)->r_name)) < 0)
97 p = &(*p)->r_left;
4ae9aa77 98 else if (cmp > 0)
b44eb60a 99 p = &(*p)->r_right;
4ae9aa77
EW
100 else
101 break;
102 }
b44eb60a 103 return p;
4ae9aa77
EW
104}
105
e1d25671 106var_walk1(r, func, a)
4ae9aa77
EW
107register struct var *r;
108int (*func)();
109{
110 if (r == 0)
e1d25671
EW
111 return 0;
112 if (var_walk1(r->r_left, func, a) < 0 || (*func)(a, r) < 0
113 || var_walk1(r->r_right, func, a) < 0)
114 return -1;
115 return 0;
4ae9aa77 116}