lastselwin, and restructured some code
[unix-history] / usr / src / usr.bin / window / var.c
CommitLineData
4ae9aa77
EW
1#ifndef lint
2static 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
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
39struct var *
40var_lookup(name)
41char *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
57var_walk(func)
58int (*func)();
59{
60 var_walk1(var_head, func);
61}
62
63var_walk1(r, func)
64register struct var *r;
65int (*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
74var_add(r)
75register 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}