Blame src/internal.H

Packit Service 8bf002
/*-
Packit Service 8bf002
 * Copyright (c) 1998, 2002-2008 Kiyoshi Matsui <kmatsui@t3.rim.or.jp>
Packit Service 8bf002
 * All rights reserved.
Packit Service 8bf002
 *
Packit Service 8bf002
 * Some parts of this code are derived from the public domain software
Packit Service 8bf002
 * DECUS cpp (1984,1985) written by Martin Minow.
Packit Service 8bf002
 *
Packit Service 8bf002
 * Redistribution and use in source and binary forms, with or without
Packit Service 8bf002
 * modification, are permitted provided that the following conditions
Packit Service 8bf002
 * are met:
Packit Service 8bf002
 * 1. Redistributions of source code must retain the above copyright
Packit Service 8bf002
 *    notice, this list of conditions and the following disclaimer.
Packit Service 8bf002
 * 2. Redistributions in binary form must reproduce the above copyright
Packit Service 8bf002
 *    notice, this list of conditions and the following disclaimer in the
Packit Service 8bf002
 *    documentation and/or other materials provided with the distribution.
Packit Service 8bf002
 *
Packit Service 8bf002
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND
Packit Service 8bf002
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Packit Service 8bf002
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Packit Service 8bf002
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
Packit Service 8bf002
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Packit Service 8bf002
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
Packit Service 8bf002
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
Packit Service 8bf002
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
Packit Service 8bf002
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
Packit Service 8bf002
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
Packit Service 8bf002
 * SUCH DAMAGE.
Packit Service 8bf002
 */
Packit Service 8bf002
Packit Service 8bf002
/*
Packit Service 8bf002
 *                          I N T E R N A L . H
Packit Service 8bf002
 *      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
Packit Service 8bf002
 *
Packit Service 8bf002
 * In general, definitions in this file should not be changed by implementor.
Packit Service 8bf002
 */
Packit Service 8bf002
Packit Service 8bf002
#ifndef SYSTEM_H
Packit Service 8bf002
    #error "system.H" must be included prior to "internal.H"
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
#include "mcpp_out.h"
Packit Service 8bf002
Packit Service 8bf002
#if MCPP_LIB
Packit Service 8bf002
#include "mcpp_lib.h"   /* External interface when used as library  */
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
#define EOS             '\0'        /* End of string                */
Packit Service 8bf002
#define CHAR_EOF        0           /* Returned by get_ch() on eof  */
Packit Service 8bf002
Packit Service 8bf002
#define VA_ARGS         (UCHARMAX + 1)      /* Signal of variable arguments */
Packit Service 8bf002
#define GVA_ARGS        (VA_ARGS * 2)       /* GCC-specific variable args   */
Packit Service 8bf002
#define AVA_ARGS        (VA_ARGS | GVA_ARGS)/* Any variable arguments       */
Packit Service 8bf002
#define DEF_PRAGMA      (-1 - AVA_ARGS)     /* _Pragma() pseudo-macro       */
Packit Service 8bf002
#define DEF_NOARGS      (-2 - AVA_ARGS)     /* #define foo vs #define foo() */
Packit Service 8bf002
#define DEF_NOARGS_PREDEF_OLD   (DEF_NOARGS - 1)
Packit Service 8bf002
                        /* Compiler-predefined macro without leading '_'    */
Packit Service 8bf002
#define DEF_NOARGS_PREDEF   (DEF_NOARGS - 2)/* Compiler-predefined macro    */
Packit Service 8bf002
#define DEF_NOARGS_STANDARD (DEF_NOARGS - 3)/* Standard predefined macro    */
Packit Service 8bf002
#define DEF_NOARGS_DYNAMIC  (DEF_NOARGS - 4)/* Standard dynamically defined */
Packit Service 8bf002
Packit Service 8bf002
/*
Packit Service 8bf002
 * These magic characters must be control characters which can't be used
Packit Service 8bf002
 * in source file.
Packit Service 8bf002
 */
