xref: /titanic_53/usr/src/contrib/ast/src/lib/libpp/ppline.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-2012 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  * common preprocessor line sync handler
26*906afcb8SAndy Fiddaman  */
27*906afcb8SAndy Fiddaman 
28*906afcb8SAndy Fiddaman #include "pplib.h"
29*906afcb8SAndy Fiddaman 
30*906afcb8SAndy Fiddaman void
ppline(int line,char * file)31*906afcb8SAndy Fiddaman ppline(int line, char* file)
32*906afcb8SAndy Fiddaman {
33*906afcb8SAndy Fiddaman 	char*		s;
34*906afcb8SAndy Fiddaman 	static char	type[5];
35*906afcb8SAndy Fiddaman 
36*906afcb8SAndy Fiddaman 	if (pp.flags & PP_lineignore)
37*906afcb8SAndy Fiddaman 	{
38*906afcb8SAndy Fiddaman 		pp.flags &= ~PP_lineignore;
39*906afcb8SAndy Fiddaman 		if (!(pp.flags & PP_linetype) || *pp.lineid)
40*906afcb8SAndy Fiddaman 		{
41*906afcb8SAndy Fiddaman 			ppline(1, file);
42*906afcb8SAndy Fiddaman 			file = error_info.file;
43*906afcb8SAndy Fiddaman 		}
44*906afcb8SAndy Fiddaman 		else
45*906afcb8SAndy Fiddaman 			type[1] = PP_sync_ignore;
46*906afcb8SAndy Fiddaman 	}
47*906afcb8SAndy Fiddaman 	else if (file != pp.lastfile)
48*906afcb8SAndy Fiddaman 	{
49*906afcb8SAndy Fiddaman 		if (!pp.firstfile)
50*906afcb8SAndy Fiddaman 			pp.firstfile = file;
51*906afcb8SAndy Fiddaman 		type[1] = ((pp.flags & PP_linetype) && !*pp.lineid && pp.lastfile) ? (line <= 1 ? (file == pp.firstfile ? PP_sync : PP_sync_push) : PP_sync_pop) : PP_sync;
52*906afcb8SAndy Fiddaman 		pp.lastfile = file;
53*906afcb8SAndy Fiddaman 	}
54*906afcb8SAndy Fiddaman 	else
55*906afcb8SAndy Fiddaman 	{
56*906afcb8SAndy Fiddaman 		if (!(pp.flags & PP_linefile))
57*906afcb8SAndy Fiddaman 			file = 0;
58*906afcb8SAndy Fiddaman 		type[1] = ((pp.flags & (PP_hosted|PP_linehosted)) == (PP_hosted|PP_linehosted)) ? PP_sync_hosted : PP_sync;
59*906afcb8SAndy Fiddaman 	}
60*906afcb8SAndy Fiddaman 	if (!(pp.flags & PP_linetype) || *pp.lineid || type[1] == PP_sync)
61*906afcb8SAndy Fiddaman 		type[0] = 0;
62*906afcb8SAndy Fiddaman 	else
63*906afcb8SAndy Fiddaman 	{
64*906afcb8SAndy Fiddaman 		type[0] = ' ';
65*906afcb8SAndy Fiddaman 		if ((pp.flags & (PP_hosted|PP_linehosted)) == (PP_hosted|PP_linehosted) && type[1] != PP_sync_hosted)
66*906afcb8SAndy Fiddaman 		{
67*906afcb8SAndy Fiddaman 			type[2] = ' ';
68*906afcb8SAndy Fiddaman 			type[3] = PP_sync_hosted;
69*906afcb8SAndy Fiddaman 		}
70*906afcb8SAndy Fiddaman 		else
71*906afcb8SAndy Fiddaman 			type[2] = 0;
72*906afcb8SAndy Fiddaman 	}
73*906afcb8SAndy Fiddaman 
74*906afcb8SAndy Fiddaman 	/*
75*906afcb8SAndy Fiddaman 	 * some front ends can't handle two line syncs in a row
76*906afcb8SAndy Fiddaman 	 */
77*906afcb8SAndy Fiddaman 
78*906afcb8SAndy Fiddaman 	if (pp.pending == pppendout() || pplastout() != '\n')
79*906afcb8SAndy Fiddaman 		ppputchar('\n');
80*906afcb8SAndy Fiddaman 	if (file)
81*906afcb8SAndy Fiddaman 		ppprintf("#%s %d \"%s\"%s\n", pp.lineid, line, (pp.flags & PP_linebase) && (s = strrchr(file, '/')) ? s + 1 : file, type);
82*906afcb8SAndy Fiddaman 	else
83*906afcb8SAndy Fiddaman 		ppprintf("#%s %d\n", pp.lineid, line);
84*906afcb8SAndy Fiddaman 	if (!pp.macref)
85*906afcb8SAndy Fiddaman 		pp.pending = pppendout();
86*906afcb8SAndy Fiddaman }
87