Commit | Line | Data |
---|---|---|
7172eb74 DF |
1 | /* |
2 | * Copyright (c) 1983 Regents of the University of California. | |
0718fb71 KB |
3 | * All rights reserved. |
4 | * | |
6d936b27 | 5 | * %sccs.include.redist.c% |
7172eb74 DF |
6 | */ |
7 | ||
837386b3 | 8 | #ifndef lint |
a94625d9 | 9 | static char sccsid[] = "@(#)lookup.c 5.6 (Berkeley) %G%"; |
0718fb71 | 10 | #endif /* not lint */ |
837386b3 RC |
11 | |
12 | #include "defs.h" | |
13 | ||
0fccdfef RC |
14 | /* symbol types */ |
15 | #define VAR 1 | |
16 | #define CONST 2 | |
17 | ||
18 | struct syment { | |
19 | int s_type; | |
20 | char *s_name; | |
21 | struct namelist *s_value; | |
22 | struct syment *s_next; | |
23 | }; | |
24 | ||
25 | static struct syment *hashtab[HASHSIZE]; | |
26 | ||
837386b3 RC |
27 | /* |
28 | * Define a variable from a command line argument. | |
29 | */ | |
a94625d9 | 30 | void |
837386b3 RC |
31 | define(name) |
32 | char *name; | |
33 | { | |
34 | register char *cp, *s; | |
0fccdfef RC |
35 | register struct namelist *nl; |
36 | struct namelist *value; | |
837386b3 RC |
37 | |
38 | if (debug) | |
39 | printf("define(%s)\n", name); | |
40 | ||
41 | cp = index(name, '='); | |
3024eb6f | 42 | if (cp == NULL) |
837386b3 | 43 | value = NULL; |
3024eb6f | 44 | else if (cp[1] == '\0') { |
0fccdfef | 45 | *cp = '\0'; |
3024eb6f RC |
46 | value = NULL; |
47 | } else if (cp[1] != '(') { | |
837386b3 | 48 | *cp++ = '\0'; |
58157a31 | 49 | value = makenl(cp); |
837386b3 | 50 | } else { |
0fccdfef | 51 | nl = NULL; |
837386b3 RC |
52 | *cp++ = '\0'; |
53 | do | |
54 | cp++; | |
55 | while (*cp == ' ' || *cp == '\t'); | |
56 | for (s = cp; ; s++) { | |
57 | switch (*s) { | |
58 | case ')': | |
59 | *s = '\0'; | |
60 | case '\0': | |
61 | break; | |
62 | case ' ': | |
63 | case '\t': | |
64 | *s++ = '\0'; | |
65 | while (*s == ' ' || *s == '\t') | |
66 | s++; | |
67 | if (*s == ')') | |
68 | *s = '\0'; | |
69 | break; | |
70 | default: | |
71 | continue; | |
72 | } | |
0fccdfef RC |
73 | if (nl == NULL) |
74 | value = nl = makenl(cp); | |
837386b3 | 75 | else { |
0fccdfef RC |
76 | nl->n_next = makenl(cp); |
77 | nl = nl->n_next; | |
837386b3 RC |
78 | } |
79 | if (*s == '\0') | |
80 | break; | |
81 | cp = s; | |
82 | } | |
83 | } | |
0fccdfef | 84 | (void) lookup(name, REPLACE, value); |
837386b3 RC |
85 | } |
86 | ||
837386b3 RC |
87 | /* |
88 | * Lookup name in the table and return a pointer to it. | |
0fccdfef RC |
89 | * LOOKUP - just do lookup, return NULL if not found. |
90 | * INSERT - insert name with value, error if already defined. | |
91 | * REPLACE - insert or replace name with value. | |
837386b3 RC |
92 | */ |
93 | ||
0fccdfef RC |
94 | struct namelist * |
95 | lookup(name, action, value) | |
837386b3 | 96 | char *name; |
0fccdfef RC |
97 | int action; |
98 | struct namelist *value; | |
837386b3 RC |
99 | { |
100 | register unsigned n; | |
101 | register char *cp; | |
0fccdfef | 102 | register struct syment *s; |
55669d5b | 103 | char buf[256]; |
837386b3 RC |
104 | |
105 | if (debug) | |
0fccdfef | 106 | printf("lookup(%s, %d, %x)\n", name, action, value); |
837386b3 RC |
107 | |
108 | n = 0; | |
109 | for (cp = name; *cp; ) | |
110 | n += *cp++; | |
111 | n %= HASHSIZE; | |
112 | ||
0fccdfef RC |
113 | for (s = hashtab[n]; s != NULL; s = s->s_next) { |
114 | if (strcmp(name, s->s_name)) | |
837386b3 | 115 | continue; |
0fccdfef | 116 | if (action != LOOKUP) { |
55669d5b | 117 | if (action != INSERT || s->s_type != CONST) { |
a2061e43 | 118 | (void)sprintf(buf, "%s redefined", name); |
55669d5b RC |
119 | yyerror(buf); |
120 | } | |
837386b3 | 121 | } |
0fccdfef | 122 | return(s->s_value); |
837386b3 RC |
123 | } |
124 | ||
55669d5b | 125 | if (action == LOOKUP) { |
a2061e43 KB |
126 | (void)sprintf(buf, "%s undefined", name); |
127 | yyerror(buf); | |
55669d5b RC |
128 | return(NULL); |
129 | } | |
837386b3 | 130 | |
0fccdfef RC |
131 | s = ALLOC(syment); |
132 | if (s == NULL) | |
837386b3 | 133 | fatal("ran out of memory\n"); |
0fccdfef RC |
134 | s->s_next = hashtab[n]; |
135 | hashtab[n] = s; | |
136 | s->s_type = action == INSERT ? VAR : CONST; | |
137 | s->s_name = name; | |
138 | s->s_value = value; | |
139 | return(value); | |
837386b3 | 140 | } |