Packit Service 8bf002
/* for '#pragma MCPP debug macro_call' and -K option in STD mode.   */
Packit Service 8bf002
#define MAC_INF         0x18        /* Magic for macro informations */
Packit Service 8bf002
/* In STD and POST_STD modes (IN_SRC and TOK_SEP are for STD mode only).    */
Packit Service 8bf002
#define DEF_MAGIC       0x19        /* Magic to prevent recursive expansion */
Packit Service 8bf002
#define IN_SRC          0x1A        /* Magic of name from source    */
Packit Service 8bf002
#define RT_END          0x1C        /* Magic of macro rescan boundary   */
Packit Service 8bf002
#define ST_QUOTE        0x1D        /* Magic for stringizing        */
Packit Service 8bf002
#define CAT             0x1E        /* Token concatenation delim.   */
Packit Service 8bf002
#define TOK_SEP         0x1F        /* Magic to wrap expanded macro */
Packit Service 8bf002
/* In OLD_PREP mode.    */
Packit Service 8bf002
#define COM_SEP         0x1F        /* Comment of 0-length          */
Packit Service 8bf002
Packit Service 8bf002
#define MAC_PARM        0x7F        /* Macro parameter signal       */
Packit Service 8bf002
Packit Service 8bf002
/* Special character types  */
Packit Service 8bf002
#define LET             1           /* Letter (alphabet and _)      */
Packit Service 8bf002
#define DIG             2           /* Digit                        */
Packit Service 8bf002
#define DOT             4           /* . might start a number       */
Packit Service 8bf002
#define PUNC            8           /* Punctuators and operators    */
Packit Service 8bf002
#define QUO             0x10        /* Both flavors of quotation ",'*/
Packit Service 8bf002
#define SPA             0x20        /* White spaces                 */
Packit Service 8bf002
#define HSP             0x40
Packit Service 8bf002
                    /* Horizontal white spaces (' ', '\t', TOK_SEP) */
Packit Service 8bf002
Packit Service 8bf002
/*
Packit Service 8bf002
 * Codes for operators used in #if expression.
Packit Service 8bf002
 * The value of the scanned operator is stored in 'openum'.
Packit Service 8bf002
 */
Packit Service 8bf002
#define INV             0           /* Invalid, must be zero        */
Packit Service 8bf002
#define OP_EOE          INV         /* End of expression            */
Packit Service 8bf002
#define VAL             1           /* Value (operand)              */
Packit Service 8bf002
#define OP_LPA          2           /* (    */
Packit Service 8bf002
/* The following are unary.     */
Packit Service 8bf002
#define FIRST_UNOP      OP_PLU      /* First unary operator         */
Packit Service 8bf002
#define OP_PLU          3           /* +    */ 
Packit Service 8bf002
#define OP_NEG          4           /* -    */
Packit Service 8bf002
#define OP_COM          5           /* ~    */
Packit Service 8bf002
#define OP_NOT          6           /* !    */
Packit Service 8bf002
#define LAST_UNOP       OP_NOT      /* Last unary operator          */
Packit Service 8bf002
/* The following are binary.    */
Packit Service 8bf002
#define FIRST_BINOP     OP_MUL      /* First binary operator        */
Packit Service 8bf002
#define OP_MUL          7           /* *    */
Packit Service 8bf002
#define OP_DIV          8           /* /    */
Packit Service 8bf002
#define OP_MOD          9           /* %    */
Packit Service 8bf002
#define OP_ADD          10          /* +    */
Packit Service 8bf002
#define OP_SUB          11          /* -    */
Packit Service 8bf002
#define OP_SL           12          /* <<   */
Packit Service 8bf002
#define OP_SR           13          /* >>   */
Packit Service 8bf002
#define OP_LT           14          /* <    */
Packit Service 8bf002
#define OP_LE           15          /* <=   */
Packit Service 8bf002
#define OP_GT           16          /* >    */
Packit Service 8bf002
#define OP_GE           17          /* >=   */
Packit Service 8bf002
#define OP_EQ           18          /* ==   */
Packit Service 8bf002
#define OP_NE           19          /* !=   */
Packit Service 8bf002
#define OP_AND          20          /* &    */
Packit Service 8bf002
#define OP_XOR          21          /* ^    */
Packit Service 8bf002
#define OP_OR           22          /* |    */
Packit Service 8bf002
#define OP_ANA          23          /* &&   */
Packit Service 8bf002
#define OP_ORO          24          /* ||   */
Packit Service 8bf002
#define OP_QUE          25          /* ?    */
Packit Service 8bf002
#define OP_COL          26          /* :    */
Packit Service 8bf002
#define LAST_BINOP      OP_COL      /* Last binary operator         */
Packit Service 8bf002
/* Parenthesis  */
Packit Service 8bf002
#define OP_RPA          27          /* )    */
Packit Service 8bf002
#define OP_END          28          /* End of expression marker     */
Packit Service 8bf002
#define OP_FAIL         (OP_END + 1)    /* For error returns        */
Packit Service 8bf002
Packit Service 8bf002
/*
Packit Service 8bf002
 * The following are operators used in macro definition only.
Packit Service 8bf002
 */
Packit Service 8bf002
/* In STD and POST_STD modes.   */
Packit Service 8bf002
#define OP_STR          30          /* #    */
Packit Service 8bf002
#define OP_CAT          31          /* ##   */
Packit Service 8bf002
#define OP_ELL          32          /* ...  */
Packit Service 8bf002
Packit Service 8bf002
/*
Packit Service 8bf002
 * The following are C source operators or punctuators,
Packit Service 8bf002
 * not preprocessing operators.
Packit Service 8bf002
 * Note: "sizeof", "defined" are read as identifier for convenience.
Packit Service 8bf002
 */
