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