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