Packit Service 8bf002
#define OP_1            33  /* Any other single byte ops or puncs   */
Packit Service 8bf002
                                    /* =, ., ;, [, ], {, }, ','     */
Packit Service 8bf002
#define OP_2            34  /* Any other two bytes operators        */
Packit Service 8bf002
                    /* &=, |=, ++, +=, --, -=, ->, %=, *=, /=, ^=,  */
Packit Service 8bf002
#define OP_3            35  /* Three bytes operators :  <<=, >>=    */
Packit Service 8bf002
/*
Packit Service 8bf002
 * The following are operators spelled in digraphs.
Packit Service 8bf002
 */
Packit Service 8bf002
/* In STD and POST_STD modes.   */
Packit Service 8bf002
#define OP_LBRACE_D     0x40        /* <% i.e. {    */
Packit Service 8bf002
#define OP_RBRACE_D     0x41        /* %> i.e. }    */
Packit Service 8bf002
#define OP_LBRCK_D      0x42        /* <: i.e. [    */
Packit Service 8bf002
#define OP_RBRCK_D      0x43        /* :> i.e. ]    */
Packit Service 8bf002
#define OP_SHARP_D      0x44        /* %: i.e. #    */
Packit Service 8bf002
#define OP_DSHARP_D     0x45        /* %:%: i.e. ## */
Packit Service 8bf002
#define OP_DIGRAPH      0x40    /* (OP_*_D & OP_DIGRAPH) == 0x40    */
Packit Service 8bf002
Packit Service 8bf002
/*
Packit Service 8bf002
 * The following are for lexical scanning only.
Packit Service 8bf002
 */
Packit Service 8bf002
/* Token types          */
Packit Service 8bf002
#define NO_TOKEN        0
Packit Service 8bf002
#define NAM             65          /* Identifier (name, keyword)   */
Packit Service 8bf002
#define NUM             66          /* Preprocessing number         */
Packit Service 8bf002
#define STR             67          /* Character string literal     */
Packit Service 8bf002
#define CHR             69          /* Integer character constant   */
Packit Service 8bf002
Packit Service 8bf002
/* In STD and POST_STD modes.   */
Packit Service 8bf002
#define WSTR            68          /* Wide string literal          */
Packit Service 8bf002
#define WCHR            70          /* Wide character constant      */
Packit Service 8bf002
Packit Service 8bf002
#define OPE             71          /* Operator or punctuator       */
Packit Service 8bf002
#define SPE             72          /* Unknown token (@ or others)  */
Packit Service 8bf002
#define SEP             73          /* Token separator or magics    */
Packit Service 8bf002
Packit Service 8bf002
/*
Packit Service 8bf002
 * The following are values of 'mcpp_debug' variable which is set by the
Packit Service 8bf002
 * arguments of '#pragma MCPP debug' directive.
Packit Service 8bf002
 */
Packit Service 8bf002
#define PATH            1
Packit Service 8bf002
#define TOKEN           2
Packit Service 8bf002
#define EXPAND          4
Packit Service 8bf002
#define MACRO_CALL      8
Packit Service 8bf002
#define IF              16
Packit Service 8bf002
#define EXPRESSION      32
Packit Service 8bf002
#define GETC            64
Packit Service 8bf002
#define MEMORY          128
Packit Service 8bf002
Packit Service 8bf002
/* MAC_* represent macro information types for -K option.   */
Packit Service 8bf002
#define MAC_CALL_START  1
Packit Service 8bf002
#define MAC_CALL_END    2
Packit Service 8bf002
#define MAC_ARG_START   3
Packit Service 8bf002
#define MAC_ARG_END     4
Packit Service 8bf002
Packit Service 8bf002
/* MB_ERROR signals wrong multi-byte character sequence.    */
Packit Service 8bf002
#define MB_ERROR        0x8000
Packit Service 8bf002
Packit Service 8bf002
#if MCPP_LIB && HOST_COMPILER == GNUC   \
Packit Service 8bf002
        && (SYS_FAMILY == SYS_UNIX && SYSTEM != SYS_CYGWIN)
Packit Service 8bf002
    /* For GCC 4.* on UNIXes    */
Packit Service 8bf002
#pragma GCC visibility push( hidden)    /* Hide these names from outside    */
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/*
Packit Service 8bf002
 * The DEFBUF structure stores information about #defined macros.
Packit Service 8bf002
 * Note that DEFBUF->parmnames is parameter names catenated with commas,
Packit Service 8bf002
 * which is saved for the check of redefinition for STD mode.
Packit Service 8bf002
 * 'parmnames' and 'repl' are allocated to the area succeding to name.
Packit Service 8bf002
 */
