xref: /titanic_54/usr/src/contrib/ast/src/lib/libpp/ppmisc.c (revision 906afcb89d0412cc073b95c2d701a804a8cdb62c)
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