1 dawes 3.0 /* $XConsortium: cppsetup.c /main/16 1996/04/23 13:27:04 kaleb $ */
|
2 dawes 1.1 /*
3
4 Copyright (c) 1993, 1994 X Consortium
5
6 Permission is hereby granted, free of charge, to any person obtaining a copy
7 of this software and associated documentation files (the "Software"), to deal
8 in the Software without restriction, including without limitation the rights
9 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 copies of the Software, and to permit persons to whom the Software is
11 furnished to do so, subject to the following conditions:
12
13 The above copyright notice and this permission notice shall be included in
14 all copies or substantial portions of the Software.
15
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
20 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
23 dawes 1.1 Except as contained in this notice, the name of the X Consortium shall not be
24 used in advertising or otherwise to promote the sale, use or other dealings
25 in this Software without prior written authorization from the X Consortium.
26
27 */
28
29 #include "def.h"
30
31 #ifdef CPP
32 /*
33 * This file is strictly for the sake of cpy.y and yylex.c (if
34 * you indeed have the source for cpp).
35 */
36 #define IB 1
37 #define SB 2
38 #define NB 4
39 #define CB 8
40 #define QB 16
41 #define WB 32
42 #define SALT '#'
43 #if pdp11 | vax | ns16000 | mc68000 | ibm032
44 dawes 1.1 #define COFF 128
45 #else
46 #define COFF 0
47 #endif
48 /*
49 * These variables used by cpy.y and yylex.c
50 */
51 extern char *outp, *inp, *newp, *pend;
52 extern char *ptrtab;
53 extern char fastab[];
54 extern char slotab[];
55
56 /*
57 * cppsetup
58 */
59 struct filepointer *currentfile;
60 struct inclist *currentinc;
61
62 cppsetup(line, filep, inc)
63 register char *line;
64 register struct filepointer *filep;
65 dawes 1.1 register struct inclist *inc;
66 {
67 register char *p, savec;
68 static boolean setupdone = FALSE;
69 boolean value;
70
71 if (!setupdone) {
72 cpp_varsetup();
73 setupdone = TRUE;
74 }
75
76 currentfile = filep;
77 currentinc = inc;
78 inp = newp = line;
79 for (p=newp; *p; p++)
80 ;
81
82 /*
83 * put a newline back on the end, and set up pend, etc.
84 */
85 *p++ = '\n';
86 dawes 1.1 savec = *p;
87 *p = '\0';
88 pend = p;
89
90 ptrtab = slotab+COFF;
91 *--inp = SALT;
92 outp=inp;
93 value = yyparse();
94 *p = savec;
95 return(value);
96 }
97
|
98 dawes 3.0 struct symtab **lookup(symbol)
|
99 dawes 1.1 char *symbol;
100 {
|
101 dawes 3.0 static struct symtab *undefined;
102 struct symtab **sp;
|
103 dawes 1.1
104 sp = isdefined(symbol, currentinc, NULL);
105 if (sp == NULL) {
106 sp = &undefined;
|
107 dawes 3.0 (*sp)->s_value = NULL;
|
108 dawes 1.1 }
109 return (sp);
110 }
111
112 pperror(tag, x0,x1,x2,x3,x4)
113 int tag,x0,x1,x2,x3,x4;
114 {
115 warning("\"%s\", line %d: ", currentinc->i_file, currentfile->f_line);
116 warning(x0,x1,x2,x3,x4);
117 }
118
119
120 yyerror(s)
121 register char *s;
122 {
123 fatalerr("Fatal error: %s\n", s);
124 }
125 #else /* not CPP */
126
127 #include "ifparser.h"
128 struct _parse_data {
129 dawes 1.1 struct filepointer *filep;
130 struct inclist *inc;
131 const char *line;
132 };
133
134 static const char *
|
135 dawes 3.0 my_if_errors (ip, cp, expecting)
|
136 dawes 1.1 IfParser *ip;
137 const char *cp;
138 const char *expecting;
139 {
140 struct _parse_data *pd = (struct _parse_data *) ip->data;
141 int lineno = pd->filep->f_line;
142 char *filename = pd->inc->i_file;
143 char prefix[300];
144 int prefixlen;
145 int i;
146
147 sprintf (prefix, "\"%s\":%d", filename, lineno);
148 prefixlen = strlen(prefix);
149 fprintf (stderr, "%s: %s", prefix, pd->line);
150 i = cp - pd->line;
151 if (i > 0 && pd->line[i-1] != '\n') {
152 putc ('\n', stderr);
153 }
154 for (i += prefixlen + 3; i > 0; i--) {
155 putc (' ', stderr);
156 }
157 dawes 1.1 fprintf (stderr, "^--- expecting %s\n", expecting);
158 return NULL;
159 }
160
161
162 #define MAXNAMELEN 256
163
|
164 dawes 3.0 static struct symtab **
165 lookup_variable (ip, var, len)
|
166 dawes 1.1 IfParser *ip;
167 const char *var;
168 int len;
169 {
170 char tmpbuf[MAXNAMELEN + 1];
171 struct _parse_data *pd = (struct _parse_data *) ip->data;
172
173 if (len > MAXNAMELEN)
174 return 0;
175
176 strncpy (tmpbuf, var, len);
177 tmpbuf[len] = '\0';
178 return isdefined (tmpbuf, pd->inc, NULL);
179 }
180
181
182 static int
|
183 dawes 3.0 my_eval_defined (ip, var, len)
|
184 dawes 1.1 IfParser *ip;
185 const char *var;
186 int len;
187 {
|
188 dawes 3.0 if (lookup_variable (ip, var, len))
|
189 dawes 1.1 return 1;
190 else
191 return 0;
192 }
193
194 #define isvarfirstletter(ccc) (isalpha(ccc) || (ccc) == '_')
195
|
196 dawes 3.0 static long
197 my_eval_variable (ip, var, len)
|
198 dawes 1.1 IfParser *ip;
199 const char *var;
200 int len;
201 {
|
202 dawes 3.0 struct symtab **s;
|
203 dawes 1.1
|
204 dawes 3.0 s = lookup_variable (ip, var, len);
|
205 dawes 1.1 if (!s)
206 return 0;
207 do {
|
208 dawes 3.0 var = (*s)->s_value;
|
209 dawes 1.1 if (!isvarfirstletter(*var))
210 break;
|
211 dawes 3.0 s = lookup_variable (ip, var, strlen(var));
|
212 dawes 1.1 } while (s);
213
|
214 dawes 3.0 return strtol(var, NULL, 0);
|
215 dawes 1.1 }
216
217
218 cppsetup(line, filep, inc)
219 register char *line;
220 register struct filepointer *filep;
221 register struct inclist *inc;
222 {
223 IfParser ip;
224 struct _parse_data pd;
|
225 dawes 3.0 long val = 0;
|
226 dawes 1.1
227 pd.filep = filep;
228 pd.inc = inc;
229 pd.line = line;
|
230 dawes 3.0 ip.funcs.handle_error = my_if_errors;
231 ip.funcs.eval_defined = my_eval_defined;
232 ip.funcs.eval_variable = my_eval_variable;
|
233 dawes 1.1 ip.data = (char *) &pd;
234
235 (void) ParseIfExpression (&ip, line, &val);
236 if (val)
237 return IF;
238 else
239 return IFFALSE;
240 }
241 #endif /* CPP */
242
|