1 |
edhill |
1.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 |
|
|
|