home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.cs.arizona.edu
/
ftp.cs.arizona.edu.tar
/
ftp.cs.arizona.edu
/
icon
/
historic
/
v941.tgz
/
icon.v941src.tar
/
icon.v941src
/
src
/
preproc
/
preproc.h
< prev
next >
Wrap
C/C++ Source or Header
|
2001-12-12
|
7KB
|
203 lines
#include "../h/gsupport.h"
/*
* If Bell is not defined, determine the default value for the "bell"
* character.
*/
#ifndef Bell
#define Bell '\a'
#endif /* Bell */
#define CBufSize 256 /* size of buffer for file input */
/*
* Identification numbers for tokens for which there are no definitions
* generated from a C grammar by yacc.
*/
#define WhiteSpace 1001 /* white space */
#define PpNumber 1002 /* number (integer or real) */
#define PpIf 1003 /* #if */
#define PpElse 1004 /* #else */
#define PpIfdef 1005 /* #ifdef */
#define PpIfndef 1006 /* #ifndef */
#define PpElif 1007 /* #elif */
#define PpEndif 1008 /* #endif */
#define PpInclude 1009 /* #include */
#define PpDefine 1010 /* #define */
#define PpUndef 1011 /* #undef */
#define PpLine 1012 /* #line */
#define PpError 1013 /* #error */
#define PpPragma 1014 /* #pragma */
#define PpPaste 1015 /* ## */
#define PpDirEnd 1016 /* new-line terminating a directive */
#define PpHeader 1017 /* <...> from #include */
#define PpBegdef 1018 /* #begdef */
#define PpEnddef 1019 /* #enddef */
#define PpNull 1020 /* # */
#define PpKeep 1021 /* directive specific to an application, pass along */
#define PpSkip 1022 /* directive specific to an application discard */
#define Invalid 9999 /* marker */
extern char *progname; /* name of this program: for error messages */
extern int line_cntrl; /* flag: are line directives needed in the output */
/*
* whsp_image determines whether the spelling of white space is not retained,
* is retained with each comment replaced by a space, or the full spelling
* of white space and comments is retained.
*/
#define NoSpelling 0
#define NoComment 1
#define FullImage 2
extern int whsp_image;
extern int max_recurse; /* how much recursion is allows in macros */
extern struct token *zero_tok; /* token "0" */
extern struct token *one_tok; /* token "1" */
extern int *first_char; /* first character in tokenizing buffer */
extern int *next_char; /* next character in tokenizing buffer */
extern int *last_char; /* last character in tokenizing buffer */
/*
* Entry in array of preprocessor directive names.
*/
struct rsrvd_wrd {
char *s; /* name (without the #) */
int tok_id; /* token id of directive */
};
/*
* token flags:
*/
#define LineChk 0x1 /* A line directive may be needed in the output */
#define NoExpand 0x2 /* Don't macro expand this identifier */
/*
* Token.
*/
struct token {
int tok_id; /* token identifier */
char *image; /* string image of token */
char *fname; /* file name of origin */
int line; /* line number of origin */
int flag; /* token flag, see above */
};
/*
* Token list.
*/
struct tok_lst {
struct token *t; /* token */
struct tok_lst *next; /* next entry in list */
};
/*
* Identifier list.
*/
struct id_lst {
char *id; /* identifier */
struct id_lst *next; /* next entry in list */
};
/*
* a macro, m, falls into one of several categores:
* those with arguments - m.category = # args >= 0
* those with no arguments - m.category = NoArgs
* those that may not be chaged - m.category = FixedMac
* those that require special handling - m.category = SpecMac
*/
#define NoArgs -1
#define FixedMac -2
#define SpecMac -3
struct macro {
char *mname;
int category;
int multi_line;
struct id_lst *prmlst;
struct tok_lst *body;
int ref_cnt;
int recurse;
struct macro *next;
};
/*
* states for recognizing preprocessor directives
*/
#define Reset 1
#define CanStart 2 /* Just saw a new-line, look for a directive */
#define Within 3 /* Next new-line ends directive */
/*
* Information for a source of tokens created from a character stream.
* The characters may come from a file, or they be in a prefilled buffer.
*/
struct char_src {
FILE *f; /* file, if the chars come directly from a file */
char *fname; /* name of file */
int bufsize; /* size of character buffer */
int *char_buf; /* pointer to character buffer */
int *line_buf; /* buffer of lines characters come from */
int *next_char; /* next unprocessed character in buffer */
int *last_char; /* last character in buffer */
int line_adj; /* line adjustment caused by #line directive */
int dir_state; /* state w.r.t. recognizing directives */
struct token *tok_sav; /* used to save token after look ahead */
};
/*
* Information for a source of tokens dirived from expanding a macro.
*/
struct mac_expand {
struct macro *m; /* the macro being expanded */
struct tok_lst **args; /* list of arguments for macro call */
struct tok_lst **exp_args; /* list of expanded arguments for macro call */
struct tok_lst *rest_bdy; /* position within the body of the macro */
};
/*
* Elements in a list of token lists used for token pasting.
*/
struct paste_lsts {
struct token *trigger; /* the token pasting operator */
struct tok_lst *tlst; /* the token list */
struct paste_lsts *next; /* the next element in the list of lists */
};
/*
* Pointers to various token sources.
*/
union src_ref {
struct char_src *cs; /* source is tokenized characters */
struct mac_expand *me; /* source is macro expansion */
struct tok_lst *tlst; /* source is token list (a macro argument) */
struct paste_lsts *plsts; /* source is token lists for token pasting */
};
/*
* Types of token sources:
*/
#define CharSrc 0 /* tokenized characters */
#define MacExpand 1 /* macro expansion */
#define TokLst 2 /* token list */
#define PasteLsts 4 /* paste last token of 1st list to first of 2nd */
#define DummySrc 5 /* base of stack */
#define NTokSav 2 /* maximum number of tokens that can be pushed back */
struct src {
int flag; /* indicate what kind of source it is */
struct tok_lst *cond; /* list of nested conditionals in effect */
struct token *toks[NTokSav]; /* token push-back stack for preproc() */
int ntoks; /* number of tokens on stack */
struct src *next; /* link for creating stack */
union src_ref u; /* pointer to specific kind of source */
};
extern struct src dummy; /* base of stack */
extern struct src *src_stack; /* source stack */