Packit Service 8bf002
typedef struct defbuf {
Packit Service 8bf002
        struct defbuf * link;       /* Pointer to next def in chain */
Packit Service 8bf002
        short           nargs;      /* Number of parameters         */
Packit Service 8bf002
        char *          parmnames;  /* -> Parameter names catenated by ','  */
Packit Service 8bf002
        char *          repl;       /* Pointer to replacement text  */
Packit Service 8bf002
        const char *    fname;      /* Macro is defined in the source file  */
Packit Service 8bf002
        long            mline;      /*          at the line.        */
Packit Service 8bf002
        char            push;       /* Push level indicator         */
Packit Service 8bf002
        char            name[1];    /* Macro name                   */
Packit Service 8bf002
} DEFBUF;
Packit Service 8bf002
Packit Service 8bf002
/*
Packit Service 8bf002
 * The FILEINFO structure stores information about open files and macros
Packit Service 8bf002
 * being expanded.
Packit Service 8bf002
 */
Packit Service 8bf002
typedef struct fileinfo {
Packit Service 8bf002
        char *          bptr;       /* Current pointer into buffer  */
Packit Service 8bf002
        long            line;       /* Current line number of file  */
Packit Service 8bf002
        FILE *          fp;         /* Source file if non-null      */
Packit Service 8bf002
        long            pos;        /* Position next to #include    */
Packit Service 8bf002
        struct fileinfo *   parent; /* Link to includer             */
Packit Service 8bf002
        struct ifinfo *     initif; /* Initial ifstack (return there on EOF)*/
Packit Service 8bf002
        int             sys_header; /* System header file or not    */
Packit Service 8bf002
        int             include_opt;        /* Specified by -include option */
Packit Service 8bf002
        const char **   dirp;       /* Include directory the file resides   */
Packit Service 8bf002
        const char *    src_dir;    /* Directory of source file     */
Packit Service 8bf002
        const char *    real_fname; /* Real file name               */
Packit Service 8bf002
        const char *    full_fname; /* Real full path list          */
Packit Service 8bf002
        char *          filename;   /* File/macro name (maybe changed)      */
Packit Service 8bf002
        char *          buffer;     /* Buffer of current input line */
Packit Service 8bf002
#if MCPP_LIB
Packit Service 8bf002
        /* Save output functions during push/pop of #includes   */
Packit Service 8bf002
        int (* last_fputc)  ( int c, OUTDEST od);
Packit Service 8bf002
        int (* last_fputs)  ( const char * s, OUTDEST od);
Packit Service 8bf002
        int (* last_fprintf)( OUTDEST od, const char * format, ...);
Packit Service 8bf002
#endif
Packit Service 8bf002
} FILEINFO;
Packit Service 8bf002
Packit Service 8bf002
/*
Packit Service 8bf002
 * IFINFO stores information of conditional compilation.
Packit Service 8bf002
 */
Packit Service 8bf002
typedef struct ifinfo {
Packit Service 8bf002
        int             stat;       /* State of compilation         */
Packit Service 8bf002
        long            ifline;     /* Line #if started             */
Packit Service 8bf002
        long            elseline;   /* Line #else started           */
Packit Service 8bf002
} IFINFO;
Packit Service 8bf002
Packit Service 8bf002
/*
Packit Service 8bf002
 * These bits are set in IFINFO.stat
Packit Service 8bf002
 */
Packit Service 8bf002
#define WAS_COMPILING   1           /* TRUE if compile set at entry */
Packit Service 8bf002
#define ELSE_SEEN       2           /* TRUE when #else processed    */
Packit Service 8bf002
#define TRUE_SEEN       4           /* TRUE when #if TRUE processed */
Packit Service 8bf002
Packit Service 8bf002
#define compiling       ifstack[0].stat
Packit Service 8bf002
Packit Service 8bf002
#define FP2DEST(fp) \
Packit Service 8bf002
    (fp == fp_out) ? OUT : \
Packit Service 8bf002
    ((fp == fp_err) ? ERR : \
Packit Service 8bf002
    ((fp == fp_debug) ? DBG : \
Packit Service 8bf002
    ((OUTDEST) -1)))
Packit Service 8bf002
Packit Service 8bf002
/* VAL_SIGN structure stores information about evaluated number.    */
Packit Service 8bf002
typedef struct val_sign {
Packit Service 8bf002
        expr_t          val;        /* Value                        */
Packit Service 8bf002
        int             sign;       /* Signed, unsigned, error      */
Packit Service 8bf002
} VAL_SIGN;
Packit Service 8bf002
Packit Service 8bf002
/* Values of VAL_SIGN.sign. */
Packit Service 8bf002
#define SIGNED          1
Packit Service 8bf002
#define UNSIGNED        0
Packit Service 8bf002
#define VAL_ERROR       (-1)
Packit Service 8bf002
Packit Service 8bf002
/* LINE_COL stores information of line and column data  */
Packit Service 8bf002
typedef struct line_col {
Packit Service 8bf002
        long            line;
Packit Service 8bf002
        size_t          col;
Packit Service 8bf002
} LINE_COL;
Packit Service 8bf002
Packit Service 8bf002
/* Value of macro_line on macro call error.         */
Packit Service 8bf002
#define MACRO_ERROR     (-1L)
Packit Service 8bf002
Packit Service 8bf002
/*
Packit Service 8bf002
 * Values of insert_sep (flag of insertion of token separator).
Packit Service 8bf002
 * Used only in POST_STD mode.
Packit Service 8bf002
 */
