|
|
1.1 ! root 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.