1 /*- 2 * Copyright (c) 1998, 2002-2008 Kiyoshi Matsui <kmatsui@t3.rim.or.jp> 3 * All rights reserved. 4 * 5 * Some parts of this code are derived from the public domain software 6 * DECUS cpp (1984,1985) written by Martin Minow. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 */ 29 30 /* 31 * I N T E R N A L . H 32 * I n t e r n a l D e f i n i t i o n s f o r M C P P 33 * 34 * In general, definitions in this file should not be changed by implementor. 35 */ 36 37 #ifndef SYSTEM_H 38 #error "system.H" must be included prior to "internal.H" 39 #endif 40 41 #include "mcpp_out.h" 42 43 #if MCPP_LIB 44 #include "mcpp_lib.h" /* External interface when used as library */ 45 #endif 46 47 #define EOS '\0' /* End of string */ 48 #define CHAR_EOF 0 /* Returned by get_ch() on eof */ 49 50 #define VA_ARGS (UCHARMAX + 1) /* Signal of variable arguments */ 51 #define GVA_ARGS (VA_ARGS * 2) /* GCC-specific variable args */ 52 #define AVA_ARGS (VA_ARGS | GVA_ARGS)/* Any variable arguments */ 53 #define DEF_PRAGMA (-1 - AVA_ARGS) /* _Pragma() pseudo-macro */ 54 #define DEF_NOARGS (-2 - AVA_ARGS) /* #define foo vs #define foo() */ 55 #define DEF_NOARGS_PREDEF_OLD (DEF_NOARGS - 1) 56 /* Compiler-predefined macro without leading '_' */ 57 #define DEF_NOARGS_PREDEF (DEF_NOARGS - 2)/* Compiler-predefined macro */ 58 #define DEF_NOARGS_STANDARD (DEF_NOARGS - 3)/* Standard predefined macro */ 59 #define DEF_NOARGS_DYNAMIC (DEF_NOARGS - 4)/* Standard dynamically defined */ 60 61 /* 62 * These magic characters must be control characters which can't be used 63 * in source file. 64 */ 65 /* for '#pragma MCPP debug macro_call' and -K option in STD mode. */ 66 #define MAC_INF 0x18 /* Magic for macro informations */ 67 /* In STD and POST_STD modes (IN_SRC and TOK_SEP are for STD mode only). */ 68 #define DEF_MAGIC 0x19 /* Magic to prevent recursive expansion */ 69 #define IN_SRC 0x1A /* Magic of name from source */ 70 #define RT_END 0x1C /* Magic of macro rescan boundary */ 71 #define ST_QUOTE 0x1D /* Magic for stringizing */ 72 #define CAT 0x1E /* Token concatenation delim. */ 73 #define TOK_SEP 0x1F /* Magic to wrap expanded macro */ 74 /* In OLD_PREP mode. */ 75 #define COM_SEP 0x1F /* Comment of 0-length */ 76 77 #define MAC_PARM 0x7F /* Macro parameter signal */ 78 79 /* Special character types */ 80 #define LET 1 /* Letter (alphabet and _) */ 81 #define DIG 2 /* Digit */ 82 #define DOT 4 /* . might start a number */ 83 #define PUNC 8 /* Punctuators and operators */ 84 #define QUO 0x10 /* Both flavors of quotation ",'*/ 85 #define SPA 0x20 /* White spaces */ 86 #define HSP 0x40 87 /* Horizontal white spaces (' ', '\t', TOK_SEP) */ 88 89 /* 90 * Codes for operators used in #if expression. 91 * The value of the scanned operator is stored in 'openum'. 92 */ 93 #define INV 0 /* Invalid, must be zero */ 94 #define OP_EOE INV /* End of expression */ 95 #define VAL 1 /* Value (operand) */ 96 #define OP_LPA 2 /* ( */ 97 /* The following are unary. */ 98 #define FIRST_UNOP OP_PLU /* First unary operator */ 99 #define OP_PLU 3 /* + */ 100 #define OP_NEG 4 /* - */ 101 #define OP_COM 5 /* ~ */ 102 #define OP_NOT 6 /* ! */ 103 #define LAST_UNOP OP_NOT /* Last unary operator */ 104 /* The following are binary. */ 105 #define FIRST_BINOP OP_MUL /* First binary operator */ 106 #define OP_MUL 7 /* * */ 107 #define OP_DIV 8 /* / */ 108 #define OP_MOD 9 /* % */ 109 #define OP_ADD 10 /* + */ 110 #define OP_SUB 11 /* - */ 111 #define OP_SL 12 /* << */ 112 #define OP_SR 13 /* >> */ 113 #define OP_LT 14 /* < */ 114 #define OP_LE 15 /* <= */ 115 #define OP_GT 16 /* > */ 116 #define OP_GE 17 /* >= */ 117 #define OP_EQ 18 /* == */ 118 #define OP_NE 19 /* != */ 119 #define OP_AND 20 /* & */ 120 #define OP_XOR 21 /* ^ */ 121 #define OP_OR 22 /* | */ 122 #define OP_ANA 23 /* && */ 123 #define OP_ORO 24 /* || */ 124 #define OP_QUE 25 /* ? */ 125 #define OP_COL 26 /* : */ 126 #define LAST_BINOP OP_COL /* Last binary operator */ 127 /* Parenthesis */ 128 #define OP_RPA 27 /* ) */ 129 #define OP_END 28 /* End of expression marker */ 130 #define OP_FAIL (OP_END + 1) /* For error returns */ 131 132 /* 133 * The following are operators used in macro definition only. 134 */ 135 /* In STD and POST_STD modes. */ 136 #define OP_STR 30 /* # */ 137 #define OP_CAT 31 /* ## */ 138 #define OP_ELL 32 /* ... */ 139 140 /* 141 * The following are C source operators or punctuators, 142 * not preprocessing operators. 143 * Note: "sizeof", "defined" are read as identifier for convenience. 144 */ 145 #define OP_1 33 /* Any other single byte ops or puncs */ 146 /* =, ., ;, [, ], {, }, ',' */ 147 #define OP_2 34 /* Any other two bytes operators */ 148 /* &=, |=, ++, +=, --, -=, ->, %=, *=, /=, ^=, */ 149 #define OP_3 35 /* Three bytes operators : <<=, >>= */ 150 /* 151 * The following are operators spelled in digraphs. 152 */ 153 /* In STD and POST_STD modes. */ 154 #define OP_LBRACE_D 0x40 /* <% i.e. { */ 155 #define OP_RBRACE_D 0x41 /* %> i.e. } */ 156 #define OP_LBRCK_D 0x42 /* <: i.e. [ */ 157 #define OP_RBRCK_D 0x43 /* :> i.e. ] */ 158 #define OP_SHARP_D 0x44 /* %: i.e. # */ 159 #define OP_DSHARP_D 0x45 /* %:%: i.e. ## */ 160 #define OP_DIGRAPH 0x40 /* (OP_*_D & OP_DIGRAPH) == 0x40 */ 161 162 /* 163 * The following are for lexical scanning only. 164 */ 165 /* Token types */ 166 #define NO_TOKEN 0 167 #define NAM 65 /* Identifier (name, keyword) */ 168 #define NUM 66 /* Preprocessing number */ 169 #define STR 67 /* Character string literal */ 170 #define CHR 69 /* Integer character constant */ 171 172 /* In STD and POST_STD modes. */ 173 #define WSTR 68 /* Wide string literal */ 174 #define WCHR 70 /* Wide character constant */ 175 176 #define OPE 71 /* Operator or punctuator */ 177 #define SPE 72 /* Unknown token (@ or others) */ 178 #define SEP 73 /* Token separator or magics */ 179 180 /* 181 * The following are values of 'mcpp_debug' variable which is set by the 182 * arguments of '#pragma MCPP debug' directive. 183 */ 184 #define PATH 1 185 #define TOKEN 2 186 #define EXPAND 4 187 #define MACRO_CALL 8 188 #define IF 16 189 #define EXPRESSION 32 190 #define GETC 64 191 #define MEMORY 128 192 193 /* MAC_* represent macro information types for -K option. */ 194 #define MAC_CALL_START 1 195 #define MAC_CALL_END 2 196 #define MAC_ARG_START 3 197 #define MAC_ARG_END 4 198 199 /* MB_ERROR signals wrong multi-byte character sequence. */ 200 #define MB_ERROR 0x8000 201 202 #if MCPP_LIB && HOST_COMPILER == GNUC \ 203 && (SYS_FAMILY == SYS_UNIX && SYSTEM != SYS_CYGWIN) 204 /* For GCC 4.* on UNIXes */ 205 #pragma GCC visibility push( hidden) /* Hide these names from outside */ 206 #endif 207 208 /* 209 * The DEFBUF structure stores information about #defined macros. 210 * Note that DEFBUF->parmnames is parameter names catenated with commas, 211 * which is saved for the check of redefinition for STD mode. 212 * 'parmnames' and 'repl' are allocated to the area succeding to name. 213 */ 214 typedef struct defbuf { 215 struct defbuf * link; /* Pointer to next def in chain */ 216 short nargs; /* Number of parameters */ 217 char * parmnames; /* -> Parameter names catenated by ',' */ 218 char * repl; /* Pointer to replacement text */ 219 const char * fname; /* Macro is defined in the source file */ 220 long mline; /* at the line. */ 221 char push; /* Push level indicator */ 222 char name[1]; /* Macro name */ 223 } DEFBUF; 224 225 /* 226 * The FILEINFO structure stores information about open files and macros 227 * being expanded. 228 */ 229 typedef struct fileinfo { 230 char * bptr; /* Current pointer into buffer */ 231 long line; /* Current line number of file */ 232 FILE * fp; /* Source file if non-null */ 233 long pos; /* Position next to #include */ 234 struct fileinfo * parent; /* Link to includer */ 235 struct ifinfo * initif; /* Initial ifstack (return there on EOF)*/ 236 int sys_header; /* System header file or not */ 237 int include_opt; /* Specified by -include option */ 238 const char ** dirp; /* Include directory the file resides */ 239 const char * src_dir; /* Directory of source file */ 240 const char * real_fname; /* Real file name */ 241 const char * full_fname; /* Real full path list */ 242 char * filename; /* File/macro name (maybe changed) */ 243 char * buffer; /* Buffer of current input line */ 244 #if MCPP_LIB 245 /* Save output functions during push/pop of #includes */ 246 int (* last_fputc) ( int c, OUTDEST od); 247 int (* last_fputs) ( const char * s, OUTDEST od); 248 int (* last_fprintf)( OUTDEST od, const char * format, ...); 249 #endif 250 } FILEINFO; 251 252 /* 253 * IFINFO stores information of conditional compilation. 254 */ 255 typedef struct ifinfo { 256 int stat; /* State of compilation */ 257 long ifline; /* Line #if started */ 258 long elseline; /* Line #else started */ 259 } IFINFO; 260 261 /* 262 * These bits are set in IFINFO.stat 263 */ 264 #define WAS_COMPILING 1 /* TRUE if compile set at entry */ 265 #define ELSE_SEEN 2 /* TRUE when #else processed */ 266 #define TRUE_SEEN 4 /* TRUE when #if TRUE processed */ 267 268 #define compiling ifstack[0].stat 269 270 #define FP2DEST(fp) \ 271 (fp == fp_out) ? OUT : \ 272 ((fp == fp_err) ? ERR : \ 273 ((fp == fp_debug) ? DBG : \ 274 ((OUTDEST) -1))) 275 276 /* VAL_SIGN structure stores information about evaluated number. */ 277 typedef struct val_sign { 278 expr_t val; /* Value */ 279 int sign; /* Signed, unsigned, error */ 280 } VAL_SIGN; 281 282 /* Values of VAL_SIGN.sign. */ 283 #define SIGNED 1 284 #define UNSIGNED 0 285 #define VAL_ERROR (-1) 286 287 /* LINE_COL stores information of line and column data */ 288 typedef struct line_col { 289 long line; 290 size_t col; 291 } LINE_COL; 292 293 /* Value of macro_line on macro call error. */ 294 #define MACRO_ERROR (-1L) 295 296 /* 297 * Values of insert_sep (flag of insertion of token separator). 298 * Used only in POST_STD mode. 299 */ 300 #define NO_SEP 0 /* No separator is inserted */ 301 #define INSERT_SEP 1 /* Next get_ch() insert a separator */ 302 #define INSERTED_SEP 2 /* Last get_ch() Inserted a separator */ 303 304 #define str_eq(s1, s2) (strcmp(s1, s2) == 0) 305 306 #ifndef IO_SUCCESS 307 #define IO_SUCCESS 0 308 #endif 309 #ifndef IO_ERROR 310 #define IO_ERROR (errno ? errno : 1) 311 #endif 312 313 /* 314 * Externs 315 */ 316 317 /* The minimum translation limits specified by the Standards. */ 318 extern struct std_limits_ { 319 long str_len; /* Least maximum of string len. */ 320 size_t id_len; /* Least maximum of ident len. */ 321 int n_mac_pars; /* Least maximum of num of pars.*/ 322 int exp_nest; /* Least maximum of expr nest */ 323 int blk_nest; /* Least maximum of block nest */ 324 int inc_nest; /* Least maximum of include nest*/ 325 long n_macro; /* Least maximum of num of macro*/ 326 long line_num; /* Maximum source line number */ 327 } std_limits; 328 /* The boolean flags specified by the execution options. */ 329 extern struct option_flags_ { 330 int c; /* -C option (keep comments) */ 331 int k; /* -k option (keep white spaces)*/ 332 int z; /* -z option (no-output of included file) */ 333 int p; /* -P option (no #line output) */ 334 int q; /* -Q option (diag to mcpp.err) */ 335 int v; /* -v option (verbose) */ 336 int trig; /* -3 option (toggle trigraphs) */ 337 int dig; /* -2 option (toggle digraphs) */ 338 int lang_asm; /* -a option (assembler source) */ 339 int no_source_line; /* Do not output line in diag. */ 340 int dollar_in_name; /* Allow $ in identifiers */ 341 } option_flags; 342 343 extern int mcpp_mode; /* Mode of preprocessing */ 344 extern int stdc_val; /* Value of __STDC__ */ 345 extern long stdc_ver; /* Value of __STDC_VERSION__ */ 346 extern long cplus_val; /* Value of __cplusplus for C++ */ 347 extern int stdc2; /* cplus_val or (stdc_ver >= 199901L) */ 348 extern int stdc3; /* (stdc_ver or cplus_val) >= 199901L */ 349 extern int standard; /* mcpp_mode is STD or POST_STD */ 350 extern int std_line_prefix; /* #line in C source style */ 351 extern int warn_level; /* Level of warning */ 352 extern int errors; /* Error counter */ 353 extern long src_line; /* Current source line number */ 354 extern int wrong_line; /* Force #line to compiler */ 355 extern int newlines; /* Count of blank lines */ 356 extern int keep_comments; /* Don't remove comments */ 357 extern int keep_spaces; /* Don't remove white spaces */ 358 extern int include_nest; /* Nesting level of #include */ 359 extern const char * null; /* "" string for convenience */ 360 extern const char ** inc_dirp; /* Directory of #includer */ 361 extern const char * cur_fname; /* Current source file name */ 362 extern int no_output; /* Don't output included file */ 363 extern int in_directive; /* In process of #directive */ 364 extern int in_define; /* In #define line */ 365 extern int in_getarg; /* Collecting arguments of macro*/ 366 extern int in_include; /* In #include line */ 367 extern int in_if; /* In #if and non-skipped expr. */ 368 extern long macro_line; /* Line number of macro call */ 369 extern char * macro_name; /* Currently expanding macro */ 370 extern int openum; /* Number of operator or punct. */ 371 extern IFINFO * ifptr; /* -> current ifstack item */ 372 extern FILEINFO * infile; /* Current input file or macro */ 373 extern FILE * fp_in; /* Input stream to preprocess */ 374 extern FILE * fp_out; /* Output stream preprocessed */ 375 extern FILE * fp_err; /* Diagnostics stream */ 376 extern FILE * fp_debug; /* Debugging information stream */ 377 extern int insert_sep; /* Inserted token separator flag*/ 378 extern int mkdep; /* Output source file dependency*/ 379 extern int mbchar; /* Encoding of multi-byte char */ 380 extern int mbchk; /* Possible multi-byte char */ 381 extern int bsl_in_mbchar; /* 2nd byte of mbchar has '\\' */ 382 extern int bsl_need_escape;/* '\\' in mbchar should be escaped */ 383 extern int mcpp_debug; /* Class of debug information */ 384 extern long in_asm; /* In #asm - #endasm block */ 385 extern jmp_buf error_exit; /* Exit on fatal error */ 386 extern char * cur_fullname; /* Full name of current source */ 387 extern short * char_type; /* Character classifier */ 388 extern char * workp; /* Free space in work[] */ 389 extern char * const work_end; /* End of work[] buffer */ 390 extern char identifier[]; /* Lastly scanned name */ 391 extern IFINFO ifstack[]; /* Information of #if nesting */ 392 extern char work_buf[]; 393 extern FILEINFO * sh_file; 394 extern int sh_line; 395 /* Temporary buffer for directive line and macro expansion */ 396 397 /* main.c */ 398 extern void un_predefine( int clearall); 399 /* Undefine predefined macros */ 400 401 /* directive.c */ 402 extern void directive( void); 403 /* Process #directive line */ 404 extern DEFBUF * do_define( int ignore_redef, int predefine); 405 /* Do #define directive */ 406 extern DEFBUF * look_id( const char * name); 407 /* Look for a #define'd thing */ 408 extern DEFBUF ** look_prev( const char * name, int * cmp); 409 /* Look for place to insert def.*/ 410 extern DEFBUF * look_and_install( const char * name, int numargs 411 , const char * parmnames, const char * repl); 412 /* Look and insert macro def. */ 413 extern DEFBUF * install_macro( const char * name, int numargs 414 , const char * parmnames, const char * repl, DEFBUF ** prevp, int cmp 415 , int predefine); 416 /* Install a def to symbol table*/ 417 extern int undefine( const char * name); 418 /* Delete from symbol table */ 419 extern void dump_a_def( const char * why, const DEFBUF * dp, int newdef 420 , int comment, FILE * fp); 421 /* Dump a specific macro def */ 422 extern void dump_def( int comment, int K_opt); 423 /* Dump current macro defs */ 424 425 /* eval.c */ 426 extern expr_t eval_if( void); 427 /* Evaluate #if expression */ 428 extern VAL_SIGN * eval_num( const char * nump); 429 /* Evaluate preprocessing number*/ 430 431 /* expand.c */ 432 extern char * (* expand_macro)( DEFBUF * defp, char * out, char * out_end 433 , LINE_COL line_col, int * pragma_op); 434 /* Expand a macro completely */ 435 extern void expand_init( int compat, int strict_ansi); 436 /* Initialize expand_macro() */ 437 extern DEFBUF * is_macro( char ** cp); 438 /* The sequence is a macro call?*/ 439 440 /* mbchar.c */ 441 extern size_t (* mb_read)( int c1, char ** in_pp, char ** out_pp); 442 /* Read mbchar sequence */ 443 extern const char * set_encoding( char * name, char * env, int pragma); 444 /* Multi-byte char encoding */ 445 extern void mb_init( void); 446 /* Initialize mbchar variables */ 447 extern uexpr_t mb_eval( char ** seq_pp); 448 /* Evaluate mbchar in #if */ 449 extern int last_is_mbchar( const char * in, int len); 450 /* The line ends with MBCHAR ? */ 451 452 /* support.c */ 453 extern int get_unexpandable( int c, int diag); 454 /* Get next unexpandable token */ 455 extern void skip_nl( void); 456 /* Skip to the end of the line */ 457 extern int skip_ws( void); 458 /* Skip over white-spaces */ 459 extern int scan_token( int c, char ** out_pp, char * out_end); 460 /* Get the next token */ 461 extern char * scan_quote( int delim, char * out, char * out_end, int diag); 462 /* Scan a quoted literal */ 463 extern int id_operator( const char * name); 464 /* Check identifier-like ops */ 465 extern void expanding( const char * name, int to_be_freed); 466 /* Save macro name expanding */ 467 extern void clear_exp_mac( void); 468 /* Clear expanding macro infs */ 469 extern int get_ch( void); 470 /* Get the next char from input */ 471 extern int cnv_trigraph( char * in); 472 /* Do trigraph replacement */ 473 extern int cnv_digraph( char * in); 474 /* Convert digraphs to usual tok*/ 475 extern void unget_ch( void); 476 /* Push back the char to input */ 477 extern FILEINFO * unget_string( const char * text, const char * name); 478 /* Push back the string to input*/ 479 extern char * save_string( const char * text); 480 /* Stuff string in malloc mem. */ 481 extern FILEINFO * get_file( const char * name, const char * src_dir 482 , const char * fullname, size_t bufsize, int include_opt); 483 /* New FILEINFO initialization */ 484 extern char * (xmalloc)( size_t size); 485 /* Get memory or die */ 486 extern char * (xrealloc)( char * ptr, size_t size); 487 /* Reallocate memory or die */ 488 extern LINE_COL * get_src_location( LINE_COL * p_line_col); 489 /* Get location on source file */ 490 extern void cfatal( const char * format, const char * arg1, long arg2 491 , const char * arg3); 492 /* Print a fatal error and exit */ 493 extern void cerror( const char * format, const char * arg1, long arg2 494 , const char * arg3); 495 /* Print an error message */ 496 extern void cwarn( const char * format, const char * arg1, long arg2 497 , const char * arg3); 498 /* Print a warning message */ 499 extern void dump_string( const char * why, const char * text); 500 /* Dump text readably */ 501 extern void dump_unget( const char * why); 502 /* Dump all ungotten junk */ 503 /* Support for alternate output mechanisms (e.g. memory buffers) */ 504 extern int (* mcpp_fputc)( int c, OUTDEST od), 505 (* mcpp_fputs)( const char * s, OUTDEST od), 506 (* mcpp_fprintf)( OUTDEST od, const char * format, ...); 507 508 /* system.c */ 509 extern void do_options( int argc, char ** argv, char ** in_pp 510 , char ** out_pp); 511 /* Process command line args */ 512 extern void init_sys_macro( void); 513 /* Define system-specific macro */ 514 extern void at_start( void); 515 /* Commands prior to main input */ 516 extern void put_depend( const char * filename); 517 /* Output source dependency line*/ 518 extern int do_include( int next); 519 /* Process #include directive */ 520 extern void add_file( FILE * fp, const char * src_dir 521 , const char * filename, const char * fullname, int include_opt); 522 /* Chain the included file */ 523 extern void sharp( FILEINFO * sharp_file, int marker); 524 /* Output # line number */ 525 extern void do_pragma( void); 526 /* Process #pragma directive */ 527 extern void put_asm( void); 528 /* Putout an asm code line */ 529 extern void do_old( void); 530 /* Process older directives */ 531 extern void at_end( void); 532 /* Do the final commands */ 533 extern void print_heap( void); 534 /* Print blocks of heap memory */ 535 #if ! HOST_HAVE_STPCPY 536 extern char * stpcpy( char * dest, const char * src); 537 /* Non-Standard library function*/ 538 #endif 539 540 #if MCPP_LIB /* Setting to use mcpp as a subroutine */ 541 /* directive.c */ 542 extern void clear_symtable( void); 543 /* Free all macro definitions */ 544 /* system.c */ 545 extern void clear_filelist( void); 546 /* Free filename and directory list */ 547 /* The following 5 functions are to Initialize static variables. */ 548 /* directive.c */ 549 extern void init_directive( void); 550 /* eval.c */ 551 extern void init_eval( void); 552 /* support.c */ 553 extern void init_support( void); 554 /* system.c */ 555 extern void init_system( void); 556 557 #if HOST_COMPILER == GNUC && (SYS_FAMILY == SYS_UNIX && SYSTEM != SYS_CYGWIN) 558 #pragma GCC visibility pop 559 #endif 560 #endif 561 562 #if HOST_HAVE_STPCPY && !defined(stpcpy) 563 extern char * stpcpy( char * dest, const char * src); 564 #endif 565