115110Sralph #ifndef lint 2*15200Sralph static char *sccsid = "@(#)lookup.c 4.3 (Berkeley) 83/10/10"; 315110Sralph #endif 415110Sralph 515110Sralph #include "defs.h" 615110Sralph 715110Sralph /* 815110Sralph * Define a variable from a command line argument. 915110Sralph */ 1015110Sralph define(name) 1115110Sralph char *name; 1215110Sralph { 1315110Sralph register char *cp, *s; 1415110Sralph register struct block *bp, *value; 1515110Sralph 1615110Sralph if (debug) 1715110Sralph printf("define(%s)\n", name); 1815110Sralph 1915110Sralph cp = index(name, '='); 20*15200Sralph if (cp == NULL) 2115110Sralph value = NULL; 22*15200Sralph else if (cp[1] == '\0') { 2315110Sralph *cp++ = '\0'; 24*15200Sralph value = NULL; 25*15200Sralph } else if (cp[1] != '(') { 26*15200Sralph *cp++ = '\0'; 2715110Sralph value = makeblock(NAME, cp); 2815110Sralph } else { 2915110Sralph bp = NULL; 3015110Sralph *cp++ = '\0'; 3115110Sralph do 3215110Sralph cp++; 3315110Sralph while (*cp == ' ' || *cp == '\t'); 3415110Sralph for (s = cp; ; s++) { 3515110Sralph switch (*s) { 3615110Sralph case ')': 3715110Sralph *s = '\0'; 3815110Sralph case '\0': 3915110Sralph break; 4015110Sralph case ' ': 4115110Sralph case '\t': 4215110Sralph *s++ = '\0'; 4315110Sralph while (*s == ' ' || *s == '\t') 4415110Sralph s++; 4515110Sralph if (*s == ')') 4615110Sralph *s = '\0'; 4715110Sralph break; 4815110Sralph default: 4915110Sralph continue; 5015110Sralph } 5115110Sralph if (bp == NULL) 5215110Sralph value = bp = makeblock(NAME, cp); 5315110Sralph else { 5415110Sralph bp->b_next = makeblock(NAME, cp); 5515110Sralph bp = bp->b_next; 5615110Sralph } 5715110Sralph if (*s == '\0') 5815110Sralph break; 5915110Sralph cp = s; 6015110Sralph } 6115110Sralph } 6215110Sralph bp = makeblock(VAR, name); 6315110Sralph bp->b_args = value; 6415110Sralph (void) lookup(bp->b_name, bp, 1); 6515110Sralph } 6615110Sralph 6715110Sralph static struct block *hashtab[HASHSIZE]; 6815110Sralph 6915110Sralph /* 7015110Sralph * Lookup name in the table and return a pointer to it. 7115110Sralph * Insert == 0 - just do lookup, return NULL if not found. 7215110Sralph * insert == 1 - insert name with value, error if already defined. 7315110Sralph * insert == 2 - replace name with value if not entered with insert == 1. 7415110Sralph */ 7515110Sralph 7615110Sralph struct block * 7715110Sralph lookup(name, value, insert) 7815110Sralph char *name; 7915110Sralph struct block *value; 8015110Sralph int insert; 8115110Sralph { 8215110Sralph register unsigned n; 8315110Sralph register char *cp; 8415110Sralph register struct block *b, *f; 8515110Sralph 8615110Sralph if (debug) 8715110Sralph printf("lookup(%s, %x, %d)\n", name, value, insert); 8815110Sralph 8915110Sralph n = 0; 9015110Sralph for (cp = name; *cp; ) 9115110Sralph n += *cp++; 9215110Sralph n %= HASHSIZE; 9315110Sralph 9415110Sralph for (b = hashtab[n]; b != NULL; b = b->b_next) { 9515110Sralph if (strcmp(name, b->b_name)) 9615110Sralph continue; 9715110Sralph if (insert) { 9815110Sralph if (b->b_type == NAME) { 9915110Sralph warn("%s redefined\n", name); 10015110Sralph f = b->b_args; 10115110Sralph b->b_args = value->b_args; 10215110Sralph value->b_args = f; 10315110Sralph } else if (value->b_type == VAR) 10415110Sralph fatal("%s redefined\n", name); 10515110Sralph } 10615110Sralph return(b); 10715110Sralph } 10815110Sralph 10915110Sralph if (!insert) 11015110Sralph fatal("%s not defined", name); 11115110Sralph 11215110Sralph value->b_next = hashtab[n]; 11315110Sralph hashtab[n] = value; 11415110Sralph return(value); 11515110Sralph } 11615110Sralph 11715110Sralph /* 11815110Sralph * Make a block for lists of variables, commands, etc. 11915110Sralph */ 12015110Sralph struct block * 12115110Sralph makeblock(type, name) 12215110Sralph int type; 12315110Sralph register char *name; 12415110Sralph { 12515110Sralph register char *cp; 12615110Sralph register struct block *bp; 12715110Sralph 12815110Sralph bp = ALLOC(block); 12915110Sralph if (bp == NULL) 13015110Sralph fatal("ran out of memory\n"); 13115110Sralph bp->b_type = type; 13215110Sralph bp->b_next = bp->b_args = NULL; 13315110Sralph if (type == NAME || type == VAR) { 134*15200Sralph bp->b_name = cp = malloc(strlen(name) + 1); 13515110Sralph if (cp == NULL) 13615110Sralph fatal("ran out of memory\n"); 13715110Sralph while (*cp++ = *name++) 13815110Sralph ; 13915110Sralph } else 14015110Sralph bp->b_name = NULL; 14115110Sralph return(bp); 14215110Sralph } 143