|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1983 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that the above copyright notice and this paragraph are ! 7: * duplicated in all such forms and that any documentation, ! 8: * advertising materials, and other materials related to such ! 9: * distribution and use acknowledge that the software was developed ! 10: * by the University of California, Berkeley. The name of the ! 11: * University may not be used to endorse or promote products derived ! 12: * from this software without specific prior written permission. ! 13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 16: */ ! 17: ! 18: #ifndef lint ! 19: static char sccsid[] = "@(#)var.c 3.10 (Berkeley) 6/29/88"; ! 20: #endif /* not lint */ ! 21: ! 22: #include "value.h" ! 23: #include "var.h" ! 24: #include "string.h" ! 25: ! 26: char *malloc(); ! 27: ! 28: struct var * ! 29: var_set1(head, name, v) ! 30: struct var **head; ! 31: char *name; ! 32: struct value *v; ! 33: { ! 34: register struct var **p; ! 35: register struct var *r; ! 36: struct value val; ! 37: ! 38: /* do this first, easier to recover */ ! 39: val = *v; ! 40: if (val.v_type == V_STR && val.v_str != 0 && ! 41: (val.v_str = str_cpy(val.v_str)) == 0) ! 42: return 0; ! 43: if (*(p = var_lookup1(head, name)) == 0) { ! 44: r = (struct var *) malloc(sizeof (struct var)); ! 45: if (r == 0) { ! 46: val_free(val); ! 47: return 0; ! 48: } ! 49: if ((r->r_name = str_cpy(name)) == 0) { ! 50: val_free(val); ! 51: free((char *) r); ! 52: return 0; ! 53: } ! 54: r->r_left = r->r_right = 0; ! 55: *p = r; ! 56: } else { ! 57: r = *p; ! 58: val_free(r->r_val); ! 59: } ! 60: r->r_val = val; ! 61: return r; ! 62: } ! 63: ! 64: struct var * ! 65: var_setstr1(head, name, str) ! 66: struct var **head; ! 67: char *name; ! 68: char *str; ! 69: { ! 70: struct value v; ! 71: ! 72: v.v_type = V_STR; ! 73: v.v_str = str; ! 74: return var_set1(head, name, &v); ! 75: } ! 76: ! 77: struct var * ! 78: var_setnum1(head, name, num) ! 79: struct var **head; ! 80: char *name; ! 81: int num; ! 82: { ! 83: struct value v; ! 84: ! 85: v.v_type = V_NUM; ! 86: v.v_num = num; ! 87: return var_set1(head, name, &v); ! 88: } ! 89: ! 90: var_unset1(head, name) ! 91: struct var **head; ! 92: char *name; ! 93: { ! 94: register struct var **p; ! 95: register struct var *r; ! 96: ! 97: if (*(p = var_lookup1(head, name)) == 0) ! 98: return -1; ! 99: r = *p; ! 100: *p = r->r_left; ! 101: while (*p != 0) ! 102: p = &(*p)->r_right; ! 103: *p = r->r_right; ! 104: val_free(r->r_val); ! 105: str_free(r->r_name); ! 106: free((char *) r); ! 107: return 0; ! 108: } ! 109: ! 110: struct var ** ! 111: var_lookup1(p, name) ! 112: register struct var **p; ! 113: register char *name; ! 114: { ! 115: register cmp; ! 116: ! 117: while (*p != 0) { ! 118: if ((cmp = strcmp(name, (*p)->r_name)) < 0) ! 119: p = &(*p)->r_left; ! 120: else if (cmp > 0) ! 121: p = &(*p)->r_right; ! 122: else ! 123: break; ! 124: } ! 125: return p; ! 126: } ! 127: ! 128: var_walk1(r, func, a) ! 129: register struct var *r; ! 130: int (*func)(); ! 131: { ! 132: if (r == 0) ! 133: return 0; ! 134: if (var_walk1(r->r_left, func, a) < 0 || (*func)(a, r) < 0 ! 135: || var_walk1(r->r_right, func, a) < 0) ! 136: return -1; ! 137: return 0; ! 138: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.