/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 * 
 *************************************************************/
/* $Id: cpp.h,v 1.4 2006-06-20 05:07:28 hr Exp $ */
       
#define	INS			32768	/* input buffer								*/
#define	OBS			8092    /* outbut buffer							*/
#define	NARG		32      /* Max number arguments to a macro			*/
#define	NINCLUDE	48      /* Max number of include directories (-I)	*/
#define	NIF			64		/* depth of nesting of #if					*/
#define	NINC		32		/* depth of nesting of #include				*/

#ifndef EOF             
#define	EOF	(-1)
#endif                                         

#ifndef NULL               
#define NULL	0
#endif

typedef unsigned char uchar;

enum toktype
{
    END, UNCLASS, NAME, NUMBER, STRING, CCON, NL, WS, DSHARP,
    EQ, NEQ, LEQ, GEQ, LSH, RSH, LAND, LOR, PPLUS, MMINUS,
    ARROW, SBRA, SKET, LP, RP, DOT, AND, STAR, PLUS, MINUS,
    TILDE, NOT, SLASH, PCT, LT, GT, CIRC, OR, QUEST,
    COLON, ASGN, COMMA, SHARP, SEMIC, CBRA, CKET,
    ASPLUS, ASMINUS, ASSTAR, ASSLASH, ASPCT, ASCIRC, ASLSH,
    ASRSH, ASOR, ASAND, ELLIPS,
    DSHARP1, NAME1, NAME2, DEFINED, UMINUS, ARCHITECTURE, IDENT,
	COMMENT
};

enum kwtype
{
    KIF, KIFDEF, KIFNDEF, KELIF, KELSE, KENDIF, KINCLUDE, KINCLUDENEXT,
    KIMPORT, KDEFINE, KUNDEF, KLINE, KERROR, KPRAGMA, KIDENT, KDEFINED, 
	KMACHINE, KLINENO, KFILE, KDATE, KTIME, KSTDC, KEVAL
};

#define	ISDEFINED		0x01            /* has #defined value */
#define	ISKW			0x02            /* is PP keyword */
#define	ISUNCHANGE		0x04            /* can't be #defined in PP */
#define	ISMAC			0x08            /* builtin macro, e.g. __LINE__ */
#define	ISARCHITECTURE	0x10            /* architecture */
#define ISACTIVE        0x80            /* is macro currently expanded */

#define	EOB		0xFE                    /* sentinel for end of input buffer */
#define	EOFC	0xFD                    /* sentinel for end of input file */
#define	XPWS	1                       /* token flag: white space to assure token sep. */
#define XTWS	2

typedef struct token
{
    unsigned char type;
    unsigned char flag;
    unsigned int wslen;
    unsigned int len;
	uchar *t;
	unsigned int identifier;			/* used from macro processor to identify where a macro becomes valid again. */
}   Token;

typedef struct tokenrow
{
	Token *tp;                          /* current one to scan */
	Token *bp;                          /* base (allocated value) */
	Token *lp;                          /* last+1 token used */
	int max;                            /* number allocated */
}   Tokenrow;

typedef struct source
{
	char *filename;                     /* name of file of the source */
	int line;                           /* current line number */
	int lineinc;                        /* adjustment for \\n lines */
	uchar *inb;                         /* input buffer */
	uchar *inp;                         /* input pointer */
	uchar *inl;                         /* end of input */
	int fd;                             /* input source */
	int ifdepth;                        /* conditional nesting in include */
	int pathdepth;
	int wrap;
	struct source *next;                /* stack for #include */
}   Source;

typedef struct nlist
{
	struct nlist *next;
	uchar *name;
	int len;
	Tokenrow *vp;                       /* value as macro */
	Tokenrow *ap;                       /* list of argument names, if any */
	char val;                           /* value as preprocessor name */
	char flag;                          /* is defined, is pp name */
	uchar *loc;							/* location of definition */
}   Nlist;

typedef struct includelist
{
	char deleted;
	char always;
	char *file;
}   Includelist;

typedef struct wraplist
{
	char *file;
}   Wraplist;

