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