/*---------------------------------------------------------------------*\ | | | CPP -- a stand-alone C preprocessor | | Copyright (c) 1993 Hacker Ltd. Author: Scott Bigham | | | | Permission is granted to anyone to use this software for any purpose | | on any computer system, and to redistribute it freely, with the | | following restrictions: | | - No charge may be made other than reasonable charges for repro- | | duction. | | - Modified versions must be clearly marked as such. | | - The author is not responsible for any harmful consequences of | | using this software, even if they result from defects therein. | | | | global.h -- global definitions | \*---------------------------------------------------------------------*/ #include #include #ifndef __MINT__ # ifdef __STDC__ # define __PROTO(x) x # else # define __PROTO(x) () # endif #endif typedef struct macro { struct macro *next; /* for free-list chaining */ int nargs; unsigned int flags; #define MAGIC 0x0001 /* system special #define */ #define MAGIC2 0x0002 /* as above, but not always visible */ #define HASARGS 0x0004 /* check for arguments */ #define MARKED 0x0008 /* used for recursive #definitions */ #define UNDEF 0x0010 /* -U argument */ struct token *argnames; struct token *m_text; } Macro; typedef struct token { struct token *next; union { char *out_of_line; char inline[8]; } _txt; union { char *out_of_line; char inline[4]; } _ws; long val; unsigned int hashval; char type; char subtype; unsigned int flags; #define BLUEPAINT 0x0001 /* not available for expansion */ #define UNS_VAL 0x0002 /* value is unsigned */ #define STRINGIZE_ME 0x0004 /* stringized macro arg */ #define CONCAT_NEXT 0x0008 /* concatenate this token with next token */ #define TRAIL_SPC 0x0010 /* add spc to prevent accidental token merge */ #define UNPAINT_ME 0x0020 /* see expand() and expand_tlist() */ #define INLINE_TXT 0x0040 /* text of token is inline */ #define INLINE_WS 0x0080 /* whitespace is inline */ } Token, *TokenP; /* accessor macros to get at the inlined strings */ #define token_txt(Tp) \ (((Tp)->flags & INLINE_TXT) ? (Tp)->_txt.inline : (Tp)->_txt.out_of_line) #define token_ws(Tp) \ (((Tp)->flags & INLINE_WS) ? (Tp)->_ws.inline : (Tp)->_ws.out_of_line) typedef struct hash { struct hash *next; union { char inline[8]; char *out_of_line; } _id; Macro *data; unsigned int flags; #define INLINE_KEY 0x0001 /* text of key is inline */ } Hash; /* token types */ #define UNKNOWN 1 #define DONT_CARE 2 #define EOL 3 #define NUMBER 4 #define FP_NUM 5 #define ID 6 #define STR_CON 7 #define CHAR_CON 8 #define UNARY_OP 9 #define MUL_OP 10 #define ADD_OP 11 #define SHIFT_OP 12 #define REL_OP 13 #define EQ_OP 14 #define B_AND_OP 15 #define B_XOR_OP 16 #define B_OR_OP 17 #define L_AND_OP 18 #define L_OR_OP 19 #define LPAREN 20 #define RPAREN 21 #define COMMA 22 #define INC_NAM 23 #define POUND 24 #define TOK_CAT 25 #define MACRO_ARG 26 #define EOF_ 27 #define STOP 28 #define UNMARK 29 /* tokenizer modes */ #define NORMAL 0 /* default behavior */ #define INCLUDE_LINE 1 /* return as a single token */ #define IF_EXPR 2 /* interpret defined(IDENTIFIER) */ #define SLURP 4 /* ignore preprocessor directives */ /* types of synchronization lines */ #define SL_NONE 0 /* no sync line */ #define SL_NORMAL 1 /* default style: # 15 "fred.c" */ #define SL_LINE 2 /* preproc style: #line 15 "fred.c" */ #if defined(__MINT__) || defined(__GNUC__) #define PATH_SEP '/' #else #define PATH_SEP '\\' #endif #define STDIN_NAME "standard input" #define streq(s,t) (strcmp((s),(t))==0) #define nelems(arr) (sizeof(arr)/sizeof((arr)[0])) /* Global variables and functions from each file */ /* comment.c */ char *suck_ws __PROTO((char *, TokenP)); /* define.c */ void do_define __PROTO((void)); void do_undefine __PROTO((void)); int macro_eq __PROTO((Macro *, Macro *)); /* hash.c */ Macro *lookup __PROTO((char *, unsigned int)); unsigned int hash_id __PROTO((char *, char **)); void hash_add __PROTO((char *, unsigned int, Macro *)); void hash_clean_undef __PROTO((void)); void hash_free __PROTO((void)); void hash_remove __PROTO((char *, unsigned int)); void hash_setup __PROTO((void)); /* if_expr.c */ int if_expr __PROTO((void)); /* include.c */ void do_include __PROTO((void)); extern unsigned long include_level; /* input.c */ /* HSC #defines the following if and only if it is in a mode that gives external identifiers more than 7 characters of significance. If your compiler can handle long identifiers, feel free to delete this #defin'ition. */ #ifndef __HSC_LONGNAMES__ #define expand_rest_of_line E_rol #endif TokenP tokenize_string __PROTO((char *)); char *getline __PROTO((void)); char *rest_of_line __PROTO((void)); void expand_rest_of_line __PROTO((void)); void flush_line __PROTO((void)); extern char *cur_file; extern unsigned long last_line, this_line, next_line; /* macro.c */ Macro *mk_Macro __PROTO((void)); void free_Macro __PROTO((Macro *)); TokenP expand_tlist __PROTO((TokenP)); void expand __PROTO((TokenP, Macro *)); extern char *magic_words[]; extern int N_MWORDS; /* main.c */ extern FILE *inf; extern FILE *outf; extern char *argv0; extern char **I_list; extern char date_string[], time_string[]; extern int nerrs; extern int sl_style, keep_comments, do_trigraphs, ansi, w_bad_chars, w_nest_cmts, f_cpp_cmts, w_bad_concat; extern int in_config_file, Argc_end; extern int fluff_mode; void do_cmdline_arg __PROTO((char *)); void do_all_cmdline_args __PROTO((void)); /* pound.c */ void cond_setup __PROTO((void)); void cond_shutdown __PROTO((void)); void directive __PROTO((void)); void endif_check __PROTO((void)); extern int *if_sp; #define COND_TRUE 1 #define COND_NESTED 2 #define cond_true() ((if_sp[-1]&(COND_TRUE|COND_NESTED))==COND_TRUE) /* process.c */ void process_file __PROTO((char *)); void sync_line __PROTO((int)); void synchronize __PROTO((void)); /* token.c */ TokenP mk_Token __PROTO((void)); void clear_txt __PROTO((TokenP)); void clear_ws __PROTO((TokenP)); void set_txt __PROTO((TokenP, const char *)); void set_ws __PROTO((TokenP, const char *)); void set_txt_n __PROTO((TokenP, const char *, int)); TokenP copy_tlist __PROTO((TokenP)); TokenP copy_token __PROTO((TokenP)); TokenP merge_tokens __PROTO((TokenP, TokenP)); TokenP mk_eol __PROTO((void)); TokenP mk_stopper __PROTO((void)); TokenP mk_unmarker __PROTO((TokenP)); TokenP mk_printable __PROTO((const char *)); TokenP token __PROTO((void)); int get_mode __PROTO((void)); void change_mode __PROTO((int, int)); void flush_tokenizer __PROTO((void)); void free_tlist __PROTO((TokenP)); void free_token __PROTO((TokenP)); void print_token __PROTO((TokenP)); void push_tlist __PROTO((TokenP)); void set_mode __PROTO((int)); void tok_shutdown __PROTO((void)); TokenP exp_token __PROTO((void)); TokenP _one_token __PROTO((void)); void _tokenize_line __PROTO((void)); #ifdef DEBUG void dump_token __PROTO((TokenP)); void dump_tlist __PROTO((TokenP)); void dump_pushback __PROTO((void)); #endif /* utils.c */ void fatal __PROTO((const char *, ...)); void bugchk __PROTO((const char *, ...)); void warning __PROTO((const char *, ...)); void error __PROTO((const char *, ...)); char *copy_filename __PROTO((char *, int)); #ifndef __GNUC__ char *strdup __PROTO((const char *)); #endif FILE *xfopen __PROTO((const char *, const char *)); #define NEWBUFSIZ ((size_t)4096) void *mallok __PROTO((size_t)); void *reallok __PROTO((void *, size_t)); char *grow __PROTO((char **, size_t *, char *, int)); /* ztype.c */ void Z_type_init __PROTO((void));