Commit | Line | Data |
---|---|---|
4ae9aa77 EW |
1 | #ifndef lint |
2 | static char *sccsid = "@(#)var.c 3.1 83/11/22"; | |
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 | ||
39 | struct var * | |
40 | var_lookup(name) | |
41 | char *name; | |
42 | { | |
43 | register struct var *r; | |
44 | register cmp; | |
45 | ||
46 | for (r = var_head; r != 0;) { | |
47 | if ((cmp = strcmp(name, r->r_name)) < 0) | |
48 | r = r->r_left; | |
49 | else if (cmp > 0) | |
50 | r = r->r_right; | |
51 | else | |
52 | break; | |
53 | } | |
54 | return r; | |
55 | } | |
56 | ||
57 | var_walk(func) | |
58 | int (*func)(); | |
59 | { | |
60 | var_walk1(var_head, func); | |
61 | } | |
62 | ||
63 | var_walk1(r, func) | |
64 | register struct var *r; | |
65 | int (*func)(); | |
66 | { | |
67 | if (r == 0) | |
68 | return; | |
69 | var_walk1(r->r_left, func); | |
70 | (*func)(); | |
71 | var_walk1(r->r_right, func); | |
72 | } | |
73 | ||
74 | var_add(r) | |
75 | register struct var *r; | |
76 | { | |
77 | register struct var **p; | |
78 | ||
79 | for (p = &var_head; *p != 0;) { | |
80 | /* don't care about duplicate entries */ | |
81 | if (strcmp(r->r_name, (*p)->r_name) < 0) | |
82 | p = &(*p)->r_left; | |
83 | else | |
84 | p = &(*p)->r_right; | |
85 | } | |
86 | *p = r; | |
87 | } |