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