Packit Service 8bf002
#define NO_SEP          0   /* No separator is inserted             */
Packit Service 8bf002
#define INSERT_SEP      1   /* Next get_ch() insert a separator     */
Packit Service 8bf002
#define INSERTED_SEP    2   /* Last get_ch() Inserted a separator   */
Packit Service 8bf002
Packit Service 8bf002
#define str_eq(s1, s2)  (strcmp(s1, s2) == 0)
Packit Service 8bf002
Packit Service 8bf002
#ifndef IO_SUCCESS
Packit Service 8bf002
#define IO_SUCCESS      0
Packit Service 8bf002
#endif
Packit Service 8bf002
#ifndef IO_ERROR
Packit Service 8bf002
#define IO_ERROR        (errno ? errno : 1)
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
/*
Packit Service 8bf002
 * Externs
Packit Service 8bf002
 */
Packit Service 8bf002
Packit Service 8bf002
/* The minimum translation limits specified by the Standards.       */
Packit Service 8bf002
extern struct std_limits_ {
Packit Service 8bf002
        long    str_len;            /* Least maximum of string len. */
Packit Service 8bf002
        size_t  id_len;             /* Least maximum of ident len.  */
Packit Service 8bf002
        int     n_mac_pars;         /* Least maximum of num of pars.*/
Packit Service 8bf002
        int     exp_nest;           /* Least maximum of expr nest   */
Packit Service 8bf002
        int     blk_nest;           /* Least maximum of block nest  */
Packit Service 8bf002
        int     inc_nest;           /* Least maximum of include nest*/
Packit Service 8bf002
        long    n_macro;            /* Least maximum of num of macro*/
Packit Service 8bf002
        long    line_num;           /* Maximum source line number   */
Packit Service 8bf002
} std_limits;    
Packit Service 8bf002
/* The boolean flags specified by the execution options.    */
Packit Service 8bf002
extern struct option_flags_ {
Packit Service 8bf002
        int     c;                  /* -C option (keep comments)    */
Packit Service 8bf002
        int     k;                  /* -k option (keep white spaces)*/
Packit Service 8bf002
        int     z;      /* -z option (no-output of included file)   */
Packit Service 8bf002
        int     p;                  /* -P option (no #line output)  */
Packit Service 8bf002
        int     q;                  /* -Q option (diag to mcpp.err) */
Packit Service 8bf002
        int     v;                  /* -v option (verbose)          */
Packit Service 8bf002
        int     trig;               /* -3 option (toggle trigraphs) */
Packit Service 8bf002
        int     dig;                /* -2 option (toggle digraphs)  */
Packit Service 8bf002
        int     lang_asm;           /* -a option (assembler source) */
Packit Service 8bf002
        int     no_source_line;     /* Do not output line in diag.  */
Packit Service 8bf002
        int     dollar_in_name;     /* Allow $ in identifiers       */
Packit Service 8bf002
} option_flags;
Packit Service 8bf002
Packit Service 8bf002
extern int      mcpp_mode;          /* Mode of preprocessing        */
Packit Service 8bf002
extern int      stdc_val;           /* Value of __STDC__            */
Packit Service 8bf002
extern long     stdc_ver;           /* Value of __STDC_VERSION__    */
Packit Service 8bf002
extern long     cplus_val;          /* Value of __cplusplus for C++ */
Packit Service 8bf002
extern int      stdc2;      /* cplus_val or (stdc_ver >= 199901L)   */
Packit Service 8bf002
extern int      stdc3;      /* (stdc_ver or cplus_val) >= 199901L   */
Packit Service 8bf002
extern int      standard;           /* mcpp_mode is STD or POST_STD */
Packit Service 8bf002
extern int      std_line_prefix;    /* #line in C source style      */
Packit Service 8bf002
extern int      warn_level;         /* Level of warning             */
Packit Service 8bf002
extern int      errors;             /* Error counter                */
Packit Service 8bf002
extern long     src_line;           /* Current source line number   */
Packit Service 8bf002
extern int      wrong_line;         /* Force #line to compiler      */
Packit Service 8bf002
extern int      newlines;           /* Count of blank lines         */
Packit Service 8bf002
extern int      keep_comments;      /* Don't remove comments        */
Packit Service 8bf002
extern int      keep_spaces;        /* Don't remove white spaces    */
Packit Service 8bf002
extern int      include_nest;       /* Nesting level of #include    */
Packit Service 8bf002
extern const char *     null;       /* "" string for convenience    */
Packit Service 8bf002
extern const char **    inc_dirp;   /* Directory of #includer       */
Packit Service 8bf002
extern const char *     cur_fname;  /* Current source file name     */
Packit Service 8bf002
extern int      no_output;          /* Don't output included file   */
Packit Service 8bf002
extern int      in_directive;       /* In process of #directive     */
Packit Service 8bf002
extern int      in_define;          /* In #define line              */
Packit Service 8bf002
extern int      in_getarg;          /* Collecting arguments of macro*/
Packit Service 8bf002
extern int      in_include;         /* In #include line             */
Packit Service 8bf002
extern int      in_if;              /* In #if and non-skipped expr. */
Packit Service 8bf002
extern long     macro_line;         /* Line number of macro call    */
Packit Service 8bf002
extern char *   macro_name;         /* Currently expanding macro    */
Packit Service 8bf002
extern int      openum;             /* Number of operator or punct. */
Packit Service 8bf002
extern IFINFO *     ifptr;          /* -> current ifstack item      */
Packit Service 8bf002
extern FILEINFO *   infile;         /* Current input file or macro  */
Packit Service 8bf002
extern FILE *   fp_in;              /* Input stream to preprocess   */
Packit Service 8bf002
extern FILE *   fp_out;             /* Output stream preprocessed   */
Packit Service 8bf002
extern FILE *   fp_err;             /* Diagnostics stream           */
Packit Service 8bf002
extern FILE *   fp_debug;           /* Debugging information stream */
Packit Service 8bf002
extern int      insert_sep;         /* Inserted token separator flag*/
Packit Service 8bf002
extern int      mkdep;              /* Output source file dependency*/
Packit Service 8bf002
extern int      mbchar;             /* Encoding of multi-byte char  */
Packit Service 8bf002
extern int      mbchk;              /* Possible multi-byte char     */
Packit Service 8bf002
extern int      bsl_in_mbchar;      /* 2nd byte of mbchar has '\\'  */
Packit Service 8bf002
extern int      bsl_need_escape;/* '\\' in mbchar should be escaped */
Packit Service 8bf002
extern int      mcpp_debug;         /* Class of debug information   */
Packit Service 8bf002
extern long     in_asm;             /* In #asm - #endasm block      */
Packit Service 8bf002
extern jmp_buf  error_exit;         /* Exit on fatal error          */
Packit Service 8bf002
extern char *   cur_fullname;       /* Full name of current source  */
Packit Service 8bf002
extern short *  char_type;          /* Character classifier         */
Packit Service 8bf002
extern char *   workp;              /* Free space in work[]         */
Packit Service 8bf002
extern char * const     work_end;   /* End of work[] buffer         */
Packit Service 8bf002
extern char     identifier[];       /* Lastly scanned name          */
Packit Service 8bf002
extern IFINFO   ifstack[];          /* Information of #if nesting   */
Packit Service 8bf002
extern char     work_buf[];
Packit Service 15ba5b
extern FILEINFO * sh_file;
Packit Service 15ba5b
extern int      sh_line;
Packit Service 8bf002
        /* Temporary buffer for directive line and macro expansion  */
