⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cppadd.h

📁 类PASCAL语言的编译器,LINUX环境的,我没试过是否正确.
💻 H
字号:
/****************************************************************************** *                               FREXXWARE * ---------------------------------------------------------------------------- * * Project: Frexx C Preprocessor * $Source: /home/user/start/cpp/RCS/cppadd.h,v $ * $Revision: 1.5 $ * $Date: 1994/01/24 09:38:12 $ * $Author: start $ * $State: Exp $ * $Locker: start $ * * ---------------------------------------------------------------------------- * $Log: cppadd.h,v $ * Revision 1.5  1994/01/24  09:38:12  start * Added the 'rightconcat' in the global structure. * * Revision 1.4  1993/12/06  13:51:20  start * A lot of new stuff (too much to mention) * * Revision 1.3  1993/11/29  14:01:13  start * New features added * * Revision 1.2  1993/11/11  07:16:39  start * New stuff * * Revision 1.1  1993/11/03  09:15:59  start * Initial revision * * *****************************************************************************//********************************************************************** * * cppadd.h * * Prototypes and structures added by Daniel Stenberg. * *******/#include <stdarg.h>#include "memory.h"struct Global {  /*   * Commonly used global variables:   * line       is the current input line number.   * wrongline  is set in many places when the actual output   *            line is out of sync with the numbering, e.g,   *            when expanding a macro with an embedded newline.   *   * tokenbuf   holds the last identifier scanned (which might   *            be a candidate for macro expansion).   * errors     is the running cpp error counter.   * infile     is the head of a linked list of input files (extended by   *            #include and macros being expanded).  infile always points   *            to the current file/macro.  infile->parent to the includer,   *            etc.  infile->fd is NULL if this input stream is a macro.   */  int           line;                   /* Current line number          */  int           wrongline;              /* Force #line to compiler      */  char          *tokenbuf;              /* Buffer for current input token */  char      *functionname;  /* Buffer for current function */  int       funcline;       /* Line number of current function */  int           tokenbsize;             /* Allocated size of tokenbuf,  */                                        /* not counting zero at end.    */  int           errors;                 /* cpp error counter            */  FILEINFO      *infile;                /* Current input file           */#if DEBUG  int           debug;                  /* TRUE if debugging now        */#endif  /*   * This counter is incremented when a macro expansion is initiated.   * If it exceeds a built-in value, the expansion stops -- this tests   * for a runaway condition:   *    #define X Y   *    #define Y X   *    X   * This can be disabled by falsifying rec_recover.  (Nothing does this   * currently: it is a hook for an eventual invocation flag.)   */  int           recursion;              /* Infinite recursion counter   */  int           rec_recover;            /* Unwind recursive macros      */  /*   * instring is set TRUE when a string is scanned.  It modifies the   * behavior of the "get next character" routine, causing all characters   * to be passed to the caller (except <DEF_MAGIC>).  Note especially that   * comments and \<newline> are not removed from the source.  (This   * prevents cpp output lines from being arbitrarily long).   *   * inmacro is set by #define -- it absorbs comments and converts   * form-feed and vertical-tab to space, but returns \<newline>   * to the caller.  Strictly speaking, this is a bug as \<newline>   * shouldn't delimit tokens, but we'll worry about that some other   * time -- it is more important to prevent infinitly long output lines.   *   * instring and inmarcor are parameters to the get() routine which   * were made global for speed.   */  int           instring;       /* TRUE if scanning string      */  int           inmacro;        /* TRUE if #defining a macro    */    /*   * work[] and workp are used to store one piece of text in a temporay   * buffer.  To initialize storage, set workp = work.  To store one   * character, call save(c);  (This will fatally exit if there isn't   * room.)  To terminate the string, call save(EOS).  Note that   * the work buffer is used by several subroutines -- be sure your   * data won't be overwritten.  The extra byte in the allocation is   * needed for string formal replacement.   */  char          work[NWORK + 1];        /* Work buffer                  */  char          *workp;                 /* Work buffer pointer          */  /*   * keepcomments is set TRUE by the -C option.  If TRUE, comments   * are written directly to the output stream.  This is needed if   * the output from cpp is to be passed to lint (which uses commands   * embedded in comments).  cflag contains the permanent state of the   * -C flag.  keepcomments is always falsified when processing #control   * commands and when compilation is supressed by a false #if   *   * If eflag is set, CPP returns "success" even if non-fatal errors   * were detected.   *   * If nflag is non-zero, no symbols are predefined except __LINE__.   * __FILE__, and __DATE__.  If nflag > 1, absolutely no symbols   * are predefined.   */  char          keepcomments;   /* Write out comments flag      */  char          cflag;          /* -C option (keep comments)    */  char          eflag;          /* -E option (never fail)       */  char          nflag;          /* -N option (no predefines)    */  char          wflag;          /* -W option (write #defines)   */  /*   * ifstack[] holds information about nested #if's.  It is always   * accessed via *ifptr.  The information is as follows:   *    WAS_COMPILING   state of compiling flag at outer level.   *    ELSE_SEEN       set TRUE when #else seen to prevent 2nd #else.   *    TRUE_SEEN       set TRUE when #if or #elif succeeds   * ifstack[0] holds the compiling flag.  It is TRUE if compilation   * is currently enabled.  Note that this must be initialized TRUE.   */  char          ifstack[BLK_NEST];      /* #if information      */  char          *ifptr;                 /* -> current ifstack[] */  /*   * incdir[] stores the -i directories (and the system-specific   * #include <...> directories.   */  char  *incdir[NINCLUDE];              /* -i directories               */  char  **incend;                       /* -> free space in incdir[]    */  /*   * include[] stores the -X and -x files.   */  char  *include[NINCLUDE];  char  includeshow[NINCLUDE]; /* show it or not! */  char  included;  /*   * This is the table used to predefine target machine and operating   * system designators.        It may need hacking for specific circumstances.   * Note: it is not clear that this is part of the Ansi Standard.   * The -B option supresses preset definitions.   */  char  *preset[5];                     /* names defined at cpp start   */  /*   * The value of these predefined symbols must be recomputed whenever   * they are evaluated.        The order must not be changed.   */  char  *magic[5];                      /* Note: order is important     */  /*   * This is the variable saying if Cpp should remove C++ style comments from   * the output. Default is... TRUE, yes, pronto, do it!!!   */    char cplusplus;  char *sharpfilename;  /*   * parm[], parmp, and parlist[] are used to store #define() argument   * lists.  nargs contains the actual number of parameters stored.   */  char  parm[NPARMWORK + 1];    /* define param work buffer     */  char  *parmp;                 /* Free space in parm           */  char  *parlist[LASTPARM];     /* -> start of each parameter   */  int   nargs;                  /* Parameters for this macro    */  DEFBUF *macro;                /* Catches start of infinite macro      */  DEFBUF *symtab[SBSIZE];       /* Symbol table queue headers   */  int evalue;                   /* Current value from evallex() */  char *(*input)(char *, int, void *);  /* Input function */  char *first_file;             /* Preprocessed file. */  void *userdata;               /* Data sent to input function */  void (*output)(int, void *);  /* output function */  void (*error)(void *, char *, va_list);       /* error function */  char linelines;  char warnillegalcpp; /* warn for illegal preprocessor instructions? */  char outputLINE;   /* output 'line' in #line instructions */  char showversion;  /* display version */  char showincluded; /* display included files */  char showbalance; /* display paren balance */  char showspace;   /* display all whitespaces as they are */  char comment;     /* TRUE if a comment just has been written to output */  char *spacebuf;    /* Buffer to store whitespaces in if -H */  long chpos;       /* Number of whitespaces in buffer */  char nestcomments; /* Allow nested comments */  char warnnestcomments; /* Warn at nested comments */  char warnnoinclude; /* Warn at missing include file */  char outputfile; /* output the main file */  char out; /* should we output anything now? */  char rightconcat; /* should the right part of a concatenation be avaluated					   before the concat (TRUE) or after (FALSE) */  char *initialfunc; /* file to include first in all functions */  char *excludedinit[20]; /* functions (names) excluded from the initfunc */  int excluded;  char outputfunctions;  /* output all discovered functions to stderr! */};typedef enum {  ERROR_STRING_MUST_BE_IF,  ERROR_STRING_MAY_NOT_FOLLOW_ELSE,  ERROR_ERROR,  ERROR_PREPROC_FAILURE,  ERROR_MISSING_ARGUMENT,  ERROR_INCLUDE_SYNTAX,  ERROR_DEFINE_SYNTAX,  ERROR_REDEFINE,  ERROR_ILLEGAL_UNDEF,  ERROR_RECURSIVE_MACRO,  ERROR_EOF_IN_ARGUMENT,  ERROR_MISPLACED_CONSTANT,  ERROR_IF_OVERFLOW,  ERROR_ILLEGAL_IF_LINE,  ERROR_OPERATOR,  ERROR_EXPR_OVERFLOW,  ERROR_UNBALANCED_PARENS,  ERROR_MISPLACED,  ERROR_STRING_IN_IF,  ERROR_DEFINED_SYNTAX,  ERROR_ILLEGAL_ASSIGN,  ERROR_ILLEGAL_BACKSLASH,  ERROR_SIZEOF_SYNTAX,  ERROR_SIZEOF_UNKNOWN,  ERROR_SIZEOF_ILLEGAL_TYPE,  ERROR_SIZEOF_NO_TYPE,  ERROR_UNTERMINATED_STRING,  ERROR_EOF_IN_COMMENT,  ERROR_IFDEF_DEPTH,  ERROR_ILLEGAL_CHARACTER,  ERROR_ILLEGAL_CHARACTER2,  ERROR_SIZEOF_BUG,  ERROR_IF_OPERAND,  ERROR_STRANG_CHARACTER,  ERROR_STRANG_CHARACTER2,  BORDER_ERROR_WARN, /* below this number: errors, above: warnings */  WARN_CONTROL_LINE_IN_MACRO,  WARN_ILLEGAL_COMMAND,  WARN_UNEXPECTED_TEXT_IGNORED,  WARN_TOO_FEW_VALUES_TO_SIZEOF,  WARN_TOO_MANY_VALUES_TO_SIZEOF,  WARN_NOT_DEFINED,  WARN_INTERNAL_ERROR,  WARN_MACRO_NEEDS_ARGUMENTS,  WARN_WRONG_NUMBER_ARGUMENTS,  WARN_DIVISION_BY_ZERO,  WARN_ILLEGAL_OCTAL,  WARN_MULTIBYTE_NOT_PORTABLE,  WARN_CANNOT_OPEN_INCLUDE,  WARN_BRACKET_DEPTH,  WARN_PAREN_DEPTH,  WARN_BRACE_DEPTH,  WARN_NESTED_COMMENT,  BORDER_WARN_FATAL, /* below this number: warnings, above: fatals */  FATAL_TOO_MANY_NESTINGS,  FATAL_FILENAME_BUFFER_OVERFLOW,  FATAL_TOO_MANY_INCLUDE_DIRS,  FATAL_TOO_MANY_INCLUDE_FILES,  FATAL_TOO_MANY_ARGUMENTS_MACRO,  FATAL_MACRO_AREA_OVERFLOW,  FATAL_ILLEGAL_MACRO,  FATAL_TOO_MANY_ARGUMENTS_EXPANSION,  FATAL_OUT_OF_SPACE_IN_ARGUMENT,  FATAL_WORK_AREA_OVERFLOW,  FATAL_WORK_BUFFER_OVERFLOW,  FATAL_OUT_OF_MEMORY,  FATAL_TOO_MUCH_PUSHBACK  } ErrorCode;/********************************************************************** * RETURN CODES: *********************************************************************/typedef enum {  FPP_OK,  FPP_OUT_OF_MEMORY,  FPP_TOO_MANY_NESTED_STATEMENTS,  FPP_FILENAME_BUFFER_OVERFLOW,  FPP_NO_INCLUDE,  FPP_OPEN_ERROR,  FPP_TOO_MANY_ARGUMENTS,  FPP_WORK_AREA_OVERFLOW,  FPP_ILLEGAL_MACRO,  FPP_EOF_IN_MACRO,  FPP_OUT_OF_SPACE_IN_MACRO_EXPANSION,  FPP_ILLEGAL_CHARACTER,  FPP_CANT_USE_STRING_IN_IF,  FPP_BAD_IF_DEFINED_SYNTAX,  FPP_IF_ERROR,  FPP_SIZEOF_ERROR,  FPP_UNTERMINATED_STRING,  FPP_TOO_MANY_INCLUDE_DIRS,  FPP_TOO_MANY_INCLUDE_FILES,  FPP_INTERNAL_ERROR,  FPP_LAST_ERROR} ReturnCode;/* Nasty defines to make them appear as three different functions! */#define cwarn cerror#define cfatal cerror /********************************************************************** * PROTOTYPES: *********************************************************************/int PREFIX fppPreProcess(REG(a0) struct fppTag *);void Freemem(void *);void Error(struct Global *, char *, ...);void Putchar(struct Global *, int);void Putstring(struct Global *, char *);void Putint(struct Global *, int);char *savestring(struct Global *, char *);ReturnCode addfile(struct Global *, FILE *, char *);int catenate(struct Global *, ReturnCode *);void cerror(struct Global *, ErrorCode, ...);ReturnCode control(struct Global *, int *);ReturnCode dodefine(struct Global *);int dooptions(struct Global *, struct fppTag *);void doundef(struct Global *);void dumpparm(char *);ReturnCode expand(struct Global *, DEFBUF *);int get(struct Global *);ReturnCode initdefines(struct Global *);void outdefines(struct Global *);ReturnCode save(struct Global *, int);void scanid(struct Global *, int);ReturnCode scannumber(struct Global *, int, ReturnCode(*)(struct Global *, int));ReturnCode scanstring(struct Global *, int, ReturnCode(*)(struct Global *, int));void unget(struct Global *);ReturnCode ungetstring(struct Global *, char *);ReturnCode eval(struct Global *, int *);#ifdef  DEBUG_EVALvoid dumpstack(OPTAB[NEXP], register OPTAB *, int [NEXP], register int *);#endifvoid skipnl(struct Global *);int skipws(struct Global *);ReturnCode macroid(struct Global *, int *);ReturnCode getfile(struct Global *, int, char *, FILEINFO **);DEFBUF *lookid(struct Global *, int );DEFBUF *defendel(struct Global *, char *, int);#if DEBUGvoid dumpdef(char *);void dumpadef(char *, register DEFBUF *);#endifReturnCode openfile(struct Global *,char *);int cget(struct Global *);void deldefines(struct Global *);char *Getmem(struct Global *, int);ReturnCode openinclude(struct Global *, char *, int);ReturnCode expstuff(struct Global *, char *, char *);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -