'v' command
[unix-history] / usr / src / usr.bin / window / var.c
CommitLineData
4ae9aa77 1#ifndef lint
a21d3dfe 2static 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
9char *malloc();
10
11struct var *
12var_set(name, v)
13char *name;
14struct 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
39struct var *
40var_setstr(name, str)
41char *name;
42char *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
51struct var *
52var_setnum(name, num)
53char *name;
54int 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
63struct var *
64var_lookup(name)
65char *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
81var_walk1(r, func)
82register struct var *r;
83int (*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
92var_add(r)
93register 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}