Commit | Line | Data |
---|---|---|
4ae9aa77 | 1 | #ifndef lint |
e1d25671 | 2 | static 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 | ||
9 | char *malloc(); | |
10 | ||
11 | struct var * | |
12 | var_set(name, v) | |
13 | char *name; | |
14 | struct 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 |
45 | struct var * |
46 | var_setstr(name, str) | |
47 | char *name; | |
48 | char *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 | ||
57 | struct var * | |
58 | var_setnum(name, num) | |
59 | char *name; | |
60 | int 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 | 69 | var_unset(name) |
4ae9aa77 EW |
70 | char *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 | ||
88 | struct var ** | |
89 | var_lookup1(name) | |
90 | register 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 | 106 | var_walk1(r, func, a) |
4ae9aa77 EW |
107 | register struct var *r; |
108 | int (*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 | } |