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