#define	new(t)	(t *)domalloc(sizeof(t))
#define	quicklook(a,b)	(namebit[(a)&077] & (1<<((b)&037)))
#define	quickset(a,b)	namebit[(a)&077] |= (1<<((b)&037))
extern unsigned long namebit[077 + 1];

enum errtype
{
	INFO, WARNING, ERROR, FATAL
};


typedef struct macroValidator
{
	Nlist *				pMacro;
	unsigned int		nTokenWhereMacroBecomesValid;
	struct macroValidator *
						pNext;
} MacroValidator;
typedef struct mvl
{
	MacroValidator * pFirst;
    unsigned int	 nextFreeIdentifier;
} MacroValidatorList;

void		mvl_init(
				MacroValidatorList *
								out_pValidators);
void		mvl_destruct(
				MacroValidatorList *
								out_pValidators);
/* 	Adds MacroValidator to the list.
*/
void 		mvl_add(
				MacroValidatorList *
								inout_pValidators,
				Nlist *         in_pMacro,
				Token *			in_pTokenWhereMacroBecomesValid);
/* 	Updates all token pointers within the list, when the tokens have
	moved, by
		pTokenWhereMacroBecomesValid += in_nNrofTokens;
	.

void		mvl_move(
				MacroValidatorList *
								inout_pValidators,
				int				in_nSpace);	// in pointer units.
*/
/*	Checks if one of the validators within the list points to
	the token in_pTokenToCheck. If so, the macro is set valid and
	the validator is removed.
*/
void		mvl_check(
				MacroValidatorList *
								inout_pValidators,
				Token *			inout_pTokenToCheck);

void tokenrow_zeroTokenIdentifiers(Tokenrow* trp);

void expandlex(void);
void fixlex(void);
void setup(int, char **);
int gettokens(Tokenrow *, int);
int comparetokens(Tokenrow *, Tokenrow *);
Source *setsource(char *, int, int, char *, int);
void unsetsource(void);
void puttokens(Tokenrow *);
void process(Tokenrow *);
void *domalloc(int);
void dofree(void *);
void error(enum errtype, char *,...);
void flushout(void);
int fillbuf(Source *);
int trigraph(Source *);
int foldline(Source *);
Nlist *lookup(Token *, int);
void control(Tokenrow *);
void dodefine(Tokenrow *);
void doadefine(Tokenrow *, int);
void doinclude(Tokenrow *, int, int);
void doif(Tokenrow *, enum kwtype);
void expand(Tokenrow *, Nlist *, MacroValidatorList *);
void builtin(Tokenrow *, int);
int gatherargs(Tokenrow *, Tokenrow **, int *);
void substargs(Nlist *, Tokenrow *, Tokenrow **);
void expandrow(Tokenrow *, char *);
void maketokenrow(int, Tokenrow *);
Tokenrow *copytokenrow(Tokenrow *, Tokenrow *);
Token *growtokenrow(Tokenrow *);
Tokenrow *normtokenrow(Tokenrow *);
void adjustrow(Tokenrow *, int);
void movetokenrow(Tokenrow *, Tokenrow *);
void insertrow(Tokenrow *, int, Tokenrow *);
void peektokens(Tokenrow *, char *);
void doconcat(Tokenrow *);
Tokenrow *stringify(Tokenrow *);
int lookuparg(Nlist *, Token *);
long eval(Tokenrow *, int);
void genline(void);
void genimport(char *, int, char *, int);
void genwrap(int);
void setempty(Tokenrow *);
void makespace(Tokenrow *, Token *);
char *outnum(char *, int);
int digit(int);
uchar *newstring(uchar *, int, int);

#define	rowlen(tokrow)	((tokrow)->lp - (tokrow)->bp)

extern char *outptr;
extern Token nltoken;
extern Source *cursource;
extern char *curtime;
extern int incdepth;
extern int ifdepth;
extern int ifsatisfied[NIF];
extern int Mflag;
extern int Iflag;
extern int Pflag;
extern int Aflag;
extern int Lflag;
extern int Xflag;
extern int Vflag;
extern int Cflag;
extern int Dflag;
extern int Cplusplus;
extern int skipping;
extern Nlist *kwdefined;
extern Includelist includelist[NINCLUDE];
extern Wraplist wraplist[NINCLUDE];
extern char wd[];

