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 
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 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 #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  */
58 extern char *outp, *inp, *newp, *pend;
59 extern char *ptrtab;
60 extern char fastab[];
61 extern char slotab[];
62 
63 /*
64  * cppsetup
65  */
66 struct filepointer *currentfile;
67 inclist *currentinc;
68 
69 int cppsetup(register char *line, register struct filepointer *filep,
70  register inclist *inc)
71 {
72  register 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 
103 struct 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 
116 int 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 
123 int yyerror(register 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 
134 struct _parse_data {
135  struct filepointer *filep;
136  inclist *inc;
137  const char *line;
138 };
139 
140 static 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 
167 static 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 
181 static 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 
189 static 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 
207 int cppsetup(register char *line, register struct filepointer *filep,
208  register 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(register char *line, register struct filepointer *filep, register inclist *inc)
Definition: cppsetup.cpp:207
symtab * isdefined(register char *symbol, inclist *file, inclist **srcfile)
Definition: parse.cpp:362
#define IFFALSE
Definition: def.h:71
#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