📄 cpplib.h
字号:
/* Definitions for CPP library. Copyright (C) 1995 Free Software Foundation, Inc. Written by Per Bothner, 1994-95.This program is free software; you can redistribute it and/or modify itunder the terms of the GNU General Public License as published by theFree Software Foundation; either version 2, or (at your option) anylater version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See theGNU General Public License for more details.You should have received a copy of the GNU General Public Licensealong with this program; if not, write to the Free SoftwareFoundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. In other words, you are welcome to use, share and improve this program. You are forbidden to forbid anyone else to use, share and improve what you give them. Help stamp out software-hoarding! */#include <sys/types.h>#include <sys/stat.h>#ifdef __cplusplusextern "C" {#endif#define STATIC_BUFFERStypedef unsigned char U_CHAR;struct parse_file;typedef struct cpp_reader cpp_reader;typedef struct cpp_buffer cpp_buffer;typedef struct cpp_options cpp_options;typedef struct hashnode cpp_hashnode;enum cpp_token { CPP_EOF = -1, CPP_OTHER = 0, CPP_COMMENT = 1, CPP_HSPACE, CPP_VSPACE, /* newlines and #line directives */ CPP_NAME, CPP_NUMBER, CPP_CHAR, CPP_STRING, CPP_DIRECTIVE, CPP_LPAREN, /* "(" */ CPP_RPAREN, /* ")" */ CPP_LBRACE, /* "{" */ CPP_RBRACE, /* "}" */ CPP_COMMA, /* "," */ CPP_SEMICOLON,/* ";" */ CPP_3DOTS, /* "..." */#if 0 CPP_ANDAND, /* "&&" */ CPP_OROR, /* "||" */ CPP_LSH, /* "<<" */ CPP_RSH, /* ">>" */ CPP_EQL, /* "==" */ CPP_NEQ, /* "!=" */ CPP_LEQ, /* "<=" */ CPP_GEQ, /* ">=" */ CPP_PLPL, /* "++" */ CPP_MINMIN, /* "--" */#endif /* POP_TOKEN is returned when we've popped a cpp_buffer. */ CPP_POP};#ifndef PARAMS#ifdef __STDC#define PARAMS(P) P#else#define PARAMS(P) ()#endif#endif /* !PARAMS */typedef enum cpp_token (*parse_underflow_t) PARAMS((cpp_reader*));typedef int (*parse_cleanup_t) PARAMS((cpp_buffer *, cpp_reader*));/* A parse_marker indicates a previous position, which we can backtrack to. */struct parse_marker { cpp_buffer *buf; struct parse_marker *next; int position;};extern void parse_set_mark PARAMS ((struct parse_marker*, cpp_reader*));extern void parse_clear_mark PARAMS ((struct parse_marker*));extern void parse_goto_mark PARAMS((struct parse_marker*, cpp_reader*));extern void parse_move_mark PARAMS((struct parse_marker*, cpp_reader*));extern int cpp_handle_options PARAMS ((cpp_reader*, int, char**));extern enum cpp_token cpp_get_token PARAMS ((struct parse_marker*));extern void cpp_skip_hspace PARAMS((cpp_reader*));extern enum cpp_token cpp_get_non_space_token PARAMS ((cpp_reader *));/* Maintain and search list of included files, for #import. */#define IMPORT_HASH_SIZE 31struct import_file { char *name; ino_t inode; dev_t dev; struct import_file *next;};/* If we have a huge buffer, may need to cache more recent counts */#define CPP_LINE_BASE(BUF) ((BUF)->buf + (BUF)->line_base)struct cpp_buffer { unsigned char *buf; unsigned char *cur; unsigned char *rlimit; /* end of valid data */ unsigned char *alimit; /* end of allocated buffer */ unsigned char *prev; /* start of current token */ char *fname; /* Filename specified with #line command. */ char *nominal_fname; /* Record where in the search path this file was found. For #include_next. */ struct file_name_list *dir; long line_base; long lineno; /* Line number at CPP_LINE_BASE. */ long colno; /* Column number at CPP_LINE_BASE. */#ifndef STATIC_BUFFERS cpp_buffer *chain;#endif parse_underflow_t underflow; parse_cleanup_t cleanup; void *data; struct parse_marker *marks; /* Value of if_stack at start of this file. Used to prohibit unmatched #endif (etc) in an include file. */ struct if_stack *if_stack; /* True if this is a header file included using <FILENAME>. */ char system_header_p; char seen_eof; /* True if buffer contains escape sequences. Currently there are are only two kind: "@-" means following identifier should not be macro-expanded. "@ " means a token-separator. This turns into " " in final output if not stringizing and needed to separate tokens; otherwise nothing. "@@" means a normal '@'. (An '@' inside a string stands for itself and is never an escape.) */ char has_escapes;};struct cpp_pending; /* Forward declaration - for C++. */struct file_name_map_list;typedef struct assertion_hashnode ASSERTION_HASHNODE;#define ASSERTION_HASHSIZE 37#ifdef STATIC_BUFFERS/* Maximum nesting of cpp_buffers. We use a static limit, partly for efficiency, and partly to limit runaway recursion. */#define CPP_STACK_MAX 200#endifstruct cpp_reader { unsigned char *limit; parse_underflow_t get_token; cpp_buffer *buffer;#ifdef STATIC_BUFFERS cpp_buffer buffer_stack[CPP_STACK_MAX];#endif int errors; /* Error counter for exit code */ void *data; U_CHAR *token_buffer; int token_buffer_size; /* Line where a newline was first seen in a string constant. */ int multiline_string_line; /* Current depth in #include directives that use <...>. */ int system_include_depth; /* List of included files that contained #pragma once. */ struct file_name_list *dont_repeat_files; /* List of other included files. If ->control_macro if nonzero, the file had a #ifndef around the entire contents, and ->control_macro gives the macro name. */ struct file_name_list *all_include_files; /* Current maximum length of directory names in the search path for include files. (Altered as we get more of them.) */ int max_include_len; /* Hash table of files already included with #include or #import. */ struct import_file *import_hash_table[IMPORT_HASH_SIZE]; struct if_stack *if_stack; /* Nonzero means we are inside an IF during a -pcp run. In this mode macro expansion is done, and preconditions are output for all macro uses requiring them. */ char pcp_inside_if; /* Nonzero means we have printed (while error reporting) a list of containing files that matches the current status. */ char input_stack_listing_current; /* If non-zero, macros are not expanded. */ char no_macro_expand; /* Print column number in error messages. */ char show_column; /* We're printed a warning recommending against using #import. */ char import_warning; /* If true, character between '<' and '>' are a single (string) token. */ char parsing_include_directive; /* True if escape sequences (as described for has_escapes in parse_buffer) should be emitted. */ char output_escapes; /* 0: Have seen non-white-space on this line. 1: Only seen white space so far on this line. 2: Only seen white space so far in this file. */ char only_seen_white; /* Nonzero means this file was included with a -imacros or -include command line and should not be recorded as an include file. */ int no_record_file; long lineno; struct tm *timebuf; ASSERTION_HASHNODE *assertion_hashtab[ASSERTION_HASHSIZE]; /* Buffer of -M output. */ char *deps_buffer; /* Number of bytes allocated in above. */ int deps_allocated_size; /* Number of bytes used. */ int deps_size; /* Number of bytes since the last newline. */ int deps_column;};#define CPP_BUF_PEEK(BUFFER) \ ((BUFFER)->cur < (BUFFER)->rlimit ? *(BUFFER)->cur : EOF)#define CPP_BUF_GET(BUFFER) \ ((BUFFER)->cur < (BUFFER)->rlimit ? *(BUFFER)->cur++ : EOF)#define CPP_FORWARD(BUFFER, N) ((BUFFER)->cur += (N))/* Number of characters currently in PFILE's output buffer. */#define CPP_WRITTEN(PFILE) ((PFILE)->limit - (PFILE)->token_buffer)#define CPP_PWRITTEN(PFILE) ((PFILE)->limit)/* Make sure PFILE->token_buffer has space for at least N more characters. */#define CPP_RESERVE(PFILE, N) \ (CPP_WRITTEN (PFILE) + N > (PFILE)->token_buffer_size \ && (cpp_grow_buffer (PFILE, N), 0))/* Append string STR (of length N) to PFILE's output buffer. Assume there is enough space. */#define CPP_PUTS_Q(PFILE, STR, N) \ (bcopy (STR, (PFILE)->limit, (N)), (PFILE)->limit += (N))/* Append string STR (of length N) to PFILE's output buffer. Make space. */#define CPP_PUTS(PFILE, STR, N) CPP_RESERVE(PFILE, N), CPP_PUTS_Q(PFILE, STR,N)/* Append character CH to PFILE's output buffer. Assume sufficient space. */#define CPP_PUTC_Q(PFILE, CH) (*(PFILE)->limit++ = (CH))/* Append character CH to PFILE's output buffer. Make space if need be. */#define CPP_PUTC(PFILE, CH) (CPP_RESERVE (PFILE, 1), CPP_PUTC_Q (PFILE, CH))/* Make sure PFILE->limit is followed by '\0'. */#define CPP_NUL_TERMINATE_Q(PFILE) (*(PFILE)->limit = 0)#define CPP_NUL_TERMINATE(PFILE) (CPP_RESERVE(PFILE, 1), *(PFILE)->limit = 0)#define CPP_ADJUST_WRITTEN(PFILE,DELTA) ((PFILE)->limit += (DELTA))#define CPP_SET_WRITTEN(PFILE,N) ((PFILE)->limit = (PFILE)->token_buffer + (N))#define CPP_OPTIONS(PFILE) ((cpp_options*)(PFILE)->data)#define CPP_BUFFER(PFILE) ((PFILE)->buffer)#ifdef STATIC_BUFFERS#define CPP_PREV_BUFFER(BUFFER) ((BUFFER)+1)#define CPP_NULL_BUFFER(PFILE) (&(PFILE)->buffer_stack[CPP_STACK_MAX])#else#define CPP_PREV_BUFFER(BUFFER) ((BUFFER)->chain)#define CPP_NULL_BUFFER(PFILE) ((cpp_buffer*)0)#endif/* Pointed to by parse_file::data. */struct cpp_options { char *in_fname; /* Name of output file, for error messages. */ char *out_fname; struct file_name_map_list *map_list; /* Non-0 means -v, so print the full set of include dirs. */ char verbose; /* Nonzero means use extra default include directories for C++. */ char cplusplus; /* Nonzero means handle cplusplus style comments */ char cplusplus_comments; /* Nonzero means handle #import, for objective C. */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -