123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- #ifndef lint
- static char *sccsid = "@(#)lookup.c 4.5 (Berkeley) 84/02/16";
- #endif
- #include "defs.h"
- /* symbol types */
- #define VAR 1
- #define CONST 2
- struct syment {
- int s_type;
- char *s_name;
- struct namelist *s_value;
- struct syment *s_next;
- };
- static struct syment *hashtab[HASHSIZE];
- /*
- * Define a variable from a command line argument.
- */
- define(name)
- char *name;
- {
- register char *cp, *s;
- register struct namelist *nl;
- struct namelist *value;
- if (debug)
- printf("define(%s)\n", name);
- cp = index(name, '=');
- if (cp == NULL)
- value = NULL;
- else if (cp[1] == '\0') {
- *cp = '\0';
- value = NULL;
- } else if (cp[1] != '(') {
- *cp++ = '\0';
- value = makenl(cp);
- } else {
- nl = NULL;
- *cp++ = '\0';
- do
- cp++;
- while (*cp == ' ' || *cp == '\t');
- for (s = cp; ; s++) {
- switch (*s) {
- case ')':
- *s = '\0';
- case '\0':
- break;
- case ' ':
- case '\t':
- *s++ = '\0';
- while (*s == ' ' || *s == '\t')
- s++;
- if (*s == ')')
- *s = '\0';
- break;
- default:
- continue;
- }
- if (nl == NULL)
- value = nl = makenl(cp);
- else {
- nl->n_next = makenl(cp);
- nl = nl->n_next;
- }
- if (*s == '\0')
- break;
- cp = s;
- }
- }
- (void) lookup(name, REPLACE, value);
- }
- /*
- * Lookup name in the table and return a pointer to it.
- * LOOKUP - just do lookup, return NULL if not found.
- * INSERT - insert name with value, error if already defined.
- * REPLACE - insert or replace name with value.
- */
- struct namelist *
- lookup(name, action, value)
- char *name;
- int action;
- struct namelist *value;
- {
- register unsigned n;
- register char *cp;
- register struct syment *s;
- if (debug)
- printf("lookup(%s, %d, %x)\n", name, action, value);
- n = 0;
- for (cp = name; *cp; )
- n += *cp++;
- n %= HASHSIZE;
- for (s = hashtab[n]; s != NULL; s = s->s_next) {
- if (strcmp(name, s->s_name))
- continue;
- if (action != LOOKUP) {
- if (action != INSERT || s->s_type != CONST)
- fatal("%s redefined\n", name);
- }
- return(s->s_value);
- }
- if (action == LOOKUP)
- fatal("%s not defined", name);
- s = ALLOC(syment);
- if (s == NULL)
- fatal("ran out of memory\n");
- s->s_next = hashtab[n];
- hashtab[n] = s;
- s->s_type = action == INSERT ? VAR : CONST;
- s->s_name = name;
- s->s_value = value;
- return(value);
- }
|