1 /***********************************************************************
2 * *
3 * This software is part of the ast package *
4 * Copyright (c) 1986-2011 AT&T Intellectual Property *
5 * and is licensed under the *
6 * Eclipse Public License, Version 1.0 *
7 * by AT&T Intellectual Property *
8 * *
9 * A copy of the License is available at *
10 * http://www.eclipse.org/org/documents/epl-v10.html *
11 * (with md5 checksum b35adb5213ca9657e911e9befb180842) *
12 * *
13 * Information and Software Systems Research *
14 * AT&T Research *
15 * Florham Park NJ *
16 * *
17 * Glenn Fowler <gsf@research.att.com> *
18 * *
19 ***********************************************************************/
20 #pragma prototyped
21 /*
22 * Glenn Fowler
23 * AT&T Research
24 *
25 * common preprocessor macro reference handler
26 */
27
28 #include "pplib.h"
29
30 void
ppmacref(struct ppsymbol * sym,char * file,int line,int type,unsigned long sum)31 ppmacref(struct ppsymbol* sym, char* file, int line, int type, unsigned long sum)
32 {
33 register char* p;
34
35 NoP(file);
36 NoP(line);
37 p = (pp.state & (DIRECTIVE|JOINING)) == DIRECTIVE ? pp.outp : pp.addp;
38 p += sfsprintf(p, MAXTOKEN, "\n#%s %d", pp.lineid, error_info.line);
39 p += sfsprintf(p, MAXTOKEN, "\n#%s %s:%s %s %d", dirname(PRAGMA), pp.pass, keyname(X_MACREF), sym->name, type);
40 if (type > 0)
41 {
42 if (sym->macro && sym->macro->value)
43 sum = strsum(sym->macro->value, (long)sym->macro->arity);
44 p += sfsprintf(p, MAXTOKEN, " %lu", sum);
45 }
46 if ((pp.state & (DIRECTIVE|JOINING)) == DIRECTIVE)
47 {
48 pp.outp = p;
49 ppcheckout();
50 }
51 else
52 {
53 *p++ = '\n';
54 pp.addp = p;
55 pp.state |= ADD;
56 }
57 pp.pending = pppendout();
58 }
59