pp.h revision da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Copyright (c) 1986-2007 AT&T Knowledge Ventures *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* by AT&T Knowledge Ventures *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Glenn Fowler
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Research
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * preprocessor library public definitions
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * undo old nmake cpp name-space intrusion
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * this disables __LINE__, __FILE__, __DATE__ and __TIME__
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define Sfio_t char
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PPDEFAULT "pp_default.h" /* runtime definitions */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PPSTANDARD "/usr/include" /* standard include dir */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#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)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define pplastout() ((pp.outp>pp.outbuf)?*(pp.outp-1):pp.lastout)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ppflushout() do{if(pp.outp>pp.outbuf){PPWRITE(pp.outp-pp.outbuf);pp.outp=pp.outbuf;}}while(0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#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)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ppsymget(t,n) (struct ppsymbol*)hashlook(t,n,HASH_LOOKUP,NiL)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ppsymref(t,n) (struct ppsymbol*)hashlook(t,n,pp.truncate?HASH_LOOKUP:HASH_LOOKUP|HASH_INTERNAL,NiL)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ppsymset(t,n) (struct ppsymbol*)hashlook(t,n,HASH_CREATE|HASH_SIZE(sizeof(struct ppsymbol)),NiL)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define REF_CREATE (REF_NORMAL+1) /* include wrapper (internal) */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define REF_DELETE (REF_NORMAL+2) /* macro definition (internal) */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SYM_DISABLED (1L<<2) /* macro expansion disabled */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SYM_EMPTY (1L<<3) /* allow empty/missing actuals */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SYM_NOEXPAND (1L<<11) /* no identifiers in macro body */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SYM_NOTICED (1L<<12) /* symbol noticed in output */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SYM_VARIADIC (1L<<17) /* variadic macro with args */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define SYM_UNUSED 24 /* first unused symbol flag bit */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PP_LINEFILE 27 /* line sync requires file arg */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PP_LINETYPE 29 /* # extra line sync type args */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PP_PASSTHROUGH 38 /* ppcpp() expands # lines only */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PP_PEDANTIC 39 /* pedantic non-hosted warnings */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PP_SPACEOUT 51 /* pplex returns space,newline */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PP_TRANSITION 57 /* on COMPATIBILITY boundary */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PP_compatibility (1<<1) /* PP_COMPATIBILITY is set */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PP_linefile (1<<4) /* line sync file arg required */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PP_linehosted (1<<5) /* line sync hosted arg required*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PP_lineignore (1<<6) /* line sync for ignored file */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PP_linetype (1<<7) /* line sync type arg required */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PP_deps_file (1<<1) /* write deps to separate file */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PP_deps_generated (1<<2) /* missing deps are generated */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PP_deps_local (1<<3) /* only local header deps */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PP_sync_ignore '3' /* [3] ignored include file */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PP_sync_hosted '3' /* [4] hosted include file */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PP_SYNC_PUSH (1<<0) /* pp.incref PP_sync_push type */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PP_SYNC_POP (1<<1) /* pp.incref PP_sync_pop type */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PP_SYNC_IGNORE (1<<2) /* pp.incref PP_sync_ignore type*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PP_SYNC_HOSTED (1<<3) /* pp.incref PP_sync_hosted type*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define PP_SYNC_INSERT (1<<4) /* pinserted by other means */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * numeric modifiers
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * NOTE: 0400 is claimed by error in yacc
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * (N_PP+30) is the largest valid pp token
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * free tokens start at T_TOKEN
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * NOTE: preserve the token ranges and encodings for is*(x)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ppisinteger(x) (((x)&(N_TEST|N_REAL))==N_NUMBER)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ppisreal(x) (((x)&(N_TEST|N_REAL))==(N_NUMBER|N_REAL))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ppisseparate(x) (((x)>=N_PP)&&((x)<=T_WSTRING)||((x)>=N_NUMBER)||((x)=='+')||((x)=='-'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !defined(T_DOUBLE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * numeric constants
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define T_HEXADECIMAL_U (N_NUMBER|N_HEXADECIMAL|N_UNSIGNED)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define T_HEXADECIMAL_UL (N_NUMBER|N_HEXADECIMAL|N_UNSIGNED|N_LONG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define T_HEXDOUBLE_L (N_NUMBER|N_HEXADECIMAL|N_REAL|N_LONG)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * identifier and invalid token
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * quoted constants
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * multichar operators
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * C++ tokens
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * compiler tokens
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * start of free tokens
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct ppdirs* stddirs; /* next is the <...> dir list */ \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct ppsymbol* symbol; /* last symbol if PP_COMPILE */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* exposed for the output macros */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * library interface globals
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern char ppctype[];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int ppargs(char**, int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern void ppcpp(void);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern void ppcomment(char*, char*, char*, int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern void* ppcontext(void*, int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern void pperror(int, ...);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern void ppincref(char*, char*, int, int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern void ppinput(char*, char*, int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int pplex(void);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern void ppline(int, char*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern void ppmacref(struct ppsymbol*, char*, int, int, unsigned long);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern void ppop(int, ...);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern void pppragma(char*, char*, char*, char*, int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int ppprintf(char*, ...);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinextern int ppsync(void);