1 |
/* $XConsortium: cppsetup.c,v 1.13 94/04/17 20:10:32 gildea Exp $ */ |
2 |
|
3 |
/* |
4 |
* Copyright (c) 1998-2003 Carnegie Mellon University. All rights reserved. |
5 |
* |
6 |
* Redistribution and use in source and binary forms, with or without |
7 |
* modification, are permitted provided that the following conditions |
8 |
* are met: |
9 |
* |
10 |
* 1. Redistributions of source code must retain the above copyright |
11 |
* notice, this list of conditions and the following disclaimer. |
12 |
* |
13 |
* 2. Redistributions in binary form must reproduce the above copyright |
14 |
* notice, this list of conditions and the following disclaimer in |
15 |
* the documentation and/or other materials provided with the |
16 |
* distribution. |
17 |
* |
18 |
* 3. The name "Carnegie Mellon University" must not be used to |
19 |
* endorse or promote products derived from this software without |
20 |
* prior written permission. For permission or any other legal |
21 |
* details, please contact |
22 |
* Office of Technology Transfer |
23 |
* Carnegie Mellon University |
24 |
* 5000 Forbes Avenue |
25 |
* Pittsburgh, PA 15213-3890 |
26 |
* (412) 268-4387, fax: (412) 268-7395 |
27 |
* tech-transfer@andrew.cmu.edu |
28 |
* |
29 |
* 4. Redistributions of any form whatsoever must retain the following |
30 |
* acknowledgment: |
31 |
* "This product includes software developed by Computing Services |
32 |
* at Carnegie Mellon University (http://www.cmu.edu/computing/)." |
33 |
* |
34 |
* CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO |
35 |
* THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY |
36 |
* AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE |
37 |
* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
38 |
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN |
39 |
* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING |
40 |
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
41 |
* |
42 |
*/ |
43 |
/* |
44 |
|
45 |
Copyright (c) 1993, 1994 X Consortium |
46 |
|
47 |
Permission is hereby granted, free of charge, to any person obtaining a copy |
48 |
of this software and associated documentation files (the "Software"), to deal |
49 |
in the Software without restriction, including without limitation the rights |
50 |
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
51 |
copies of the Software, and to permit persons to whom the Software is |
52 |
furnished to do so, subject to the following conditions: |
53 |
|
54 |
The above copyright notice and this permission notice shall be included in |
55 |
all copies or substantial portions of the Software. |
56 |
|
57 |
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
58 |
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
59 |
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
60 |
X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN |
61 |
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN |
62 |
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
63 |
|
64 |
Except as contained in this notice, the name of the X Consortium shall not be |
65 |
used in advertising or otherwise to promote the sale, use or other dealings |
66 |
in this Software without prior written authorization from the X Consortium. |
67 |
|
68 |
*/ |
69 |
|
70 |
#include "def.h" |
71 |
|
72 |
#ifdef CPP |
73 |
/* |
74 |
* This file is strictly for the sake of cpy.y and yylex.c (if |
75 |
* you indeed have the source for cpp). |
76 |
*/ |
77 |
#define IB 1 |
78 |
#define SB 2 |
79 |
#define NB 4 |
80 |
#define CB 8 |
81 |
#define QB 16 |
82 |
#define WB 32 |
83 |
#define SALT '#' |
84 |
#if pdp11 | vax | ns16000 | mc68000 | ibm032 |
85 |
#define COFF 128 |
86 |
#else |
87 |
#define COFF 0 |
88 |
#endif |
89 |
/* |
90 |
* These variables used by cpy.y and yylex.c |
91 |
*/ |
92 |
extern char *outp, *inp, *newp, *pend; |
93 |
extern char *ptrtab; |
94 |
extern char fastab[]; |
95 |
extern char slotab[]; |
96 |
|
97 |
/* |
98 |
* cppsetup |
99 |
*/ |
100 |
struct filepointer *currentfile; |
101 |
struct inclist *currentinc; |
102 |
|
103 |
cppsetup(line, filep, inc) |
104 |
register char *line; |
105 |
register struct filepointer *filep; |
106 |
register struct inclist *inc; |
107 |
{ |
108 |
register char *p, savec; |
109 |
static boolean setupdone = FALSE; |
110 |
boolean value; |
111 |
|
112 |
if (!setupdone) { |
113 |
cpp_varsetup(); |
114 |
setupdone = TRUE; |
115 |
} |
116 |
|
117 |
currentfile = filep; |
118 |
currentinc = inc; |
119 |
inp = newp = line; |
120 |
for (p=newp; *p; p++) |
121 |
; |
122 |
|
123 |
/* |
124 |
* put a newline back on the end, and set up pend, etc. |
125 |
*/ |
126 |
*p++ = '\n'; |
127 |
savec = *p; |
128 |
*p = '\0'; |
129 |
pend = p; |
130 |
|
131 |
ptrtab = slotab+COFF; |
132 |
*--inp = SALT; |
133 |
outp=inp; |
134 |
value = yyparse(); |
135 |
*p = savec; |
136 |
return(value); |
137 |
} |
138 |
|
139 |
struct symtab *lookup(symbol) |
140 |
char *symbol; |
141 |
{ |
142 |
static struct symtab undefined; |
143 |
struct symtab *sp; |
144 |
|
145 |
sp = isdefined(symbol, currentinc, NULL); |
146 |
if (sp == NULL) { |
147 |
sp = &undefined; |
148 |
sp->s_value = NULL; |
149 |
} |
150 |
return (sp); |
151 |
} |
152 |
|
153 |
pperror(tag, x0,x1,x2,x3,x4) |
154 |
int tag,x0,x1,x2,x3,x4; |
155 |
{ |
156 |
warning("\"%s\", line %d: ", currentinc->i_file, currentfile->f_line); |
157 |
warning(x0,x1,x2,x3,x4); |
158 |
} |
159 |
|
160 |
|
161 |
yyerror(s) |
162 |
register char *s; |
163 |
{ |
164 |
fatalerr("Fatal error: %s\n", s); |
165 |
} |
166 |
#else /* not CPP */ |
167 |
|
168 |
#include "ifparser.h" |
169 |
struct _parse_data { |
170 |
struct filepointer *filep; |
171 |
struct inclist *inc; |
172 |
const char *line; |
173 |
}; |
174 |
|
175 |
static const char * |
176 |
_my_if_errors (ip, cp, expecting) |
177 |
IfParser *ip; |
178 |
const char *cp; |
179 |
const char *expecting; |
180 |
{ |
181 |
struct _parse_data *pd = (struct _parse_data *) ip->data; |
182 |
int lineno = pd->filep->f_line; |
183 |
char *filename = pd->inc->i_file; |
184 |
char prefix[300]; |
185 |
int prefixlen; |
186 |
int i; |
187 |
|
188 |
sprintf (prefix, "\"%s\":%d", filename, lineno); |
189 |
prefixlen = strlen(prefix); |
190 |
fprintf (stderr, "%s: %s", prefix, pd->line); |
191 |
i = cp - pd->line; |
192 |
if (i > 0 && pd->line[i-1] != '\n') { |
193 |
putc ('\n', stderr); |
194 |
} |
195 |
for (i += prefixlen + 3; i > 0; i--) { |
196 |
putc (' ', stderr); |
197 |
} |
198 |
fprintf (stderr, "^--- expecting %s\n", expecting); |
199 |
return NULL; |
200 |
} |
201 |
|
202 |
|
203 |
#define MAXNAMELEN 256 |
204 |
|
205 |
static struct symtab * |
206 |
_lookup_variable (ip, var, len) |
207 |
IfParser *ip; |
208 |
const char *var; |
209 |
int len; |
210 |
{ |
211 |
char tmpbuf[MAXNAMELEN + 1]; |
212 |
struct _parse_data *pd = (struct _parse_data *) ip->data; |
213 |
|
214 |
if (len > MAXNAMELEN) |
215 |
return 0; |
216 |
|
217 |
strncpy (tmpbuf, var, len); |
218 |
tmpbuf[len] = '\0'; |
219 |
return isdefined (tmpbuf, pd->inc, NULL); |
220 |
} |
221 |
|
222 |
|
223 |
static int |
224 |
_my_eval_defined (ip, var, len) |
225 |
IfParser *ip; |
226 |
const char *var; |
227 |
int len; |
228 |
{ |
229 |
if (_lookup_variable (ip, var, len)) |
230 |
return 1; |
231 |
else |
232 |
return 0; |
233 |
} |
234 |
|
235 |
#define isvarfirstletter(ccc) (isalpha(ccc) || (ccc) == '_') |
236 |
|
237 |
static int |
238 |
_my_eval_variable (ip, var, len) |
239 |
IfParser *ip; |
240 |
const char *var; |
241 |
int len; |
242 |
{ |
243 |
struct symtab *s; |
244 |
|
245 |
s = _lookup_variable (ip, var, len); |
246 |
if (!s) |
247 |
return 0; |
248 |
do { |
249 |
var = s->s_value; |
250 |
if (!isvarfirstletter(*var)) |
251 |
break; |
252 |
s = _lookup_variable (ip, var, strlen(var)); |
253 |
} while (s); |
254 |
|
255 |
return atoi(var); |
256 |
} |
257 |
|
258 |
|
259 |
cppsetup(line, filep, inc) |
260 |
register char *line; |
261 |
register struct filepointer *filep; |
262 |
register struct inclist *inc; |
263 |
{ |
264 |
IfParser ip; |
265 |
struct _parse_data pd; |
266 |
int val = 0; |
267 |
|
268 |
pd.filep = filep; |
269 |
pd.inc = inc; |
270 |
pd.line = line; |
271 |
ip.funcs.handle_error = _my_if_errors; |
272 |
ip.funcs.eval_defined = _my_eval_defined; |
273 |
ip.funcs.eval_variable = _my_eval_variable; |
274 |
ip.data = (char *) &pd; |
275 |
|
276 |
(void) ParseIfExpression (&ip, line, &val); |
277 |
if (val) |
278 |
return IF; |
279 |
else |
280 |
return IFFALSE; |
281 |
} |
282 |
#endif /* CPP */ |
283 |
|