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