Packit Service 8bf002
Packit Service 8bf002
/* main.c   */
Packit Service 8bf002
extern void     un_predefine( int clearall);
Packit Service 8bf002
                /* Undefine predefined macros   */
Packit Service 8bf002
Packit Service 8bf002
/* directive.c  */
Packit Service 8bf002
extern void     directive( void);
Packit Service 8bf002
                /* Process #directive line      */
Packit Service 8bf002
extern DEFBUF * do_define( int ignore_redef, int predefine);
Packit Service 8bf002
                /* Do #define directive         */
Packit Service 8bf002
extern DEFBUF * look_id( const char * name);
Packit Service 8bf002
                /* Look for a #define'd thing   */
Packit Service 8bf002
extern DEFBUF **    look_prev( const char * name, int * cmp);
Packit Service 8bf002
                /* Look for place to insert def.*/
Packit Service 8bf002
extern DEFBUF * look_and_install( const char * name, int numargs
Packit Service 8bf002
        , const char * parmnames, const char * repl);
Packit Service 8bf002
                /* Look and insert macro def.   */
Packit Service 8bf002
extern DEFBUF * install_macro( const char * name, int numargs
Packit Service 8bf002
        , const char * parmnames, const char * repl, DEFBUF ** prevp, int cmp
Packit Service 8bf002
        , int predefine);
Packit Service 8bf002
                /* Install a def to symbol table*/
Packit Service 8bf002
extern int      undefine( const char * name);
Packit Service 8bf002
                /* Delete from symbol table     */
