Annotation of gcc/cpplib.h, revision 1.1.1.1

1.1       root        1: /* Definitions for CPP library.
                      2:    Copyright (C) 1995 Free Software Foundation, Inc.
                      3:    Written by Per Bothner, 1994-95.
                      4: 
                      5: This program is free software; you can redistribute it and/or modify it
                      6: under the terms of the GNU General Public License as published by the
                      7: Free Software Foundation; either version 2, or (at your option) any
                      8: later version.
                      9: 
                     10: This program is distributed in the hope that it will be useful,
                     11: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     12: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     13: GNU General Public License for more details.
                     14: 
                     15: You should have received a copy of the GNU General Public License
                     16: along with this program; if not, write to the Free Software
                     17: Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
                     18: 
                     19:  In other words, you are welcome to use, share and improve this program.
                     20:  You are forbidden to forbid anyone else to use, share and improve
                     21:  what you give them.   Help stamp out software-hoarding!  */
                     22: 
                     23: #include <sys/types.h>
                     24: #include <sys/stat.h>
                     25: 
                     26: #ifdef __cplusplus
                     27: extern "C" {
                     28: #endif
                     29: 
                     30: #define STATIC_BUFFERS
                     31: 
                     32: typedef unsigned char U_CHAR;
                     33: 
                     34: struct parse_file;
                     35: typedef struct cpp_reader cpp_reader;
                     36: typedef struct cpp_buffer cpp_buffer;
                     37: typedef struct cpp_options cpp_options;
                     38: typedef struct hashnode cpp_hashnode;
                     39: 
                     40: enum cpp_token {
                     41:   CPP_EOF = -1,
                     42:   CPP_OTHER = 0,
                     43:   CPP_COMMENT = 1,
                     44:   CPP_HSPACE,
                     45:   CPP_VSPACE, /* newlines and #line directives */
                     46:   CPP_NAME,
                     47:   CPP_NUMBER,
                     48:   CPP_CHAR,
                     49:   CPP_STRING,
                     50:   CPP_DIRECTIVE,
                     51:   CPP_LPAREN,   /* "(" */
                     52:   CPP_RPAREN,   /* ")" */
                     53:   CPP_LBRACE,   /* "{" */
                     54:   CPP_RBRACE,   /* "}" */
                     55:   CPP_COMMA,    /* "," */
                     56:   CPP_SEMICOLON,/* ";" */
                     57:   CPP_3DOTS,    /* "..." */
                     58: #if 0
                     59:   CPP_ANDAND, /* "&&" */
                     60:   CPP_OROR,   /* "||" */
                     61:   CPP_LSH,    /* "<<" */
                     62:   CPP_RSH,    /* ">>" */
                     63:   CPP_EQL,    /* "==" */
                     64:   CPP_NEQ,    /* "!=" */
                     65:   CPP_LEQ,    /* "<=" */
                     66:   CPP_GEQ,    /* ">=" */
                     67:   CPP_PLPL,   /* "++" */
                     68:   CPP_MINMIN, /* "--" */
                     69: #endif
                     70:   /* POP_TOKEN is returned when we've popped a cpp_buffer. */
                     71:   CPP_POP
                     72: };
                     73: 
                     74: #ifndef PARAMS
                     75: #ifdef __STDC
                     76: #define PARAMS(P) P
                     77: #else
                     78: #define PARAMS(P) ()
                     79: #endif
                     80: #endif /* !PARAMS */
                     81: 
                     82: typedef enum cpp_token (*parse_underflow_t) PARAMS((cpp_reader*));
                     83: typedef int (*parse_cleanup_t) PARAMS((cpp_buffer *, cpp_reader*));
                     84: 
                     85: /* A parse_marker indicates a previous position,
                     86:    which we can backtrack to. */
                     87: 
                     88: struct parse_marker {
                     89:   cpp_buffer *buf;
                     90:   struct parse_marker *next;
                     91:   int position;
                     92: };
                     93: 
                     94: extern void parse_set_mark PARAMS ((struct parse_marker*, cpp_reader*));
                     95: extern void parse_clear_mark PARAMS ((struct parse_marker*));
                     96: extern void parse_goto_mark PARAMS((struct parse_marker*, cpp_reader*));
                     97: extern void parse_move_mark PARAMS((struct parse_marker*, cpp_reader*));
                     98: 
                     99: extern int cpp_handle_options PARAMS ((cpp_reader*, int, char**));
                    100: extern enum cpp_token cpp_get_token PARAMS ((struct parse_marker*));
                    101: extern void cpp_skip_hspace PARAMS((cpp_reader*));
                    102: extern enum cpp_token cpp_get_non_space_token PARAMS ((cpp_reader *));
                    103: 
                    104: 
                    105: /* Maintain and search list of included files, for #import.  */
                    106: 
                    107: #define IMPORT_HASH_SIZE 31
                    108: 
                    109: struct import_file {
                    110:   char *name;
                    111:   ino_t inode;
                    112:   dev_t dev;
                    113:   struct import_file *next;
                    114: };
                    115: 
                    116: /* If we have a huge buffer, may need to cache more recent counts */
                    117: #define CPP_LINE_BASE(BUF) ((BUF)->buf + (BUF)->line_base)
                    118: 
                    119: struct cpp_buffer {
                    120:   unsigned char *buf;
                    121:   unsigned char *cur;
                    122:   unsigned char *rlimit; /* end of valid data */
                    123:   unsigned char *alimit; /* end of allocated buffer */
                    124:   unsigned char *prev;  /* start of current token */
                    125: 
                    126:   char *fname;
                    127:   /* Filename specified with #line command.  */
                    128:   char *nominal_fname;
                    129: 
                    130:   /* Record where in the search path this file was found.
                    131:      For #include_next.  */
                    132:   struct file_name_list *dir;
                    133: 
                    134:   long line_base;
                    135:   long lineno; /* Line number at CPP_LINE_BASE. */
                    136:   long colno; /* Column number at CPP_LINE_BASE. */
                    137: #ifndef STATIC_BUFFERS
                    138:   cpp_buffer *chain;
                    139: #endif
                    140:   parse_underflow_t underflow;
                    141:   parse_cleanup_t cleanup;
                    142:   void *data;
                    143:   struct parse_marker *marks;
                    144:   /* Value of if_stack at start of this file.
                    145:      Used to prohibit unmatched #endif (etc) in an include file.  */
                    146:   struct if_stack *if_stack;
                    147: 
                    148:   /* True if this is a header file included using <FILENAME>.  */
                    149:   char system_header_p;
                    150:   char seen_eof;
                    151: 
                    152:   /* True if buffer contains escape sequences.
                    153:      Currently there are are only two kind:
                    154:      "@-" means following identifier should not be macro-expanded.
                    155:      "@ " means a token-separator.  This turns into " " in final output
                    156:           if not stringizing and needed to separate tokens; otherwise nothing.
                    157:      "@@" means a normal '@'.
                    158:      (An '@' inside a string stands for itself and is never an escape.) */
                    159:   char has_escapes;
                    160: };
                    161: 
                    162: struct cpp_pending;  /* Forward declaration - for C++. */
                    163: struct file_name_map_list;
                    164: 
                    165: typedef struct assertion_hashnode ASSERTION_HASHNODE;
                    166: #define ASSERTION_HASHSIZE 37
                    167: 
                    168: #ifdef STATIC_BUFFERS
                    169: /* Maximum nesting of cpp_buffers.  We use a static limit, partly for
                    170:    efficiency, and partly to limit runaway recursion.  */
                    171: #define CPP_STACK_MAX 200
                    172: #endif
                    173: 
                    174: struct cpp_reader {
                    175:   unsigned char *limit;
                    176:   parse_underflow_t get_token;
                    177:   cpp_buffer *buffer;
                    178: #ifdef STATIC_BUFFERS
                    179:   cpp_buffer buffer_stack[CPP_STACK_MAX];
                    180: #endif
                    181: 
                    182:   int errors;                  /* Error counter for exit code */
                    183:   void *data;
                    184: 
                    185:   U_CHAR *token_buffer;
                    186:   int token_buffer_size;
                    187: 
                    188:   /* Line where a newline was first seen in a string constant.  */
                    189:   int multiline_string_line;
                    190: 
                    191:   /* Current depth in #include directives that use <...>.  */
                    192:   int system_include_depth;
                    193: 
                    194:   /* List of included files that contained #pragma once.  */
                    195:   struct file_name_list *dont_repeat_files;
                    196: 
                    197:   /* List of other included files.
                    198:      If ->control_macro if nonzero, the file had a #ifndef
                    199:      around the entire contents, and ->control_macro gives the macro name.  */
                    200:   struct file_name_list *all_include_files;
                    201: 
                    202:   /* Current maximum length of directory names in the search path
                    203:      for include files.  (Altered as we get more of them.)  */
                    204:   int max_include_len;
                    205: 
                    206:   /* Hash table of files already included with #include or #import.  */
                    207:   struct import_file *import_hash_table[IMPORT_HASH_SIZE];
                    208: 
                    209:   struct if_stack *if_stack;
                    210: 
                    211:   /* Nonzero means we are inside an IF during a -pcp run.  In this mode
                    212:      macro expansion is done, and preconditions are output for all macro
                    213:      uses requiring them. */
                    214:   char pcp_inside_if;
                    215: 
                    216:   /* Nonzero means we have printed (while error reporting) a list of
                    217:      containing files that matches the current status. */
                    218:   char input_stack_listing_current;
                    219: 
                    220:   /* If non-zero, macros are not expanded. */
                    221:   char no_macro_expand;
                    222: 
                    223:   /* Print column number in error messages. */
                    224:   char show_column;
                    225: 
                    226:   /* We're printed a warning recommending against using #import. */
                    227:   char import_warning;
                    228: 
                    229:   /* If true, character between '<' and '>' are a single (string) token. */
                    230:   char parsing_include_directive;
                    231: 
                    232:   /* True if escape sequences (as described for has_escapes in
                    233:      parse_buffer) should be emitted. */
                    234:   char output_escapes;
                    235: 
                    236:   /* 0: Have seen non-white-space on this line.
                    237:      1: Only seen white space so far on this line.
                    238:      2: Only seen white space so far in this file. */
                    239:    char only_seen_white;
                    240: 
                    241:   /* Nonzero means this file was included with a -imacros or -include
                    242:      command line and should not be recorded as an include file.  */
                    243: 
                    244:   int no_record_file;
                    245: 
                    246:   long lineno;
                    247: 
                    248:   struct tm *timebuf;
                    249: 
                    250:   ASSERTION_HASHNODE *assertion_hashtab[ASSERTION_HASHSIZE];
                    251: 
                    252:   /* Buffer of -M output.  */
                    253:   char *deps_buffer;
                    254: 
                    255:   /* Number of bytes allocated in above.  */
                    256:   int deps_allocated_size;
                    257: 
                    258:   /* Number of bytes used.  */
                    259:   int deps_size;
                    260: 
                    261:   /* Number of bytes since the last newline.  */
                    262:   int deps_column;
                    263: };
                    264: 
                    265: #define CPP_BUF_PEEK(BUFFER) \
                    266:   ((BUFFER)->cur < (BUFFER)->rlimit ? *(BUFFER)->cur : EOF)
                    267: #define CPP_BUF_GET(BUFFER) \
                    268:   ((BUFFER)->cur < (BUFFER)->rlimit ? *(BUFFER)->cur++ : EOF)
                    269: #define CPP_FORWARD(BUFFER, N) ((BUFFER)->cur += (N))
                    270: 
                    271: /* Number of characters currently in PFILE's output buffer. */
                    272: #define CPP_WRITTEN(PFILE) ((PFILE)->limit - (PFILE)->token_buffer)
                    273: #define CPP_PWRITTEN(PFILE) ((PFILE)->limit)
                    274: 
                    275: /* Make sure PFILE->token_buffer has space for at least N more characters. */
                    276: #define CPP_RESERVE(PFILE, N) \
                    277:   (CPP_WRITTEN (PFILE) + N > (PFILE)->token_buffer_size \
                    278:    && (cpp_grow_buffer (PFILE, N), 0))
                    279: 
                    280: /* Append string STR (of length N) to PFILE's output buffer.
                    281:    Assume there is enough space. */
                    282: #define CPP_PUTS_Q(PFILE, STR, N) \
                    283:   (bcopy (STR, (PFILE)->limit, (N)), (PFILE)->limit += (N))
                    284: /* Append string STR (of length N) to PFILE's output buffer.  Make space. */
                    285: #define CPP_PUTS(PFILE, STR, N) CPP_RESERVE(PFILE, N), CPP_PUTS_Q(PFILE, STR,N)
                    286: /* Append character CH to PFILE's output buffer.  Assume sufficient space. */
                    287: #define CPP_PUTC_Q(PFILE, CH) (*(PFILE)->limit++ = (CH))
                    288: /* Append character CH to PFILE's output buffer.  Make space if need be. */
                    289: #define CPP_PUTC(PFILE, CH) (CPP_RESERVE (PFILE, 1), CPP_PUTC_Q (PFILE, CH))
                    290: /* Make sure PFILE->limit is followed by '\0'. */
                    291: #define CPP_NUL_TERMINATE_Q(PFILE) (*(PFILE)->limit = 0)
                    292: #define CPP_NUL_TERMINATE(PFILE) (CPP_RESERVE(PFILE, 1), *(PFILE)->limit = 0)
                    293: #define CPP_ADJUST_WRITTEN(PFILE,DELTA) ((PFILE)->limit += (DELTA))
                    294: #define CPP_SET_WRITTEN(PFILE,N) ((PFILE)->limit = (PFILE)->token_buffer + (N))
                    295: 
                    296: #define CPP_OPTIONS(PFILE) ((cpp_options*)(PFILE)->data)
                    297: #define CPP_BUFFER(PFILE) ((PFILE)->buffer)
                    298: #ifdef STATIC_BUFFERS
                    299: #define CPP_PREV_BUFFER(BUFFER) ((BUFFER)+1)
                    300: #define CPP_NULL_BUFFER(PFILE) (&(PFILE)->buffer_stack[CPP_STACK_MAX])
                    301: #else
                    302: #define CPP_PREV_BUFFER(BUFFER) ((BUFFER)->chain)
                    303: #define CPP_NULL_BUFFER(PFILE) ((cpp_buffer*)0)
                    304: #endif
                    305: 
                    306: /* Pointed to by parse_file::data. */
                    307: struct cpp_options {
                    308:   char *in_fname;
                    309: 
                    310:   /* Name of output file, for error messages.  */
                    311:   char *out_fname;
                    312: 
                    313:   struct file_name_map_list *map_list;
                    314: 
                    315:   /* Non-0 means -v, so print the full set of include dirs.  */
                    316:   char verbose;
                    317: 
                    318:   /* Nonzero means use extra default include directories for C++.  */
                    319: 
                    320:   char cplusplus;
                    321: 
                    322:   /* Nonzero means handle cplusplus style comments */
                    323: 
                    324:   char cplusplus_comments;
                    325: 
                    326:   /* Nonzero means handle #import, for objective C.  */
                    327: 
                    328:   char objc;
                    329: 
                    330:   /* Nonzero means this is an assembly file, and allow
                    331:      unknown directives, which could be comments.  */
                    332: 
                    333:   int lang_asm;
                    334: 
                    335:   /* Nonzero means turn NOTREACHED into #pragma NOTREACHED etc */
                    336: 
                    337:   char for_lint;
                    338: 
                    339:   /* Nonzero means handle CHILL comment syntax
                    340:      and output CHILL string delimiter for __DATE___ etc. */
                    341: 
                    342:   char chill;
                    343: 
                    344:   /* Nonzero means copy comments into the output file.  */
                    345: 
                    346:   char put_out_comments;
                    347: 
                    348:   /* Nonzero means don't process the ANSI trigraph sequences.  */
                    349: 
                    350:   char no_trigraphs;
                    351: 
                    352:   /* Nonzero means print the names of included files rather than
                    353:      the preprocessed output.  1 means just the #include "...",
                    354:      2 means #include <...> as well.  */
                    355: 
                    356:   char print_deps;
                    357: 
                    358:   /* Nonzero if missing .h files in -M output are assumed to be generated
                    359:      files and not errors.  */
                    360: 
                    361:   char print_deps_missing_files;
                    362: 
                    363:   /* If true, fopen (deps_file, "a") else fopen (deps_file, "w"). */
                    364:   char print_deps_append;
                    365: 
                    366:   /* Nonzero means print names of header files (-H).  */
                    367: 
                    368:   char print_include_names;
                    369: 
                    370:   /* Nonzero means try to make failure to fit ANSI C an error.  */
                    371: 
                    372:   char pedantic_errors;
                    373: 
                    374:   /* Nonzero means don't print warning messages.  -w.  */
                    375: 
                    376:   char inhibit_warnings;
                    377: 
                    378:   /* Nonzero means warn if slash-star appears in a comment.  */
                    379: 
                    380:   char warn_comments;
                    381: 
                    382:   /* Nonzero means warn if there are any trigraphs.  */
                    383: 
                    384:   char warn_trigraphs;
                    385: 
                    386:   /* Nonzero means warn if #import is used.  */
                    387: 
                    388:   char warn_import;
                    389: 
                    390:   /* Nonzero means warn if a macro argument is (or would be)
                    391:      stringified with -traditional.  */
                    392: 
                    393:   char warn_stringify;
                    394: 
                    395:   /* Nonzero means turn warnings into errors.  */
                    396: 
                    397:   char warnings_are_errors;
                    398: 
                    399:   /* Nonzero causes output not to be done,
                    400:      but directives such as #define that have side effects
                    401:      are still obeyed.  */
                    402: 
                    403:   char no_output;
                    404: 
                    405:   /* Nonzero means don't output line number information.  */
                    406: 
                    407:   char no_line_commands;
                    408: 
                    409: /* Nonzero means output the text in failing conditionals,
                    410:    inside #failed ... #endfailed.  */
                    411: 
                    412:   char output_conditionals;
                    413: 
                    414:   /* Nonzero means -I- has been seen,
                    415:      so don't look for #include "foo" the source-file directory.  */
                    416:   char ignore_srcdir;
                    417: 
                    418: /* Zero means dollar signs are punctuation.
                    419:    -$ stores 0; -traditional may store 1.  Default is 1 for VMS, 0 otherwise.
                    420:    This must be 0 for correct processing of this ANSI C program:
                    421:        #define foo(a) #a
                    422:        #define lose(b) foo (b)
                    423:        #define test$
                    424:        lose (test)     */
                    425:   char dollars_in_ident;
                    426: #ifndef DOLLARS_IN_IDENTIFIERS
                    427: #define DOLLARS_IN_IDENTIFIERS 1
                    428: #endif
                    429: 
                    430:   /* Nonzero means try to imitate old fashioned non-ANSI preprocessor.  */
                    431:   char traditional;
                    432: 
                    433:   /* Nonzero means give all the error messages the ANSI standard requires.  */
                    434:   char pedantic;
                    435: 
                    436:   char done_initializing;
                    437: 
                    438:   struct file_name_list *include;      /* First dir to search */
                    439:   /* First dir to search for <file> */
                    440:   /* This is the first element to use for #include <...>.
                    441:      If it is 0, use the entire chain for such includes.  */
                    442:   struct file_name_list *first_bracket_include;
                    443:   /* This is the first element in the chain that corresponds to
                    444:      a directory of system header files.  */
                    445:   struct file_name_list *first_system_include;
                    446:   struct file_name_list *last_include; /* Last in chain */
                    447: 
                    448:   /* Chain of include directories to put at the end of the other chain.  */
                    449:   struct file_name_list *after_include;
                    450:   struct file_name_list *last_after_include;   /* Last in chain */
                    451: 
                    452:   /* Chain to put at the start of the system include files.  */
                    453:   struct file_name_list *before_system;
                    454:   struct file_name_list *last_before_system;   /* Last in chain */
                    455: 
                    456:   /* Directory prefix that should replace `/usr' in the standard
                    457:      include file directories.  */
                    458:   char *include_prefix;
                    459: 
                    460:   char inhibit_predefs;
                    461:   char no_standard_includes;
                    462:   char no_standard_cplusplus_includes;
                    463: 
                    464: /* dump_only means inhibit output of the preprocessed text
                    465:              and instead output the definitions of all user-defined
                    466:              macros in a form suitable for use as input to cccp.
                    467:    dump_names means pass #define and the macro name through to output.
                    468:    dump_definitions means pass the whole definition (plus #define) through
                    469: */
                    470: 
                    471:   enum {dump_none = 0, dump_only, dump_names, dump_definitions}
                    472:      dump_macros;
                    473: 
                    474: /* Nonzero means pass all #define and #undef directives which we actually
                    475:    process through to the output stream.  This feature is used primarily
                    476:    to allow cc1 to record the #defines and #undefs for the sake of
                    477:    debuggers which understand about preprocessor macros, but it may
                    478:    also be useful with -E to figure out how symbols are defined, and
                    479:    where they are defined.  */
                    480:   int debug_output;
                    481: 
                    482:   /* Pending -D, -U and -A options, in reverse order. */
                    483:   struct cpp_pending *pending;
                    484: 
                    485:   /* File name which deps are being written to.
                    486:      This is 0 if deps are being written to stdout.  */
                    487:   char *deps_file;
                    488: 
                    489:   /* Target-name to write with the dependency information.  */
                    490:   char *deps_target;
                    491: };
                    492: 
                    493: #define CPP_TRADITIONAL(PFILE) (CPP_OPTIONS(PFILE)-> traditional)
                    494: #define CPP_PEDANTIC(PFILE) (CPP_OPTIONS (PFILE)->pedantic)
                    495: #define CPP_PRINT_DEPS(PFILE) (CPP_OPTIONS (PFILE)->print_deps)
                    496: 
                    497: /* Name under which this program was invoked.  */
                    498: 
                    499: extern char *progname;
                    500: 
                    501: /* The structure of a node in the hash table.  The hash table
                    502:    has entries for all tokens defined by #define commands (type T_MACRO),
                    503:    plus some special tokens like __LINE__ (these each have their own
                    504:    type, and the appropriate code is run when that type of node is seen.
                    505:    It does not contain control words like "#define", which are recognized
                    506:    by a separate piece of code. */
                    507: 
                    508: /* different flavors of hash nodes --- also used in keyword table */
                    509: enum node_type {
                    510:  T_DEFINE = 1, /* the `#define' keyword */
                    511:  T_INCLUDE,    /* the `#include' keyword */
                    512:  T_INCLUDE_NEXT, /* the `#include_next' keyword */
                    513:  T_IMPORT,      /* the `#import' keyword */
                    514:  T_IFDEF,      /* the `#ifdef' keyword */
                    515:  T_IFNDEF,     /* the `#ifndef' keyword */
                    516:  T_IF,         /* the `#if' keyword */
                    517:  T_ELSE,       /* `#else' */
                    518:  T_PRAGMA,     /* `#pragma' */
                    519:  T_ELIF,       /* `#elif' */
                    520:  T_UNDEF,      /* `#undef' */
                    521:  T_LINE,       /* `#line' */
                    522:  T_ERROR,      /* `#error' */
                    523:  T_WARNING,    /* `#warning' */
                    524:  T_ENDIF,      /* `#endif' */
                    525:  T_SCCS,       /* `#sccs', used on system V.  */
                    526:  T_IDENT,      /* `#ident', used on system V.  */
                    527:  T_ASSERT,     /* `#assert', taken from system V.  */
                    528:  T_UNASSERT,   /* `#unassert', taken from system V.  */
                    529:  T_SPECLINE,   /* special symbol `__LINE__' */
                    530:  T_DATE,       /* `__DATE__' */
                    531:  T_FILE,       /* `__FILE__' */
                    532:  T_BASE_FILE,  /* `__BASE_FILE__' */
                    533:  T_INCLUDE_LEVEL, /* `__INCLUDE_LEVEL__' */
                    534:  T_VERSION,    /* `__VERSION__' */
                    535:  T_SIZE_TYPE,   /* `__SIZE_TYPE__' */
                    536:  T_PTRDIFF_TYPE,   /* `__PTRDIFF_TYPE__' */
                    537:  T_WCHAR_TYPE,   /* `__WCHAR_TYPE__' */
                    538:  T_USER_LABEL_PREFIX_TYPE, /* `__USER_LABEL_PREFIX__' */
                    539:  T_REGISTER_PREFIX_TYPE,   /* `__REGISTER_PREFIX__' */
                    540:  T_TIME,       /* `__TIME__' */
                    541:  T_CONST,      /* Constant value, used by `__STDC__' */
                    542:  T_MACRO,      /* macro defined by `#define' */
                    543:  T_DISABLED,   /* macro temporarily turned off for rescan */
                    544:  T_SPEC_DEFINED, /* special `defined' macro for use in #if statements */
                    545:  T_PCSTRING,   /* precompiled string (hashval is KEYDEF *) */
                    546:  T_UNUSED      /* Used for something not defined.  */
                    547:  };
                    548: 
                    549: /* Structure returned by create_definition */
                    550: typedef struct macrodef MACRODEF;
                    551: struct macrodef
                    552: {
                    553:   struct definition *defn;
                    554:   U_CHAR *symnam;
                    555:   int symlen;
                    556: };
                    557: 
                    558: /* Structure allocated for every #define.  For a simple replacement
                    559:    such as
                    560:        #define foo bar ,
                    561:    nargs = -1, the `pattern' list is null, and the expansion is just
                    562:    the replacement text.  Nargs = 0 means a functionlike macro with no args,
                    563:    e.g.,
                    564:        #define getchar() getc (stdin) .
                    565:    When there are args, the expansion is the replacement text with the
                    566:    args squashed out, and the reflist is a list describing how to
                    567:    build the output from the input: e.g., "3 chars, then the 1st arg,
                    568:    then 9 chars, then the 3rd arg, then 0 chars, then the 2nd arg".
                    569:    The chars here come from the expansion.  Whatever is left of the
                    570:    expansion after the last arg-occurrence is copied after that arg.
                    571:    Note that the reflist can be arbitrarily long---
                    572:    its length depends on the number of times the arguments appear in
                    573:    the replacement text, not how many args there are.  Example:
                    574:    #define f(x) x+x+x+x+x+x+x would have replacement text "++++++" and
                    575:    pattern list
                    576:      { (0, 1), (1, 1), (1, 1), ..., (1, 1), NULL }
                    577:    where (x, y) means (nchars, argno). */
                    578: 
                    579: typedef struct definition DEFINITION;
                    580: struct definition {
                    581:   int nargs;
                    582:   int length;                  /* length of expansion string */
                    583:   int predefined;              /* True if the macro was builtin or */
                    584:                                /* came from the command line */
                    585:   U_CHAR *expansion;
                    586:   int line;                    /* Line number of definition */
                    587:   char *file;                  /* File of definition */
                    588:   char rest_args;              /* Nonzero if last arg. absorbs the rest */
                    589:   struct reflist {
                    590:     struct reflist *next;
                    591:     char stringify;            /* nonzero if this arg was preceded by a
                    592:                                   # operator. */
                    593:     char raw_before;           /* Nonzero if a ## operator before arg. */
                    594:     char raw_after;            /* Nonzero if a ## operator after arg. */
                    595:     char rest_args;            /* Nonzero if this arg. absorbs the rest */
                    596:     int nchars;                        /* Number of literal chars to copy before
                    597:                                   this arg occurrence.  */
                    598:     int argno;                 /* Number of arg to substitute (origin-0) */
                    599:   } *pattern;
                    600:   union {
                    601:     /* Names of macro args, concatenated in reverse order
                    602:        with comma-space between them.
                    603:        The only use of this is that we warn on redefinition
                    604:        if this differs between the old and new definitions.  */
                    605:     U_CHAR *argnames;
                    606:   } args;
                    607: };
                    608: 
                    609: extern U_CHAR is_idchar[256];
                    610: 
                    611: /* Stack of conditionals currently in progress
                    612:    (including both successful and failing conditionals).  */
                    613: 
                    614: struct if_stack {
                    615:   struct if_stack *next;       /* for chaining to the next stack frame */
                    616:   char *fname;         /* copied from input when frame is made */
                    617:   int lineno;                  /* similarly */
                    618:   int if_succeeded;            /* true if a leg of this if-group
                    619:                                    has been passed through rescan */
                    620:   U_CHAR *control_macro;       /* For #ifndef at start of file,
                    621:                                   this is the macro name tested.  */
                    622:   enum node_type type;         /* type of last directive seen in this group */
                    623: };
                    624: typedef struct if_stack IF_STACK_FRAME;
                    625: 
                    626: extern void cpp_buf_line_and_col PARAMS((cpp_buffer*, long*, long*));
                    627: extern cpp_buffer* cpp_file_buffer PARAMS((cpp_reader*));
                    628: extern void cpp_define PARAMS ((cpp_reader*, U_CHAR*));
                    629: 
                    630: extern void cpp_error ();
                    631: extern void cpp_warning ();
                    632: extern void cpp_pedwarn ();
                    633: extern void cpp_error_with_line ();
                    634: extern void cpp_pedwarn_with_line ();
                    635: extern void cpp_pedwarn_with_file_and_line ();
                    636: extern void fatal ();
                    637: extern void cpp_error_from_errno ();
                    638: extern void cpp_perror_with_name ();
                    639: extern void cpp_pfatal_with_name ();
                    640: 
                    641: extern void cpp_grow_buffer PARAMS ((cpp_reader*, long));
                    642: extern int cpp_parse_escape PARAMS ((cpp_reader*, char**));
                    643: extern cpp_buffer* cpp_push_buffer PARAMS ((cpp_reader *, U_CHAR*, long));
                    644: extern cpp_buffer* cpp_pop_buffer PARAMS ((cpp_reader *));
                    645: 
                    646: extern cpp_hashnode* cpp_lookup PARAMS ((cpp_reader*, const U_CHAR*,
                    647:                                         int, int));
                    648: 
                    649: #ifdef __cplusplus
                    650: }
                    651: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.