1 /*********************************************************************** 2 * * 3 * This software is part of the ast package * 4 * Copyright (c) 1986-2007 AT&T Knowledge Ventures * 5 * and is licensed under the * 6 * Common Public License, Version 1.0 * 7 * by AT&T Knowledge Ventures * 8 * * 9 * A copy of the License is available at * 10 * http://www.opensource.org/licenses/cpl1.0.txt * 11 * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 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 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