Packit Service 8bf002
extern void     dump_a_def( const char * why, const DEFBUF * dp, int newdef
Packit Service 8bf002
        , int comment, FILE * fp);
Packit Service 8bf002
                /* Dump a specific macro def    */
Packit Service 8bf002
extern void     dump_def( int comment, int K_opt);
Packit Service 8bf002
                /* Dump current macro defs      */
Packit Service 8bf002
Packit Service 8bf002
/* eval.c   */
Packit Service 8bf002
extern expr_t   eval_if( void);
Packit Service 8bf002
                /* Evaluate #if expression      */
Packit Service 8bf002
extern VAL_SIGN *   eval_num( const char * nump);
Packit Service 8bf002
                /* Evaluate preprocessing number*/
Packit Service 8bf002
Packit Service 8bf002
/* expand.c */
Packit Service 8bf002
extern char *   (* expand_macro)( DEFBUF * defp, char * out, char * out_end
Packit Service 8bf002
        , LINE_COL line_col, int * pragma_op);
Packit Service 8bf002
                /* Expand a macro completely    */
Packit Service 8bf002
extern void     expand_init( int compat, int strict_ansi);
Packit Service 8bf002
                /* Initialize expand_macro()    */
Packit Service 8bf002
extern DEFBUF * is_macro( char ** cp);
Packit Service 8bf002
                /* The sequence is a macro call?*/
Packit Service 8bf002
Packit Service 8bf002
/* mbchar.c     */
Packit Service 8bf002
extern size_t   (* mb_read)( int c1, char ** in_pp, char ** out_pp);
Packit Service 8bf002
                /* Read mbchar sequence         */
Packit Service 8bf002
extern const char *     set_encoding( char * name, char * env, int pragma);
Packit Service 8bf002
                /* Multi-byte char encoding     */
Packit Service 8bf002
extern void     mb_init( void);
Packit Service 8bf002
                /* Initialize mbchar variables  */
Packit Service 8bf002
extern uexpr_t  mb_eval( char ** seq_pp);
Packit Service 8bf002
                /* Evaluate mbchar in #if       */
Packit Service 8bf002
extern int      last_is_mbchar( const char * in, int len);
Packit Service 8bf002
                /* The line ends with MBCHAR ?  */
Packit Service 8bf002
Packit Service 8bf002
/* support.c    */
Packit Service 8bf002
extern int      get_unexpandable( int c, int diag);
Packit Service 8bf002
                /* Get next unexpandable token  */
Packit Service 8bf002
extern void     skip_nl( void);
Packit Service 8bf002
                /* Skip to the end of the line  */
Packit Service 8bf002
extern int      skip_ws( void);
Packit Service 8bf002
                /* Skip over white-spaces       */
Packit Service 8bf002
extern int      scan_token( int c, char ** out_pp, char * out_end);
Packit Service 8bf002
                /* Get the next token           */
Packit Service 8bf002
extern char *   scan_quote( int delim, char * out, char * out_end, int diag);
Packit Service 8bf002
                /* Scan a quoted literal        */
Packit Service 8bf002
extern int      id_operator( const char * name);
Packit Service 8bf002
                /* Check identifier-like ops    */
Packit Service 8bf002
extern void     expanding( const char * name, int to_be_freed);
Packit Service 8bf002
                /* Save macro name expanding    */
Packit Service 8bf002
extern void     clear_exp_mac( void);
Packit Service 8bf002
                /* Clear expanding macro infs   */
Packit Service 8bf002
extern int      get_ch( void);
Packit Service 8bf002
                /* Get the next char from input */
Packit Service 8bf002
extern int      cnv_trigraph( char * in);
Packit Service 8bf002
                /* Do trigraph replacement      */
Packit Service 8bf002
extern int      cnv_digraph( char * in);
Packit Service 8bf002
                /* Convert digraphs to usual tok*/
Packit Service 8bf002
extern void     unget_ch( void);
Packit Service 8bf002
                /* Push back the char to input  */
Packit Service 8bf002
extern FILEINFO *   unget_string( const char * text, const char * name);
Packit Service 8bf002
                /* Push back the string to input*/
Packit Service 8bf002
extern char *   save_string( const char * text);
Packit Service 8bf002
                /* Stuff string in malloc mem.  */
Packit Service 8bf002
extern FILEINFO *   get_file( const char * name, const char * src_dir
Packit Service 8bf002
        , const char * fullname, size_t bufsize, int include_opt);
Packit Service 8bf002
                /* New FILEINFO initialization  */
Packit Service 8bf002
extern char *   (xmalloc)( size_t size);
Packit Service 8bf002
                /* Get memory or die            */
Packit Service 8bf002
extern char *   (xrealloc)( char * ptr, size_t size);
Packit Service 8bf002
                /* Reallocate memory or die     */
