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