1*da2e3ebdSchin /*********************************************************************** 2*da2e3ebdSchin * * 3*da2e3ebdSchin * This software is part of the ast package * 4*da2e3ebdSchin * Copyright (c) 1986-2007 AT&T Knowledge Ventures * 5*da2e3ebdSchin * and is licensed under the * 6*da2e3ebdSchin * Common Public License, Version 1.0 * 7*da2e3ebdSchin * by AT&T Knowledge Ventures * 8*da2e3ebdSchin * * 9*da2e3ebdSchin * A copy of the License is available at * 10*da2e3ebdSchin * http://www.opensource.org/licenses/cpl1.0.txt * 11*da2e3ebdSchin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 12*da2e3ebdSchin * * 13*da2e3ebdSchin * Information and Software Systems Research * 14*da2e3ebdSchin * AT&T Research * 15*da2e3ebdSchin * Florham Park NJ * 16*da2e3ebdSchin * * 17*da2e3ebdSchin * Glenn Fowler <gsf@research.att.com> * 18*da2e3ebdSchin * * 19*da2e3ebdSchin ***********************************************************************/ 20*da2e3ebdSchin #pragma prototyped 21*da2e3ebdSchin /* 22*da2e3ebdSchin * Glenn Fowler 23*da2e3ebdSchin * AT&T Research 24*da2e3ebdSchin * 25*da2e3ebdSchin * preprocessor library public definitions 26*da2e3ebdSchin */ 27*da2e3ebdSchin 28*da2e3ebdSchin #ifndef _PP_H 29*da2e3ebdSchin #define _PP_H 30*da2e3ebdSchin 31*da2e3ebdSchin #ifdef ppsymbol 32*da2e3ebdSchin /* 33*da2e3ebdSchin * undo old nmake cpp name-space intrusion 34*da2e3ebdSchin * this disables __LINE__, __FILE__, __DATE__ and __TIME__ 35*da2e3ebdSchin */ 36*da2e3ebdSchin #undef ppsymbol 37*da2e3ebdSchin #undef __LINE__ 38*da2e3ebdSchin #define __LINE__ 0 39*da2e3ebdSchin #undef __FILE__ 40*da2e3ebdSchin #define __FILE__ "libpp" 41*da2e3ebdSchin #undef __DATE__ 42*da2e3ebdSchin #define __DATE__ "MMM DD YYYY" 43*da2e3ebdSchin #undef __TIME__ 44*da2e3ebdSchin #define __TIME__ "HH:MM:SS" 45*da2e3ebdSchin #endif 46*da2e3ebdSchin 47*da2e3ebdSchin 48*da2e3ebdSchin #if PROTOMAIN 49*da2e3ebdSchin #define HASH_HEADER int hash_header 50*da2e3ebdSchin #define Hash_table_t char 51*da2e3ebdSchin #define Sfio_t char 52*da2e3ebdSchin #define CC_bel (('A'==0301)?0057:0007) 53*da2e3ebdSchin #define CC_esc (('A'==0301)?0047:0033) 54*da2e3ebdSchin #define CC_vt 0013 55*da2e3ebdSchin #else 56*da2e3ebdSchin #include <limits.h> 57*da2e3ebdSchin #include <hash.h> 58*da2e3ebdSchin #include <error.h> 59*da2e3ebdSchin #include <ccode.h> 60*da2e3ebdSchin #endif 61*da2e3ebdSchin 62*da2e3ebdSchin #define PPDEFAULT "pp_default.h" /* runtime definitions */ 63*da2e3ebdSchin #define PPPROBE "cc" /* default probe key */ 64*da2e3ebdSchin #define PPSTANDARD "/usr/include" /* standard include dir */ 65*da2e3ebdSchin 66*da2e3ebdSchin #define PPBLKSIZ 1024 /* unit block size */ 67*da2e3ebdSchin #define PPBAKSIZ (1*PPBLKSIZ) /* input pushback size */ 68*da2e3ebdSchin #define PPBUFSIZ (32*PPBLKSIZ) /* io buffer size */ 69*da2e3ebdSchin #define PPTOKSIZ ((PPBUFSIZ/2)-1) /* max token size */ 70*da2e3ebdSchin 71*da2e3ebdSchin #define PPWRITE(n) do{if(write(1,pp.outbuf,n)!=(n))pperror(ERROR_SYSTEM|3,"%s: write error",pp.outfile);pp.offset+=(n);pp.lastout=pp.outbuf[n-1];}while(0) 72*da2e3ebdSchin 73*da2e3ebdSchin #define pplastout() ((pp.outp>pp.outbuf)?*(pp.outp-1):pp.lastout) 74*da2e3ebdSchin #define ppoffset() (pp.offset+pppendout()) 75*da2e3ebdSchin #define pppendout() (pp.outp-pp.outbuf) 76*da2e3ebdSchin #define ppputchar(c) (*pp.outp++=(c)) 77*da2e3ebdSchin #define ppflushout() do{if(pp.outp>pp.outbuf){PPWRITE(pp.outp-pp.outbuf);pp.outp=pp.outbuf;}}while(0) 78*da2e3ebdSchin #define ppcheckout() do{if(pp.outp>pp.oute){PPWRITE(PPBUFSIZ);if(pp.outbuf==pp.outb){pp.outbuf+=PPBUFSIZ;pp.oute+=PPBUFSIZ;}else{pp.outbuf-=PPBUFSIZ;memcpy(pp.outbuf,pp.oute,pp.outp-pp.oute);pp.oute-=PPBUFSIZ;pp.outp-=2*PPBUFSIZ;}}}while(0) 79*da2e3ebdSchin 80*da2e3ebdSchin #define ppsymget(t,n) (struct ppsymbol*)hashlook(t,n,HASH_LOOKUP,NiL) 81*da2e3ebdSchin #define ppsymref(t,n) (struct ppsymbol*)hashlook(t,n,pp.truncate?HASH_LOOKUP:HASH_LOOKUP|HASH_INTERNAL,NiL) 82*da2e3ebdSchin #define ppsymset(t,n) (struct ppsymbol*)hashlook(t,n,HASH_CREATE|HASH_SIZE(sizeof(struct ppsymbol)),NiL) 83*da2e3ebdSchin 84*da2e3ebdSchin #if CHAR_MIN < 0 85*da2e3ebdSchin #define pptype (ppctype-(CHAR_MIN)+1) 86*da2e3ebdSchin #else 87*da2e3ebdSchin #define pptype (ppctype) 88*da2e3ebdSchin #endif 89*da2e3ebdSchin 90*da2e3ebdSchin #define C_ID (1<<0) 91*da2e3ebdSchin #define C_DIG (1<<1) 92*da2e3ebdSchin #define C_SPLICE (1<<2) 93*da2e3ebdSchin 94*da2e3ebdSchin #define ppisdig(c) ((pptype)[c]&C_DIG) 95*da2e3ebdSchin #define ppisid(c) ((pptype)[c]&C_ID) 96*da2e3ebdSchin #define ppisidig(c) ((pptype)[c]&(C_ID|C_DIG)) 97*da2e3ebdSchin #define ppismac(c) ((pptype)[c]&(C_ID|C_DIG|C_SPLICE)) 98*da2e3ebdSchin #define ppissplice(c) ((pptype)[c]&C_SPLICE) 99*da2e3ebdSchin 100*da2e3ebdSchin #define setid(c) ((pptype)[c]|=C_ID) 101*da2e3ebdSchin #define clrid(c) ((pptype)[c]&=~C_ID) 102*da2e3ebdSchin #define setdig(c) ((pptype)[c]|=C_DIG) 103*da2e3ebdSchin #define setsplice(c) ((pptype)[c]|=C_SPLICE) 104*da2e3ebdSchin 105*da2e3ebdSchin #define REF_CREATE (REF_NORMAL+1) /* include wrapper (internal) */ 106*da2e3ebdSchin #define REF_DELETE (REF_NORMAL+2) /* macro definition (internal) */ 107*da2e3ebdSchin #define REF_NORMAL 0 /* normal macro reference */ 108*da2e3ebdSchin #define REF_IF (-1) /* if, ifdef, ifndef, elif */ 109*da2e3ebdSchin #define REF_UNDEF (-2) /* undef */ 110*da2e3ebdSchin 111*da2e3ebdSchin #define SYM_ACTIVE (1L<<0) /* active macro lock */ 112*da2e3ebdSchin #define SYM_BUILTIN (1L<<1) /* builtin macro */ 113*da2e3ebdSchin #define SYM_DISABLED (1L<<2) /* macro expansion disabled */ 114*da2e3ebdSchin #define SYM_EMPTY (1L<<3) /* allow empty/missing actuals */ 115*da2e3ebdSchin #define SYM_FINAL (1L<<4) /* final hosted value */ 116*da2e3ebdSchin #define SYM_FUNCTION (1L<<5) /* macro with args */ 117*da2e3ebdSchin #define SYM_INIT (1L<<6) /* initialization macro */ 118*da2e3ebdSchin #define SYM_INITIAL (1L<<7) /* initial hosted value */ 119*da2e3ebdSchin #define SYM_KEYWORD (1L<<8) /* keyword identifier */ 120*da2e3ebdSchin #define SYM_LEX (1L<<9) /* ppsymkey with lex field */ 121*da2e3ebdSchin #define SYM_MULTILINE (1L<<10) /* multi-line macro */ 122*da2e3ebdSchin #define SYM_NOEXPAND (1L<<11) /* no identifiers in macro body */ 123*da2e3ebdSchin #define SYM_NOTICED (1L<<12) /* symbol noticed in output */ 124*da2e3ebdSchin #define SYM_PREDEFINED (1L<<13) /* predefined macro */ 125*da2e3ebdSchin #define SYM_PREDICATE (1L<<14) /* also a predicate */ 126*da2e3ebdSchin #define SYM_READONLY (1L<<15) /* readonly macro */ 127*da2e3ebdSchin #define SYM_REDEFINE (1L<<16) /* ok to redefine */ 128*da2e3ebdSchin #define SYM_VARIADIC (1L<<17) /* variadic macro with args */ 129*da2e3ebdSchin #define SYM_UNUSED 24 /* first unused symbol flag bit */ 130*da2e3ebdSchin 131*da2e3ebdSchin #define PP_ASSERT 1 /* preassert symbol */ 132*da2e3ebdSchin #define PP_BUILTIN 2 /* #(<id>) handler */ 133*da2e3ebdSchin #define PP_CDIR 3 /* C (vs. C++) file dirs follow */ 134*da2e3ebdSchin #define PP_CHOP 4 /* include prefix chop */ 135*da2e3ebdSchin #define PP_COMMENT 5 /* passed comment handler */ 136*da2e3ebdSchin #define PP_COMPATIBILITY 6 /* old (Reiser) dialect */ 137*da2e3ebdSchin #define PP_COMPILE 7 /* tokenize for front end */ 138*da2e3ebdSchin #define PP_DEBUG 8 /* set debug trace level */ 139*da2e3ebdSchin #define PP_DEFINE 9 /* predefine symbol */ 140*da2e3ebdSchin #define PP_DEFAULT 10 /* read default include files */ 141*da2e3ebdSchin #define PP_DIRECTIVE 11 /* initialization directive */ 142*da2e3ebdSchin #define PP_DONE 12 /* all processing done */ 143*da2e3ebdSchin #define PP_DUMP 13 /* do checkpoint dump */ 144*da2e3ebdSchin #define PP_FILEDEPS 14 /* output file dependencies */ 145*da2e3ebdSchin #define PP_FILENAME 15 /* set input file name */ 146*da2e3ebdSchin #define PP_HOSTDIR 16 /* hosted file dirs follow */ 147*da2e3ebdSchin #define PP_ID 17 /* add to identifier set */ 148*da2e3ebdSchin #define PP_IGNORE 18 /* ignore this include file */ 149*da2e3ebdSchin #define PP_IGNORELIST 19 /* include ignore list file */ 150*da2e3ebdSchin #define PP_INCLUDE 20 /* add dir to include search */ 151*da2e3ebdSchin #define PP_INCREF 21 /* include file push/ret handler*/ 152*da2e3ebdSchin #define PP_INIT 22 /* one time initialization */ 153*da2e3ebdSchin #define PP_INPUT 23 /* set input source file */ 154*da2e3ebdSchin #define PP_KEYARGS 24 /* name=value macro args */ 155*da2e3ebdSchin #define PP_LINE 25 /* line sync handler */ 156*da2e3ebdSchin #define PP_LINEBASE 26 /* base name in line sync */ 157*da2e3ebdSchin #define PP_LINEFILE 27 /* line sync requires file arg */ 158*da2e3ebdSchin #define PP_LINEID 28 /* PP_LINE directive id */ 159*da2e3ebdSchin #define PP_LINETYPE 29 /* # extra line sync type args */ 160*da2e3ebdSchin #define PP_LOCAL 30 /* previous PP_INCLUDE for "" */ 161*da2e3ebdSchin #define PP_MACREF 31 /* macro def/ref handler */ 162*da2e3ebdSchin #define PP_MULTIPLE 32 /* set all files multiple */ 163*da2e3ebdSchin #define PP_NOHASH 33 /* don't hash PP_COMPILE T_ID's */ 164*da2e3ebdSchin #define PP_NOISE 34 /* convert T_X_* to T_NOISE */ 165*da2e3ebdSchin #define PP_OPTION 35 /* set pragma option */ 166*da2e3ebdSchin #define PP_OPTARG 36 /* unknown option arg handler */ 167*da2e3ebdSchin #define PP_OUTPUT 37 /* set output file sink */ 168*da2e3ebdSchin #define PP_PASSTHROUGH 38 /* ppcpp() expands # lines only */ 169*da2e3ebdSchin #define PP_PEDANTIC 39 /* pedantic non-hosted warnings */ 170*da2e3ebdSchin #define PP_PLUSCOMMENT 40 /* enable C++ comments */ 171*da2e3ebdSchin #define PP_PLUSPLUS 41 /* tokenize for C++ */ 172*da2e3ebdSchin #define PP_POOL 42 /* pool for multiple io passes */ 173*da2e3ebdSchin #define PP_PRAGMA 43 /* passed pragma handler */ 174*da2e3ebdSchin #define PP_PRAGMAFLAGS 44 /* global pragma flags */ 175*da2e3ebdSchin #define PP_PROBE 45 /* ppdefault probe key */ 176*da2e3ebdSchin #define PP_QUOTE 46 /* add to quote set */ 177*da2e3ebdSchin #define PP_READ 47 /* include file without output */ 178*da2e3ebdSchin #define PP_REGUARD 48 /* file pop emits guard define */ 179*da2e3ebdSchin #define PP_RESERVED 49 /* COMPILE reserved keyword */ 180*da2e3ebdSchin #define PP_RESET 50 /* reset to initiali predefs */ 181*da2e3ebdSchin #define PP_SPACEOUT 51 /* pplex returns space,newline */ 182*da2e3ebdSchin #define PP_STANDALONE 52 /* standalone preprocessor */ 183*da2e3ebdSchin #define PP_STANDARD 53 /* standard include dir */ 184*da2e3ebdSchin #define PP_STRICT 54 /* strict implementation */ 185*da2e3ebdSchin #define PP_TEST 55 /* enable (undocumented) tests */ 186*da2e3ebdSchin #define PP_TEXT 56 /* include file with output */ 187*da2e3ebdSchin #define PP_TRANSITION 57 /* on COMPATIBILITY boundary */ 188*da2e3ebdSchin #define PP_TRUNCATE 58 /* truncate macro names */ 189*da2e3ebdSchin #define PP_UNDEF 59 /* undef symbol after ppdefault */ 190*da2e3ebdSchin #define PP_VENDOR 60 /* vendor file dirs follow */ 191*da2e3ebdSchin #define PP_WARN 61 /* enable annoying warnings */ 192*da2e3ebdSchin 193*da2e3ebdSchin #define PP_comment (1<<0) /* PP_COMMENT is set */ 194*da2e3ebdSchin #define PP_compatibility (1<<1) /* PP_COMPATIBILITY is set */ 195*da2e3ebdSchin #define PP_hosted (1<<2) /* current file is hosted */ 196*da2e3ebdSchin #define PP_linebase (1<<3) /* base name in line sync */ 197*da2e3ebdSchin #define PP_linefile (1<<4) /* line sync file arg required */ 198*da2e3ebdSchin #define PP_linehosted (1<<5) /* line sync hosted arg required*/ 199*da2e3ebdSchin #define PP_lineignore (1<<6) /* line sync for ignored file */ 200*da2e3ebdSchin #define PP_linetype (1<<7) /* line sync type arg required */ 201*da2e3ebdSchin #define PP_strict (1<<8) /* PP_STRICT is set */ 202*da2e3ebdSchin #define PP_transition (1<<9) /* PP_TRANSITION is set */ 203*da2e3ebdSchin 204*da2e3ebdSchin #define PP_deps (1<<0) /* generate header deps */ 205*da2e3ebdSchin #define PP_deps_file (1<<1) /* write deps to separate file */ 206*da2e3ebdSchin #define PP_deps_generated (1<<2) /* missing deps are generated */ 207*da2e3ebdSchin #define PP_deps_local (1<<3) /* only local header deps */ 208*da2e3ebdSchin 209*da2e3ebdSchin #define PP_sync 0 /* normal line sync */ 210*da2e3ebdSchin #define PP_sync_push '1' /* [3] include file push */ 211*da2e3ebdSchin #define PP_sync_pop '2' /* [3] include file pop */ 212*da2e3ebdSchin #define PP_sync_ignore '3' /* [3] ignored include file */ 213*da2e3ebdSchin #define PP_sync_hosted '3' /* [4] hosted include file */ 214*da2e3ebdSchin 215*da2e3ebdSchin #define PP_SYNC_PUSH (1<<0) /* pp.incref PP_sync_push type */ 216*da2e3ebdSchin #define PP_SYNC_POP (1<<1) /* pp.incref PP_sync_pop type */ 217*da2e3ebdSchin #define PP_SYNC_IGNORE (1<<2) /* pp.incref PP_sync_ignore type*/ 218*da2e3ebdSchin #define PP_SYNC_HOSTED (1<<3) /* pp.incref PP_sync_hosted type*/ 219*da2e3ebdSchin #define PP_SYNC_INSERT (1<<4) /* pinserted by other means */ 220*da2e3ebdSchin 221*da2e3ebdSchin /* 222*da2e3ebdSchin * numeric modifiers 223*da2e3ebdSchin * 224*da2e3ebdSchin * NOTE: 0400 is claimed by error in yacc 225*da2e3ebdSchin * (N_PP+30) is the largest valid pp token 226*da2e3ebdSchin * free tokens start at T_TOKEN 227*da2e3ebdSchin */ 228*da2e3ebdSchin 229*da2e3ebdSchin #define N_PP 0401 /* pp tokens 0401..0437 */ 230*da2e3ebdSchin #define N_NUMBER 0440 /* numbers 0440..0477 */ 231*da2e3ebdSchin #define N_TEST (N_NUMBER|07700)/* number test mask */ 232*da2e3ebdSchin #define N_TOKEN 0500 /* free 0500..07777 */ 233*da2e3ebdSchin #define N_WIDE 1 /* wide quoted constant */ 234*da2e3ebdSchin 235*da2e3ebdSchin /* 236*da2e3ebdSchin * NOTE: preserve the token ranges and encodings for is*(x) 237*da2e3ebdSchin */ 238*da2e3ebdSchin 239*da2e3ebdSchin #define ppisnumber(x) (((x)&N_TEST)==N_NUMBER) 240*da2e3ebdSchin #define ppisinteger(x) (((x)&(N_TEST|N_REAL))==N_NUMBER) 241*da2e3ebdSchin #define ppisreal(x) (((x)&(N_TEST|N_REAL))==(N_NUMBER|N_REAL)) 242*da2e3ebdSchin #define ppisassignop(x) (((x)>=T_MPYEQ)&&((x)<=T_OREQ)) 243*da2e3ebdSchin #define ppisseparate(x) (((x)>=N_PP)&&((x)<=T_WSTRING)||((x)>=N_NUMBER)||((x)=='+')||((x)=='-')) 244*da2e3ebdSchin 245*da2e3ebdSchin #define N_LONG 0001 246*da2e3ebdSchin #define N_UNSIGNED 0002 /* if ppisinteger(x) */ 247*da2e3ebdSchin #define N_FLOAT 0002 /* if ppisreal(x) */ 248*da2e3ebdSchin 249*da2e3ebdSchin #define N_REAL 0004 250*da2e3ebdSchin #define N_OCTAL 0010 251*da2e3ebdSchin #define N_HEXADECIMAL 0020 252*da2e3ebdSchin 253*da2e3ebdSchin #define N_EXPONENT 010000 /* for lexing only */ 254*da2e3ebdSchin #define N_SIGN 020000 /* for lexing only */ 255*da2e3ebdSchin #define N_TRAILING 040000 /* for lexing only */ 256*da2e3ebdSchin 257*da2e3ebdSchin #if !defined(T_DOUBLE) 258*da2e3ebdSchin 259*da2e3ebdSchin /* 260*da2e3ebdSchin * numeric constants 261*da2e3ebdSchin */ 262*da2e3ebdSchin 263*da2e3ebdSchin #define T_DOUBLE (N_NUMBER|N_REAL) 264*da2e3ebdSchin #define T_DOUBLE_L (N_NUMBER|N_REAL|N_LONG) 265*da2e3ebdSchin #define T_FLOAT (N_NUMBER|N_REAL|N_FLOAT) 266*da2e3ebdSchin #define T_DECIMAL (N_NUMBER) 267*da2e3ebdSchin #define T_DECIMAL_L (N_NUMBER|N_LONG) 268*da2e3ebdSchin #define T_DECIMAL_U (N_NUMBER|N_UNSIGNED) 269*da2e3ebdSchin #define T_DECIMAL_UL (N_NUMBER|N_UNSIGNED|N_LONG) 270*da2e3ebdSchin #define T_OCTAL (N_NUMBER|N_OCTAL) 271*da2e3ebdSchin #define T_OCTAL_L (N_NUMBER|N_OCTAL|N_LONG) 272*da2e3ebdSchin #define T_OCTAL_U (N_NUMBER|N_OCTAL|N_UNSIGNED) 273*da2e3ebdSchin #define T_OCTAL_UL (N_NUMBER|N_OCTAL|N_UNSIGNED|N_LONG) 274*da2e3ebdSchin #define T_HEXADECIMAL (N_NUMBER|N_HEXADECIMAL) 275*da2e3ebdSchin #define T_HEXADECIMAL_L (N_NUMBER|N_HEXADECIMAL|N_LONG) 276*da2e3ebdSchin #define T_HEXADECIMAL_U (N_NUMBER|N_HEXADECIMAL|N_UNSIGNED) 277*da2e3ebdSchin #define T_HEXADECIMAL_UL (N_NUMBER|N_HEXADECIMAL|N_UNSIGNED|N_LONG) 278*da2e3ebdSchin #define T_HEXDOUBLE (N_NUMBER|N_HEXADECIMAL|N_REAL) 279*da2e3ebdSchin #define T_HEXDOUBLE_L (N_NUMBER|N_HEXADECIMAL|N_REAL|N_LONG) 280*da2e3ebdSchin 281*da2e3ebdSchin /* 282*da2e3ebdSchin * identifier and invalid token 283*da2e3ebdSchin */ 284*da2e3ebdSchin 285*da2e3ebdSchin #define T_ID (N_PP+0) 286*da2e3ebdSchin #define T_INVALID (N_PP+1) 287*da2e3ebdSchin 288*da2e3ebdSchin /* 289*da2e3ebdSchin * quoted constants 290*da2e3ebdSchin */ 291*da2e3ebdSchin 292*da2e3ebdSchin #define T_HEADER (N_PP+2) /* <..> */ 293*da2e3ebdSchin #define T_CHARCONST (N_PP+3) /* '..' */ 294*da2e3ebdSchin #define T_WCHARCONST (T_CHARCONST|N_WIDE) /* L'..' */ 295*da2e3ebdSchin #define T_STRING (N_PP+5) /* ".." */ 296*da2e3ebdSchin #define T_WSTRING (T_STRING|N_WIDE) /* L".." */ 297*da2e3ebdSchin 298*da2e3ebdSchin /* 299*da2e3ebdSchin * multichar operators 300*da2e3ebdSchin */ 301*da2e3ebdSchin 302*da2e3ebdSchin #define T_PTRMEM (N_PP+7) /* -> */ 303*da2e3ebdSchin #define T_ADDADD (N_PP+8) /* ++ */ 304*da2e3ebdSchin #define T_SUBSUB (N_PP+9) /* -- */ 305*da2e3ebdSchin #define T_LSHIFT (N_PP+10) /* << */ 306*da2e3ebdSchin #define T_RSHIFT (N_PP+11) /* >> */ 307*da2e3ebdSchin #define T_LE (N_PP+12) /* <= */ 308*da2e3ebdSchin #define T_GE (N_PP+13) /* >= */ 309*da2e3ebdSchin #define T_EQ (N_PP+14) /* == */ 310*da2e3ebdSchin #define T_NE (N_PP+15) /* != */ 311*da2e3ebdSchin #define T_ANDAND (N_PP+16) /* && */ 312*da2e3ebdSchin #define T_OROR (N_PP+17) /* || */ 313*da2e3ebdSchin #define T_MPYEQ (N_PP+18) /* *= */ 314*da2e3ebdSchin #define T_DIVEQ (N_PP+19) /* /= */ 315*da2e3ebdSchin #define T_MODEQ (N_PP+20) /* %= */ 316*da2e3ebdSchin #define T_ADDEQ (N_PP+21) /* += */ 317*da2e3ebdSchin #define T_SUBEQ (N_PP+22) /* -= */ 318*da2e3ebdSchin #define T_LSHIFTEQ (N_PP+23) /* <<= */ 319*da2e3ebdSchin #define T_RSHIFTEQ (N_PP+24) /* >>= */ 320*da2e3ebdSchin #define T_ANDEQ (N_PP+25) /* &= */ 321*da2e3ebdSchin #define T_XOREQ (N_PP+26) /* ^= */ 322*da2e3ebdSchin #define T_OREQ (N_PP+27) /* |= */ 323*da2e3ebdSchin #define T_TOKCAT (N_PP+28) /* ## */ 324*da2e3ebdSchin #define T_VARIADIC (N_PP+29) /* ... */ 325*da2e3ebdSchin 326*da2e3ebdSchin /* 327*da2e3ebdSchin * C++ tokens 328*da2e3ebdSchin */ 329*da2e3ebdSchin 330*da2e3ebdSchin #define T_DOTREF (N_TOKEN+0) /* .* */ 331*da2e3ebdSchin #define T_PTRMEMREF (N_TOKEN+1) /* ->* */ 332*da2e3ebdSchin #define T_SCOPE (N_TOKEN+2) /* :: */ 333*da2e3ebdSchin 334*da2e3ebdSchin /* 335*da2e3ebdSchin * compiler tokens 336*da2e3ebdSchin */ 337*da2e3ebdSchin 338*da2e3ebdSchin #define T_UMINUS (N_TOKEN+3) 339*da2e3ebdSchin 340*da2e3ebdSchin #endif 341*da2e3ebdSchin 342*da2e3ebdSchin /* 343*da2e3ebdSchin * start of free tokens 344*da2e3ebdSchin */ 345*da2e3ebdSchin 346*da2e3ebdSchin #define T_TOKEN (N_TOKEN+4) 347*da2e3ebdSchin 348*da2e3ebdSchin struct ppdirs /* directory list */ 349*da2e3ebdSchin { 350*da2e3ebdSchin char* name; /* directory name */ 351*da2e3ebdSchin struct ppdirs* next; /* next in list */ 352*da2e3ebdSchin 353*da2e3ebdSchin #ifdef _PP_DIRS_PRIVATE_ 354*da2e3ebdSchin _PP_DIRS_PRIVATE_ 355*da2e3ebdSchin #endif 356*da2e3ebdSchin 357*da2e3ebdSchin }; 358*da2e3ebdSchin 359*da2e3ebdSchin struct ppkeyword /* pp keyword info */ 360*da2e3ebdSchin { 361*da2e3ebdSchin char* name; /* keyword name */ 362*da2e3ebdSchin int value; /* keyword token value */ 363*da2e3ebdSchin }; 364*da2e3ebdSchin 365*da2e3ebdSchin struct ppmacro /* pp macro info */ 366*da2e3ebdSchin { 367*da2e3ebdSchin int arity; /* # formal arguments */ 368*da2e3ebdSchin char* value; /* definition value */ 369*da2e3ebdSchin 370*da2e3ebdSchin #ifdef _PP_MACRO_PRIVATE_ 371*da2e3ebdSchin _PP_MACRO_PRIVATE_ 372*da2e3ebdSchin #endif 373*da2e3ebdSchin 374*da2e3ebdSchin }; 375*da2e3ebdSchin 376*da2e3ebdSchin struct ppsymbol /* pp symbol info */ 377*da2e3ebdSchin { 378*da2e3ebdSchin HASH_HEADER; /* hash stuff and symbol name */ 379*da2e3ebdSchin unsigned long flags; /* SYM_* status */ 380*da2e3ebdSchin struct ppmacro* macro; /* macro info */ 381*da2e3ebdSchin void* value; /* value (for other passes) */ 382*da2e3ebdSchin 383*da2e3ebdSchin #ifdef _PP_SYMBOL_PRIVATE_ 384*da2e3ebdSchin _PP_SYMBOL_PRIVATE_ 385*da2e3ebdSchin #endif 386*da2e3ebdSchin 387*da2e3ebdSchin }; 388*da2e3ebdSchin 389*da2e3ebdSchin #define _PP_CONTEXT_BASE_ ((char*)&pp.lcldirs) 390*da2e3ebdSchin 391*da2e3ebdSchin #define _PP_CONTEXT_PUBLIC_ \ 392*da2e3ebdSchin struct ppdirs* lcldirs; /* the "..." dir list */ \ 393*da2e3ebdSchin struct ppdirs* stddirs; /* next is the <...> dir list */ \ 394*da2e3ebdSchin int flags; /* PP_[a-z]* flags */ \ 395*da2e3ebdSchin Hash_table_t* symtab; /* macro and id hash table */ 396*da2e3ebdSchin 397*da2e3ebdSchin struct ppglobals /* globals accessed by pp.* */ 398*da2e3ebdSchin { 399*da2e3ebdSchin const char* version; /* version stamp */ 400*da2e3ebdSchin char* lineid; /* line sync directive id */ 401*da2e3ebdSchin char* outfile; /* output file name */ 402*da2e3ebdSchin char* pass; /* pass name */ 403*da2e3ebdSchin char* token; /* pplex() token name */ 404*da2e3ebdSchin struct ppsymbol* symbol; /* last symbol if PP_COMPILE */ 405*da2e3ebdSchin 406*da2e3ebdSchin /* exposed for the output macros */ 407*da2e3ebdSchin 408*da2e3ebdSchin char* outb; /* output buffer base */ 409*da2e3ebdSchin char* outbuf; /* output buffer */ 410*da2e3ebdSchin char* outp; /* outbuf pointer */ 411*da2e3ebdSchin char* oute; /* outbuf end */ 412*da2e3ebdSchin unsigned long offset; /* output offset */ 413*da2e3ebdSchin 414*da2e3ebdSchin #ifdef _PP_CONTEXT_PUBLIC_ 415*da2e3ebdSchin _PP_CONTEXT_PUBLIC_ /* public context */ 416*da2e3ebdSchin #endif 417*da2e3ebdSchin 418*da2e3ebdSchin #ifdef _PP_CONTEXT_PRIVATE_ 419*da2e3ebdSchin _PP_CONTEXT_PRIVATE_ /* library private context */ 420*da2e3ebdSchin #endif 421*da2e3ebdSchin 422*da2e3ebdSchin #ifdef _PP_GLOBALS_PRIVATE_ 423*da2e3ebdSchin _PP_GLOBALS_PRIVATE_ /* library private additions */ 424*da2e3ebdSchin #endif 425*da2e3ebdSchin 426*da2e3ebdSchin }; 427*da2e3ebdSchin 428*da2e3ebdSchin /* 429*da2e3ebdSchin * library interface globals 430*da2e3ebdSchin */ 431*da2e3ebdSchin 432*da2e3ebdSchin #define ppctype _pp_ctype 433*da2e3ebdSchin 434*da2e3ebdSchin extern struct ppglobals pp; 435*da2e3ebdSchin extern char ppctype[]; 436*da2e3ebdSchin 437*da2e3ebdSchin extern int ppargs(char**, int); 438*da2e3ebdSchin extern void ppcpp(void); 439*da2e3ebdSchin extern void ppcomment(char*, char*, char*, int); 440*da2e3ebdSchin extern void* ppcontext(void*, int); 441*da2e3ebdSchin extern void pperror(int, ...); 442*da2e3ebdSchin extern void ppincref(char*, char*, int, int); 443*da2e3ebdSchin extern void ppinput(char*, char*, int); 444*da2e3ebdSchin extern int pplex(void); 445*da2e3ebdSchin extern void ppline(int, char*); 446*da2e3ebdSchin extern void ppmacref(struct ppsymbol*, char*, int, int, unsigned long); 447*da2e3ebdSchin extern void ppop(int, ...); 448*da2e3ebdSchin extern void pppragma(char*, char*, char*, char*, int); 449*da2e3ebdSchin extern int ppprintf(char*, ...); 450*da2e3ebdSchin extern int ppsync(void); 451*da2e3ebdSchin 452*da2e3ebdSchin #endif 453