Packit Service 8bf002
extern LINE_COL *   get_src_location( LINE_COL * p_line_col);
Packit Service 8bf002
                /* Get location on source file  */
Packit Service 8bf002
extern void     cfatal( const char * format, const char * arg1, long arg2
Packit Service 8bf002
        , const char * arg3);
Packit Service 8bf002
                /* Print a fatal error and exit */
Packit Service 8bf002
extern void     cerror( const char * format, const char * arg1, long arg2
Packit Service 8bf002
        , const char * arg3);
Packit Service 8bf002
                /* Print an error message       */
Packit Service 8bf002
extern void     cwarn( const char * format, const char * arg1, long arg2
Packit Service 8bf002
        , const char * arg3);
Packit Service 8bf002
                /* Print a warning message      */
Packit Service 8bf002
extern void     dump_string( const char * why, const char * text);
Packit Service 8bf002
                /* Dump text readably           */
Packit Service 8bf002
extern void     dump_unget( const char * why);
Packit Service 8bf002
                /* Dump all ungotten junk       */
Packit Service 8bf002
/* Support for alternate output mechanisms (e.g. memory buffers) */
Packit Service 8bf002
extern int      (* mcpp_fputc)( int c, OUTDEST od),
Packit Service 8bf002
                (* mcpp_fputs)( const char * s, OUTDEST od),
Packit Service 8bf002
                (* mcpp_fprintf)( OUTDEST od, const char * format, ...);
Packit Service 8bf002
Packit Service 8bf002
/* system.c */
Packit Service 8bf002
extern void     do_options( int argc, char ** argv, char ** in_pp
Packit Service 8bf002
        , char ** out_pp);
Packit Service 8bf002
                /* Process command line args    */
Packit Service 8bf002
extern void     init_sys_macro( void);
Packit Service 8bf002
                /* Define system-specific macro */
Packit Service 8bf002
extern void     at_start( void);
Packit Service 8bf002
                /* Commands prior to main input */
Packit Service 8bf002
extern void     put_depend( const char * filename);
Packit Service 8bf002
                /* Output source dependency line*/
Packit Service 8bf002
extern int      do_include( int next);
Packit Service 8bf002
                /* Process #include directive   */
Packit Service 8bf002
extern void     add_file( FILE * fp, const char * src_dir
Packit Service 8bf002
        , const char * filename, const char * fullname, int include_opt);
Packit Service 8bf002
                /* Chain the included file      */
Packit Service 8bf002
extern void     sharp( FILEINFO * sharp_file, int marker);
Packit Service 8bf002
                /* Output # line number         */
Packit Service 8bf002
extern void     do_pragma( void);
Packit Service 8bf002
                /* Process #pragma directive    */
Packit Service 8bf002
extern void     put_asm( void);
Packit Service 8bf002
                /* Putout an asm code line      */
Packit Service 8bf002
extern void     do_old( void);
Packit Service 8bf002
                /* Process older directives     */
Packit Service 8bf002
extern void     at_end( void);
Packit Service 8bf002
                /* Do the final commands        */
Packit Service 8bf002
extern void     print_heap( void);
Packit Service 8bf002
                /* Print blocks of heap memory  */
Packit Service 8bf002
#if ! HOST_HAVE_STPCPY
Packit Service 8bf002
extern char *   stpcpy( char * dest, const char * src);
Packit Service 8bf002
                /* Non-Standard library function*/
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
#if MCPP_LIB    /* Setting to use mcpp as a subroutine  */
Packit Service 8bf002
/* directive.c  */
Packit Service 8bf002
extern void     clear_symtable( void);
Packit Service 8bf002
                /* Free all macro definitions   */
Packit Service 8bf002
/* system.c     */
Packit Service 8bf002
extern void     clear_filelist( void);
Packit Service 8bf002
                /* Free filename and directory list     */
Packit Service 8bf002
/* The following 5 functions are to Initialize static variables.    */
Packit Service 8bf002
/* directive.c  */
Packit Service 8bf002
extern void     init_directive( void);
Packit Service 8bf002
/* eval.c   */
Packit Service 8bf002
extern void     init_eval( void);
Packit Service 8bf002
/* support.c    */
Packit Service 8bf002
extern void     init_support( void);
Packit Service 8bf002
/* system.c */
Packit Service 8bf002
extern void     init_system( void);
Packit Service 8bf002
Packit Service 8bf002
#if HOST_COMPILER == GNUC && (SYS_FAMILY == SYS_UNIX && SYSTEM != SYS_CYGWIN)
Packit Service 8bf002
#pragma GCC visibility pop
Packit Service 8bf002
#endif
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 15ba5b
#if HOST_HAVE_STPCPY && !defined(stpcpy)
Packit Service 8bf002
extern char *   stpcpy( char * dest, const char * src);
Packit Service 8bf002
#endif