xref: /original-bsd/usr.bin/window/var.c (revision c3e32dec)
1 /*
2  * Copyright (c) 1983, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * This code is derived from software contributed to Berkeley by
6  * Edward Wang at The University of California, Berkeley.
7  *
8  * %sccs.include.redist.c%
9  */
10 
11 #ifndef lint
12 static char sccsid[] = "@(#)var.c	8.1 (Berkeley) 06/06/93";
13 #endif /* not lint */
14 
15 #include "value.h"
16 #include "var.h"
17 #include "string.h"
18 
19 char *malloc();
20 
21 struct var *
22 var_set1(head, name, v)
23 struct var **head;
24 char *name;
25 struct value *v;
26 {
27 	register struct var **p;
28 	register struct var *r;
29 	struct value val;
30 
31 	/* do this first, easier to recover */
32 	val = *v;
33 	if (val.v_type == V_STR && val.v_str != 0 &&
34 	    (val.v_str = str_cpy(val.v_str)) == 0)
35 		return 0;
36 	if (*(p = var_lookup1(head, name)) == 0) {
37 		r = (struct var *) malloc(sizeof (struct var));
38 		if (r == 0) {
39 			val_free(val);
40 			return 0;
41 		}
42 		if ((r->r_name = str_cpy(name)) == 0) {
43 			val_free(val);
44 			free((char *) r);
45 			return 0;
46 		}
47 		r->r_left = r->r_right = 0;
48 		*p = r;
49 	} else {
50 		r = *p;
51 		val_free(r->r_val);
52 	}
53 	r->r_val = val;
54 	return r;
55 }
56 
57 struct var *
58 var_setstr1(head, name, str)
59 struct var **head;
60 char *name;
61 char *str;
62 {
63 	struct value v;
64 
65 	v.v_type = V_STR;
66 	v.v_str = str;
67 	return var_set1(head, name, &v);
68 }
69 
70 struct var *
71 var_setnum1(head, name, num)
72 struct var **head;
73 char *name;
74 int num;
75 {
76 	struct value v;
77 
78 	v.v_type = V_NUM;
79 	v.v_num = num;
80 	return var_set1(head, name, &v);
81 }
82 
83 var_unset1(head, name)
84 struct var **head;
85 char *name;
86 {
87 	register struct var **p;
88 	register struct var *r;
89 
90 	if (*(p = var_lookup1(head, name)) == 0)
91 		return -1;
92 	r = *p;
93 	*p = r->r_left;
94 	while (*p != 0)
95 		p = &(*p)->r_right;
96 	*p = r->r_right;
97 	val_free(r->r_val);
98 	str_free(r->r_name);
99 	free((char *) r);
100 	return 0;
101 }
102 
103 struct var **
104 var_lookup1(p, name)
105 register struct var **p;
106 register char *name;
107 {
108 	register cmp;
109 
110 	while (*p != 0) {
111 		if ((cmp = strcmp(name, (*p)->r_name)) < 0)
112 			p = &(*p)->r_left;
113 		else if (cmp > 0)
114 			p = &(*p)->r_right;
115 		else
116 			break;
117 	}
118 	return p;
119 }
120 
121 var_walk1(r, func, a)
122 register struct var *r;
123 int (*func)();
124 {
125 	if (r == 0)
126 		return 0;
127 	if (var_walk1(r->r_left, func, a) < 0 || (*func)(a, r) < 0
128 	    || var_walk1(r->r_right, func, a) < 0)
129 		return -1;
130 	return 0;
131 }
132