Commit | Line | Data |
---|---|---|
4ae9aa77 | 1 | #ifndef lint |
a21d3dfe | 2 | static char *sccsid = "@(#)var.c 3.2 83/12/06"; |
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 | { | |
16 | register struct var *r; | |
17 | ||
18 | if ((r = var_lookup(name)) == 0) { | |
19 | r = (struct var *) malloc(sizeof (struct var)); | |
20 | if (r == 0) | |
21 | return 0; | |
22 | if ((r->r_name = str_cpy(name)) == 0) { | |
23 | free((char *) r); | |
24 | return 0; | |
25 | } | |
26 | var_add(r); | |
27 | } | |
28 | r->r_val = *v; | |
29 | if (v->v_type == V_STR) { | |
30 | if ((r->r_val.v_str = str_cpy(v->v_str)) == 0) { | |
31 | free((char *) r); | |
32 | str_free(r->r_name); | |
33 | return 0; | |
34 | } | |
35 | } | |
36 | return r; | |
37 | } | |
38 | ||
a21d3dfe EW |
39 | struct var * |
40 | var_setstr(name, str) | |
41 | char *name; | |
42 | char *str; | |
43 | { | |
44 | struct value v; | |
45 | ||
46 | v.v_type = V_STR; | |
47 | v.v_str = str; | |
48 | return var_set(name, &v); | |
49 | } | |
50 | ||
51 | struct var * | |
52 | var_setnum(name, num) | |
53 | char *name; | |
54 | int num; | |
55 | { | |
56 | struct value v; | |
57 | ||
58 | v.v_type = V_NUM; | |
59 | v.v_num = num; | |
60 | return var_set(name, &v); | |
61 | } | |
62 | ||
4ae9aa77 EW |
63 | struct var * |
64 | var_lookup(name) | |
65 | char *name; | |
66 | { | |
67 | register struct var *r; | |
68 | register cmp; | |
69 | ||
70 | for (r = var_head; r != 0;) { | |
71 | if ((cmp = strcmp(name, r->r_name)) < 0) | |
72 | r = r->r_left; | |
73 | else if (cmp > 0) | |
74 | r = r->r_right; | |
75 | else | |
76 | break; | |
77 | } | |
78 | return r; | |
79 | } | |
80 | ||
4ae9aa77 EW |
81 | var_walk1(r, func) |
82 | register struct var *r; | |
83 | int (*func)(); | |
84 | { | |
85 | if (r == 0) | |
86 | return; | |
87 | var_walk1(r->r_left, func); | |
a21d3dfe | 88 | (*func)(r); |
4ae9aa77 EW |
89 | var_walk1(r->r_right, func); |
90 | } | |
91 | ||
92 | var_add(r) | |
93 | register struct var *r; | |
94 | { | |
95 | register struct var **p; | |
96 | ||
97 | for (p = &var_head; *p != 0;) { | |
98 | /* don't care about duplicate entries */ | |
99 | if (strcmp(r->r_name, (*p)->r_name) < 0) | |
100 | p = &(*p)->r_left; | |
101 | else | |
102 | p = &(*p)->r_right; | |
103 | } | |
104 | *p = r; | |
a21d3dfe | 105 | r->r_left = r->r_right = 0; |
4ae9aa77 | 106 | } |