1*906afcb8SAndy Fiddaman /***********************************************************************
2*906afcb8SAndy Fiddaman * *
3*906afcb8SAndy Fiddaman * This software is part of the ast package *
4*906afcb8SAndy Fiddaman * Copyright (c) 1986-2011 AT&T Intellectual Property *
5*906afcb8SAndy Fiddaman * and is licensed under the *
6*906afcb8SAndy Fiddaman * Eclipse Public License, Version 1.0 *
7*906afcb8SAndy Fiddaman * by AT&T Intellectual Property *
8*906afcb8SAndy Fiddaman * *
9*906afcb8SAndy Fiddaman * A copy of the License is available at *
10*906afcb8SAndy Fiddaman * http://www.eclipse.org/org/documents/epl-v10.html *
11*906afcb8SAndy Fiddaman * (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12*906afcb8SAndy Fiddaman * *
13*906afcb8SAndy Fiddaman * Information and Software Systems Research *
14*906afcb8SAndy Fiddaman * AT&T Research *
15*906afcb8SAndy Fiddaman * Florham Park NJ *
16*906afcb8SAndy Fiddaman * *
17*906afcb8SAndy Fiddaman * Glenn Fowler <gsf@research.att.com> *
18*906afcb8SAndy Fiddaman * *
19*906afcb8SAndy Fiddaman ***********************************************************************/
20*906afcb8SAndy Fiddaman #pragma prototyped
21*906afcb8SAndy Fiddaman /*
22*906afcb8SAndy Fiddaman * Glenn Fowler
23*906afcb8SAndy Fiddaman * AT&T Research
24*906afcb8SAndy Fiddaman *
25*906afcb8SAndy Fiddaman * miscellaneous preprocessor support
26*906afcb8SAndy Fiddaman */
27*906afcb8SAndy Fiddaman
28*906afcb8SAndy Fiddaman #include "pplib.h"
29*906afcb8SAndy Fiddaman
30*906afcb8SAndy Fiddaman /*
31*906afcb8SAndy Fiddaman * macro symbol def|ref
32*906afcb8SAndy Fiddaman */
33*906afcb8SAndy Fiddaman
34*906afcb8SAndy Fiddaman struct ppsymbol*
pprefmac(char * name,int ref)35*906afcb8SAndy Fiddaman pprefmac(char* name, int ref)
36*906afcb8SAndy Fiddaman {
37*906afcb8SAndy Fiddaman register struct ppsymbol* sym;
38*906afcb8SAndy Fiddaman
39*906afcb8SAndy Fiddaman if (!(sym = ppsymget(pp.symtab, name)) && (ref <= REF_NORMAL && pp.macref || ref == REF_CREATE || ref == REF_DELETE && (pp.mode & (INIT|READONLY))))
40*906afcb8SAndy Fiddaman {
41*906afcb8SAndy Fiddaman if ((pp.state & COMPILE) && pp.truncate && strlen(name) > pp.truncate)
42*906afcb8SAndy Fiddaman name[pp.truncate] = 0;
43*906afcb8SAndy Fiddaman sym = ppsymset(pp.symtab, NiL);
44*906afcb8SAndy Fiddaman }
45*906afcb8SAndy Fiddaman if (sym && ref <= REF_NORMAL)
46*906afcb8SAndy Fiddaman {
47*906afcb8SAndy Fiddaman if (pp.macref) (*pp.macref)(sym, error_info.file, error_info.line, ref == REF_NORMAL && (pp.state & CONDITIONAL) ? REF_IF : ref, 0L);
48*906afcb8SAndy Fiddaman if (!sym->macro) sym = 0;
49*906afcb8SAndy Fiddaman }
50*906afcb8SAndy Fiddaman #if COMPATIBLE
51*906afcb8SAndy Fiddaman if (!(pp.state & COMPATIBILITY))
52*906afcb8SAndy Fiddaman #endif
53*906afcb8SAndy Fiddaman if (ref == REF_IF && sym && (sym->flags & SYM_PREDEFINED) && *name != '_' && !(pp.mode & (HOSTED|INACTIVE)))
54*906afcb8SAndy Fiddaman {
55*906afcb8SAndy Fiddaman if (pp.state & STRICT)
56*906afcb8SAndy Fiddaman {
57*906afcb8SAndy Fiddaman error(1, "%s: obsolete predefined symbol reference disabled", name);
58*906afcb8SAndy Fiddaman return(0);
59*906afcb8SAndy Fiddaman }
60*906afcb8SAndy Fiddaman error(1, "%s: obsolete predefined symbol referenced", name);
61*906afcb8SAndy Fiddaman }
62*906afcb8SAndy Fiddaman return(sym);
63*906afcb8SAndy Fiddaman }
64*906afcb8SAndy Fiddaman
65*906afcb8SAndy Fiddaman /*
66*906afcb8SAndy Fiddaman * common predicate assertion operations
67*906afcb8SAndy Fiddaman * op is DEFINE or UNDEF
68*906afcb8SAndy Fiddaman */
69*906afcb8SAndy Fiddaman
70*906afcb8SAndy Fiddaman void
ppassert(int op,char * pred,char * args)71*906afcb8SAndy Fiddaman ppassert(int op, char* pred, char* args)
72*906afcb8SAndy Fiddaman {
73*906afcb8SAndy Fiddaman register struct pplist* a;
74*906afcb8SAndy Fiddaman register struct ppsymbol* sym;
75*906afcb8SAndy Fiddaman register struct pplist* p;
76*906afcb8SAndy Fiddaman register struct pplist* q;
77*906afcb8SAndy Fiddaman
78*906afcb8SAndy Fiddaman if (!args) switch (op)
79*906afcb8SAndy Fiddaman {
80*906afcb8SAndy Fiddaman case DEFINE:
81*906afcb8SAndy Fiddaman goto mark;
82*906afcb8SAndy Fiddaman case UNDEF:
83*906afcb8SAndy Fiddaman a = 0;
84*906afcb8SAndy Fiddaman goto unmark;
85*906afcb8SAndy Fiddaman }
86*906afcb8SAndy Fiddaman if (a = (struct pplist*)hashget(pp.prdtab, pred))
87*906afcb8SAndy Fiddaman {
88*906afcb8SAndy Fiddaman p = 0;
89*906afcb8SAndy Fiddaman q = a;
90*906afcb8SAndy Fiddaman while (q)
91*906afcb8SAndy Fiddaman {
92*906afcb8SAndy Fiddaman if (streq(q->value, args))
93*906afcb8SAndy Fiddaman {
94*906afcb8SAndy Fiddaman if (op == DEFINE) return;
95*906afcb8SAndy Fiddaman q = q->next;
96*906afcb8SAndy Fiddaman if (p) p->next = q;
97*906afcb8SAndy Fiddaman else a = q;
98*906afcb8SAndy Fiddaman }
99*906afcb8SAndy Fiddaman else
100*906afcb8SAndy Fiddaman {
101*906afcb8SAndy Fiddaman p = q;
102*906afcb8SAndy Fiddaman q = q->next;
103*906afcb8SAndy Fiddaman }
104*906afcb8SAndy Fiddaman }
105*906afcb8SAndy Fiddaman if (op == UNDEF)
106*906afcb8SAndy Fiddaman {
107*906afcb8SAndy Fiddaman unmark:
108*906afcb8SAndy Fiddaman hashput(pp.prdtab, pred, a);
109*906afcb8SAndy Fiddaman if (sym = ppsymref(pp.symtab, pred))
110*906afcb8SAndy Fiddaman sym->flags &= ~SYM_PREDICATE;
111*906afcb8SAndy Fiddaman return;
112*906afcb8SAndy Fiddaman }
113*906afcb8SAndy Fiddaman }
114*906afcb8SAndy Fiddaman if (op == DEFINE)
115*906afcb8SAndy Fiddaman {
116*906afcb8SAndy Fiddaman p = newof(0, struct pplist, 1, 0);
117*906afcb8SAndy Fiddaman p->next = a;
118*906afcb8SAndy Fiddaman p->value = strdup(args);
119*906afcb8SAndy Fiddaman hashput(pp.prdtab, NiL, p);
120*906afcb8SAndy Fiddaman mark:
121*906afcb8SAndy Fiddaman if ((pp.state & COMPILE) && pp.truncate) return;
122*906afcb8SAndy Fiddaman if (sym = ppsymset(pp.symtab, pred))
123*906afcb8SAndy Fiddaman sym->flags |= SYM_PREDICATE;
124*906afcb8SAndy Fiddaman }
125*906afcb8SAndy Fiddaman }
126*906afcb8SAndy Fiddaman
127*906afcb8SAndy Fiddaman /*
128*906afcb8SAndy Fiddaman * parse a predicate argument list
129*906afcb8SAndy Fiddaman * the args are placed in pp.args
130*906afcb8SAndy Fiddaman * the first non-space/paren argument token type is returned
131*906afcb8SAndy Fiddaman * forms:
132*906afcb8SAndy Fiddaman *
133*906afcb8SAndy Fiddaman * predicate <identifier> type=T_ID
134*906afcb8SAndy Fiddaman * predicate ( <identifier> ) type=T_ID
135*906afcb8SAndy Fiddaman * predicate ( ) type=0
136*906afcb8SAndy Fiddaman * predicate ( <balanced-paren-list> ) type=T_STRING
137*906afcb8SAndy Fiddaman * otherwise type=<other>
138*906afcb8SAndy Fiddaman */
139*906afcb8SAndy Fiddaman
140*906afcb8SAndy Fiddaman int
pppredargs(void)141*906afcb8SAndy Fiddaman pppredargs(void)
142*906afcb8SAndy Fiddaman {
143*906afcb8SAndy Fiddaman register int c;
144*906afcb8SAndy Fiddaman register int n;
145*906afcb8SAndy Fiddaman register int type;
146*906afcb8SAndy Fiddaman char* pptoken;
147*906afcb8SAndy Fiddaman
148*906afcb8SAndy Fiddaman pptoken = pp.token;
149*906afcb8SAndy Fiddaman pp.token = pp.args;
150*906afcb8SAndy Fiddaman switch (type = pplex())
151*906afcb8SAndy Fiddaman {
152*906afcb8SAndy Fiddaman case '(':
153*906afcb8SAndy Fiddaman type = 0;
154*906afcb8SAndy Fiddaman n = 1;
155*906afcb8SAndy Fiddaman pp.state |= HEADER;
156*906afcb8SAndy Fiddaman pp.state &= ~STRIP;
157*906afcb8SAndy Fiddaman c = pplex();
158*906afcb8SAndy Fiddaman pp.state &= ~NOSPACE;
159*906afcb8SAndy Fiddaman for (;;)
160*906afcb8SAndy Fiddaman {
161*906afcb8SAndy Fiddaman switch (c)
162*906afcb8SAndy Fiddaman {
163*906afcb8SAndy Fiddaman case '(':
164*906afcb8SAndy Fiddaman n++;
165*906afcb8SAndy Fiddaman break;
166*906afcb8SAndy Fiddaman case '\n':
167*906afcb8SAndy Fiddaman ungetchr(c);
168*906afcb8SAndy Fiddaman error(2, "missing %d )%s in predicate argument list", n, n == 1 ? "" : "'s");
169*906afcb8SAndy Fiddaman type = 0;
170*906afcb8SAndy Fiddaman goto done;
171*906afcb8SAndy Fiddaman case ')':
172*906afcb8SAndy Fiddaman if (!--n) goto done;
173*906afcb8SAndy Fiddaman break;
174*906afcb8SAndy Fiddaman }
175*906afcb8SAndy Fiddaman pp.token = pp.toknxt;
176*906afcb8SAndy Fiddaman if (c != ' ')
177*906afcb8SAndy Fiddaman {
178*906afcb8SAndy Fiddaman if (type) type = T_STRING;
179*906afcb8SAndy Fiddaman else type = (c == T_ID) ? T_ID : T_STRING;
180*906afcb8SAndy Fiddaman }
181*906afcb8SAndy Fiddaman c = pplex();
182*906afcb8SAndy Fiddaman }
183*906afcb8SAndy Fiddaman done:
184*906afcb8SAndy Fiddaman pp.state &= ~HEADER;
185*906afcb8SAndy Fiddaman pp.state |= NOSPACE|STRIP;
186*906afcb8SAndy Fiddaman if (pp.token > pp.args && *(pp.token - 1) == ' ') pp.token--;
187*906afcb8SAndy Fiddaman *pp.token = 0;
188*906afcb8SAndy Fiddaman break;
189*906afcb8SAndy Fiddaman case '\n':
190*906afcb8SAndy Fiddaman ungetchr('\n');
191*906afcb8SAndy Fiddaman type = 0;
192*906afcb8SAndy Fiddaman break;
193*906afcb8SAndy Fiddaman }
194*906afcb8SAndy Fiddaman pp.token = pptoken;
195*906afcb8SAndy Fiddaman return(type);
196*906afcb8SAndy Fiddaman }
197*906afcb8SAndy Fiddaman
198*906afcb8SAndy Fiddaman /*
199*906afcb8SAndy Fiddaman * sync output line number
200*906afcb8SAndy Fiddaman */
201*906afcb8SAndy Fiddaman
202*906afcb8SAndy Fiddaman int
ppsync(void)203*906afcb8SAndy Fiddaman ppsync(void)
204*906afcb8SAndy Fiddaman {
205*906afcb8SAndy Fiddaman long m;
206*906afcb8SAndy Fiddaman
207*906afcb8SAndy Fiddaman if ((pp.state & (ADD|HIDDEN)))
208*906afcb8SAndy Fiddaman {
209*906afcb8SAndy Fiddaman if (pp.state & ADD)
210*906afcb8SAndy Fiddaman {
211*906afcb8SAndy Fiddaman pp.state &= ~ADD;
212*906afcb8SAndy Fiddaman m = pp.addp - pp.addbuf;
213*906afcb8SAndy Fiddaman pp.addp = pp.addbuf;
214*906afcb8SAndy Fiddaman ppprintf("%-.*s", m, pp.addbuf);
215*906afcb8SAndy Fiddaman }
216*906afcb8SAndy Fiddaman if (pp.linesync)
217*906afcb8SAndy Fiddaman {
218*906afcb8SAndy Fiddaman if ((pp.state & SYNCLINE) || pp.hidden >= MAXHIDDEN)
219*906afcb8SAndy Fiddaman {
220*906afcb8SAndy Fiddaman pp.hidden = 0;
221*906afcb8SAndy Fiddaman pp.state &= ~(HIDDEN|SYNCLINE);
222*906afcb8SAndy Fiddaman if (error_info.line)
223*906afcb8SAndy Fiddaman (*pp.linesync)(error_info.line, error_info.file);
224*906afcb8SAndy Fiddaman }
225*906afcb8SAndy Fiddaman else
226*906afcb8SAndy Fiddaman {
227*906afcb8SAndy Fiddaman m = pp.hidden;
228*906afcb8SAndy Fiddaman pp.hidden = 0;
229*906afcb8SAndy Fiddaman pp.state &= ~HIDDEN;
230*906afcb8SAndy Fiddaman while (m-- > 0)
231*906afcb8SAndy Fiddaman ppputchar('\n');
232*906afcb8SAndy Fiddaman }
233*906afcb8SAndy Fiddaman }
234*906afcb8SAndy Fiddaman else
235*906afcb8SAndy Fiddaman {
236*906afcb8SAndy Fiddaman pp.hidden = 0;
237*906afcb8SAndy Fiddaman pp.state &= ~HIDDEN;
238*906afcb8SAndy Fiddaman ppputchar('\n');
239*906afcb8SAndy Fiddaman }
240*906afcb8SAndy Fiddaman }
241*906afcb8SAndy Fiddaman return 0;
242*906afcb8SAndy Fiddaman }
243