|
|
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[] = "@(#)lookup.c 5.4 (Berkeley) 6/29/88";
20: #endif /* not lint */
21:
22: #include "defs.h"
23:
24: /* symbol types */
25: #define VAR 1
26: #define CONST 2
27:
28: struct syment {
29: int s_type;
30: char *s_name;
31: struct namelist *s_value;
32: struct syment *s_next;
33: };
34:
35: static struct syment *hashtab[HASHSIZE];
36:
37: /*
38: * Define a variable from a command line argument.
39: */
40: define(name)
41: char *name;
42: {
43: register char *cp, *s;
44: register struct namelist *nl;
45: struct namelist *value;
46:
47: if (debug)
48: printf("define(%s)\n", name);
49:
50: cp = index(name, '=');
51: if (cp == NULL)
52: value = NULL;
53: else if (cp[1] == '\0') {
54: *cp = '\0';
55: value = NULL;
56: } else if (cp[1] != '(') {
57: *cp++ = '\0';
58: value = makenl(cp);
59: } else {
60: nl = NULL;
61: *cp++ = '\0';
62: do
63: cp++;
64: while (*cp == ' ' || *cp == '\t');
65: for (s = cp; ; s++) {
66: switch (*s) {
67: case ')':
68: *s = '\0';
69: case '\0':
70: break;
71: case ' ':
72: case '\t':
73: *s++ = '\0';
74: while (*s == ' ' || *s == '\t')
75: s++;
76: if (*s == ')')
77: *s = '\0';
78: break;
79: default:
80: continue;
81: }
82: if (nl == NULL)
83: value = nl = makenl(cp);
84: else {
85: nl->n_next = makenl(cp);
86: nl = nl->n_next;
87: }
88: if (*s == '\0')
89: break;
90: cp = s;
91: }
92: }
93: (void) lookup(name, REPLACE, value);
94: }
95:
96: /*
97: * Lookup name in the table and return a pointer to it.
98: * LOOKUP - just do lookup, return NULL if not found.
99: * INSERT - insert name with value, error if already defined.
100: * REPLACE - insert or replace name with value.
101: */
102:
103: struct namelist *
104: lookup(name, action, value)
105: char *name;
106: int action;
107: struct namelist *value;
108: {
109: register unsigned n;
110: register char *cp;
111: register struct syment *s;
112: char buf[256];
113:
114: if (debug)
115: printf("lookup(%s, %d, %x)\n", name, action, value);
116:
117: n = 0;
118: for (cp = name; *cp; )
119: n += *cp++;
120: n %= HASHSIZE;
121:
122: for (s = hashtab[n]; s != NULL; s = s->s_next) {
123: if (strcmp(name, s->s_name))
124: continue;
125: if (action != LOOKUP) {
126: if (action != INSERT || s->s_type != CONST) {
127: (void)sprintf(buf, "%s redefined", name);
128: yyerror(buf);
129: }
130: }
131: return(s->s_value);
132: }
133:
134: if (action == LOOKUP) {
135: (void)sprintf(buf, "%s undefined", name);
136: yyerror(buf);
137: return(NULL);
138: }
139:
140: s = ALLOC(syment);
141: if (s == NULL)
142: fatal("ran out of memory\n");
143: s->s_next = hashtab[n];
144: hashtab[n] = s;
145: s->s_type = action == INSERT ? VAR : CONST;
146: s->s_name = name;
147: s->s_value = value;
148: return(value);
149: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.