1 /* Part of CPP library.
2 Copyright (C) 1997-2025 Free Software Foundation, Inc.
4 This program is free software; you can redistribute it and/or modify it
5 under the terms of the GNU General Public License as published by the
6 Free Software Foundation; either version 3, or (at your option) any
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; see the file COPYING3. If not see
16 <http://www.gnu.org/licenses/>. */
18 /* This header defines all the internal data structures and functions
19 that need to be visible across files. It should not be used outside
22 #ifndef LIBCPP_INTERNAL_H
23 #define LIBCPP_INTERNAL_H
27 #include "rich-location.h"
33 typedef int iconv_t
; /* dummy */
40 struct directive
; /* Deliberately incomplete. */
41 struct pending_option
;
45 typedef bool (*convert_f
) (iconv_t
, const unsigned char *, size_t,
46 struct _cpp_strbuf
*);
56 #define BITS_PER_CPPCHAR_T (CHAR_BIT * sizeof (cppchar_t))
58 /* Test if a sign is valid within a preprocessing number. */
59 #define VALID_SIGN(c, prevc) \
60 (((c) == '+' || (c) == '-') && \
61 ((prevc) == 'e' || (prevc) == 'E' \
62 || (((prevc) == 'p' || (prevc) == 'P') \
63 && CPP_OPTION (pfile, extended_numbers))))
65 #define DIGIT_SEP(c) ((c) == '\'' && CPP_OPTION (pfile, digit_separators))
67 #define CPP_OPTION(PFILE, OPTION) ((PFILE)->opts.OPTION)
68 #define CPP_BUFFER(PFILE) ((PFILE)->buffer)
69 #define CPP_BUF_COLUMN(BUF, CUR) ((CUR) - (BUF)->line_base)
70 #define CPP_BUF_COL(BUF) CPP_BUF_COLUMN(BUF, (BUF)->cur)
72 #define CPP_INCREMENT_LINE(PFILE, COLS_HINT) do { \
73 const class line_maps *line_table = PFILE->line_table; \
74 const struct line_map_ordinary *map = \
75 LINEMAPS_LAST_ORDINARY_MAP (line_table); \
76 linenum_type line = SOURCE_LINE (map, line_table->highest_line); \
77 linemap_line_start (PFILE->line_table, line + 1, COLS_HINT); \
80 /* Host alignment handling. */
92 #define DEFAULT_ALIGNMENT offsetof (struct dummy, u)
93 #define CPP_ALIGN2(size, align) (((size) + ((align) - 1)) & ~((align) - 1))
94 #define CPP_ALIGN(size) CPP_ALIGN2 (size, DEFAULT_ALIGNMENT)
96 #define _cpp_mark_macro_used(NODE) \
97 (cpp_user_macro_p (NODE) ? (NODE)->value.macro->used = 1 : 0)
99 /* A generic memory buffer, and operations on it. */
100 typedef struct _cpp_buff _cpp_buff
;
103 struct _cpp_buff
*next
;
104 unsigned char *base
, *cur
, *limit
;
107 extern _cpp_buff
*_cpp_get_buff (cpp_reader
*, size_t);
108 extern void _cpp_release_buff (cpp_reader
*, _cpp_buff
*);
109 extern void _cpp_extend_buff (cpp_reader
*, _cpp_buff
**, size_t);
110 extern _cpp_buff
*_cpp_append_extend_buff (cpp_reader
*, _cpp_buff
*, size_t);
111 extern void _cpp_free_buff (_cpp_buff
*);
112 extern unsigned char *_cpp_aligned_alloc (cpp_reader
*, size_t);
113 extern unsigned char *_cpp_unaligned_alloc (cpp_reader
*, size_t);
115 #define BUFF_ROOM(BUFF) (size_t) ((BUFF)->limit - (BUFF)->cur)
116 #define BUFF_FRONT(BUFF) ((BUFF)->cur)
117 #define BUFF_LIMIT(BUFF) ((BUFF)->limit)
119 /* #include types. */
122 /* Directive-based including mechanisms. */
123 IT_INCLUDE
, /* #include */
124 IT_INCLUDE_NEXT
, /* #include_next */
125 IT_IMPORT
, /* #import */
126 IT_EMBED
, /* #embed */
128 /* Non-directive including mechanisms. */
129 IT_CMDLINE
, /* -include */
130 IT_DEFAULT
, /* forced header */
131 IT_MAIN
, /* main, start on line 1 */
132 IT_PRE_MAIN
, /* main, but there will be a preamble before line
135 IT_DIRECTIVE_HWM
= IT_IMPORT
+ 1, /* Directives below this. */
136 IT_HEADER_HWM
= IT_DEFAULT
+ 1 /* Header files below this. */
141 const cpp_token
*token
;
142 const cpp_token
**ptoken
;
145 /* A "run" of tokens; part of a chain of runs. */
146 typedef struct tokenrun tokenrun
;
149 tokenrun
*next
, *prev
;
150 cpp_token
*base
, *limit
;
153 /* Accessor macros for struct cpp_context. */
154 #define FIRST(c) ((c)->u.iso.first)
155 #define LAST(c) ((c)->u.iso.last)
156 #define CUR(c) ((c)->u.trad.cur)
157 #define RLIMIT(c) ((c)->u.trad.rlimit)
159 /* This describes some additional data that is added to the macro
160 token context of type cpp_context, when -ftrack-macro-expansion is
164 /* The node of the macro we are referring to. */
165 cpp_hashnode
*macro_node
;
166 /* This buffer contains an array of virtual locations. The virtual
167 location at index 0 is the virtual location of the token at index
168 0 in the current instance of cpp_context; similarly for all the
169 other virtual locations. */
170 location_t
*virt_locs
;
171 /* This is a pointer to the current virtual location. This is used
172 to iterate over the virtual locations while we iterate over the
173 tokens they belong to. */
174 location_t
*cur_virt_loc
;
177 /* The kind of tokens carried by a cpp_context. */
178 enum context_tokens_kind
{
179 /* This is the value of cpp_context::tokens_kind if u.iso.first
180 contains an instance of cpp_token **. */
181 TOKENS_KIND_INDIRECT
,
182 /* This is the value of cpp_context::tokens_kind if u.iso.first
183 contains an instance of cpp_token *. */
185 /* This is the value of cpp_context::tokens_kind when the token
186 context contains tokens resulting from macro expansion. In that
187 case struct cpp_context::macro points to an instance of struct
188 macro_context. This is used only when the
189 -ftrack-macro-expansion flag is on. */
193 typedef struct cpp_context cpp_context
;
196 /* Doubly-linked list. */
197 cpp_context
*next
, *prev
;
201 /* For ISO macro expansion. Contexts other than the base context
202 are contiguous tokens. e.g. macro expansions, expanded
210 /* For traditional macro expansion. */
213 const unsigned char *cur
;
214 const unsigned char *rlimit
;
218 /* If non-NULL, a buffer used for storage related to this context.
219 When the context is popped, the buffer is released. */
222 /* If tokens_kind is TOKEN_KIND_EXTENDED, then (as we thus are in a
223 macro context) this is a pointer to an instance of macro_context.
224 Otherwise if tokens_kind is *not* TOKEN_KIND_EXTENDED, then, if
225 we are in a macro context, this is a pointer to an instance of
226 cpp_hashnode, representing the name of the macro this context is
227 for. If we are not in a macro context, then this is just NULL.
228 Note that when tokens_kind is TOKEN_KIND_EXTENDED, the memory
229 used by the instance of macro_context pointed to by this member
230 is de-allocated upon de-allocation of the instance of struct
238 /* This determines the type of tokens held by this context. */
239 enum context_tokens_kind tokens_kind
;
244 /* 1 if we're handling a directive. 2 if it's an include-like
246 unsigned char in_directive
;
248 /* Nonzero if in a directive that will handle padding tokens itself.
249 #include needs this to avoid problems with computed include and
250 spacing between tokens. */
251 unsigned char directive_wants_padding
;
253 /* True if we are skipping a failed conditional group. */
254 unsigned char skipping
;
256 /* Nonzero if in a directive that takes angle-bracketed headers. */
257 unsigned char angled_headers
;
259 /* Nonzero if in a #if or #elif directive. */
260 unsigned char in_expression
;
262 /* Nonzero to save comments. Turned off if discard_comments, and in
263 all directives apart from #define. */
264 unsigned char save_comments
;
266 /* Nonzero if lexing __VA_ARGS__ and __VA_OPT__ are valid. */
267 unsigned char va_args_ok
;
269 /* Nonzero if lexing poisoned identifiers is valid. */
270 unsigned char poisoned_ok
;
272 /* Nonzero to prevent macro expansion. */
273 unsigned char prevent_expansion
;
275 /* Nonzero when parsing arguments to a function-like macro. */
276 unsigned char parsing_args
;
278 /* Nonzero if prevent_expansion is true only because output is
280 unsigned char discarding_output
;
282 /* Nonzero to skip evaluating part of an expression. */
283 unsigned int skip_eval
;
285 /* Nonzero when tokenizing a deferred pragma. */
286 unsigned char in_deferred_pragma
;
288 /* Count to token that is a header-name. */
289 unsigned char directive_file_token
;
291 /* Nonzero if the deferred pragma being handled allows macro expansion. */
292 unsigned char pragma_allow_expansion
;
294 /* Nonzero if _Pragma should not be interpreted. */
295 unsigned char ignore__Pragma
;
298 /* Special nodes - identifiers with predefined significance. */
301 cpp_hashnode
*n_defined
; /* defined operator */
302 cpp_hashnode
*n_true
; /* C++ keyword true */
303 cpp_hashnode
*n_false
; /* C++ keyword false */
304 cpp_hashnode
*n__VA_ARGS__
; /* C99 vararg macros */
305 cpp_hashnode
*n__VA_OPT__
; /* C++ vararg macros */
307 enum {M_EXPORT
, M_MODULE
, M_IMPORT
, M__IMPORT
, M_HWM
};
309 /* C++20 modules, only set when module_directives is in effect.
310 incoming variants [0], outgoing ones [1] */
311 cpp_hashnode
*n_modules
[M_HWM
][2];
314 typedef struct _cpp_line_note _cpp_line_note
;
315 struct _cpp_line_note
317 /* Location in the clean line the note refers to. */
318 const unsigned char *pos
;
320 /* Type of note. The 9 'from' trigraph characters represent those
321 trigraphs, '\\' an escaped newline, ' ' an escaped newline with
322 intervening space, 'W' trailing whitespace, 'L', 'S' and 'T' for
323 leading whitespace issues, 0 represents a note that
324 has already been handled, and anything else is invalid. */
328 /* Tail padding required by search_line_fast alternatives. */
330 #define CPP_BUFFER_PADDING 64
332 #define CPP_BUFFER_PADDING 16
335 /* Represents the contents of a file cpplib has read in. */
338 const unsigned char *cur
; /* Current location. */
339 const unsigned char *line_base
; /* Start of current physical line. */
340 const unsigned char *next_line
; /* Start of to-be-cleaned logical line. */
342 const unsigned char *buf
; /* Entire character buffer. */
343 const unsigned char *rlimit
; /* Writable byte at end of file. */
344 const unsigned char *to_free
; /* Pointer that should be freed when
345 popping the buffer. */
347 _cpp_line_note
*notes
; /* Array of notes. */
348 unsigned int cur_note
; /* Next note to process. */
349 unsigned int notes_used
; /* Number of notes. */
350 unsigned int notes_cap
; /* Size of allocated array. */
352 struct cpp_buffer
*prev
;
354 /* Pointer into the file table; non-NULL if this is a file buffer.
355 Used for include_next and to record control macros. */
356 struct _cpp_file
*file
;
358 /* Saved value of __TIMESTAMP__ macro - date and time of last modification
359 of the assotiated file. */
360 const unsigned char *timestamp
;
362 /* Value of if_stack at start of this file.
363 Used to prohibit unmatched #endif (etc) in an include file. */
364 struct if_stack
*if_stack
;
366 /* True if we need to get the next clean line. */
369 /* True if we have already warned about C++ comments in this file.
370 The warning happens only for C89 extended mode with -pedantic on,
371 or for -Wtraditional, and only once per file (otherwise it would
372 be far too noisy). */
373 bool warned_cplusplus_comments
: 1;
375 /* True if we don't process trigraphs and escaped newlines. True
376 for preprocessed input, command line directives, and _Pragma
378 bool from_stage3
: 1;
380 /* At EOF, a buffer is automatically popped. If RETURN_AT_EOF is
381 true, a CPP_EOF token is then returned. Otherwise, the next
382 token from the enclosing buffer is returned. */
383 bool return_at_eof
: 1;
385 /* One for a system header, two for a C system header file that therefore
386 needs to be extern "C" protected in C++, and zero otherwise. */
389 /* The directory of the this buffer's file. Its NAME member is not
390 allocated, so we don't need to worry about freeing it. */
393 /* Descriptor for converting from the input character set to the
394 source character set. */
395 struct cset_converter input_cset_desc
;
398 /* The list of saved macros by push_macro pragma. */
399 struct def_pragma_macro
{
400 /* Chain element to previous saved macro. */
401 struct def_pragma_macro
*next
;
402 /* Name of the macro. */
404 /* The stored macro content. */
405 unsigned char *definition
;
407 /* Definition line number. */
409 /* If macro defined in system header. */
410 unsigned int syshdr
: 1;
411 /* Nonzero if it has been expanded or had its existence tested. */
412 unsigned int used
: 1;
414 /* Mark if we save an undefined macro. */
415 unsigned int is_undef
: 1;
416 /* Nonzero if it was a builtin macro. */
417 unsigned int is_builtin
: 1;
420 /* A cpp_reader encapsulates the "state" of a pre-processor run.
421 Applying cpp_get_token repeatedly yields a stream of pre-processor
422 tokens. Usually, there is only one cpp_reader object active. */
425 /* Top of buffer stack. */
428 /* Overlaid buffer (can be different after processing #include). */
429 cpp_buffer
*overlaid_buffer
;
432 struct lexer_state state
;
434 /* Source line tracking. */
435 class line_maps
*line_table
;
437 /* The line of the '#' of the current directive. */
438 location_t directive_line
;
440 /* Memory buffers. */
441 _cpp_buff
*a_buff
; /* Aligned permanent storage. */
442 _cpp_buff
*u_buff
; /* Unaligned permanent storage. */
443 _cpp_buff
*free_buffs
; /* Free buffer chain. */
446 struct cpp_context base_context
;
447 struct cpp_context
*context
;
449 /* If in_directive, the directive if known. */
450 const struct directive
*directive
;
452 /* Token generated while handling a directive, if any. */
453 cpp_token directive_result
;
455 /* When expanding a macro at top-level, this is the location of the
457 location_t invocation_location
;
459 /* This is the node representing the macro being expanded at
460 top-level. The value of this data member is valid iff
461 cpp_in_macro_expansion_p() returns TRUE. */
462 cpp_hashnode
*top_most_macro_node
;
464 /* Nonzero if we are about to expand a macro. Note that if we are
465 really expanding a macro, the function macro_of_context returns
466 the macro being expanded and this flag is set to false. Client
467 code should use the function cpp_in_macro_expansion_p to know if we
468 are either about to expand a macro, or are actually expanding
470 bool about_to_expand_macro_p
;
472 /* True if the preprocessor should diagnose CPP_DOT or CPP_COLON
473 tokens as the first ones coming from macro expansion. */
474 bool diagnose_dot_colon_from_macro_p
;
476 /* Search paths for include files. */
477 struct cpp_dir
*quote_include
; /* "" */
478 struct cpp_dir
*bracket_include
; /* <> */
479 struct cpp_dir no_search_path
; /* No path. */
480 struct cpp_dir
*embed_include
; /* #embed <> */
482 /* Chain of all hashed _cpp_file instances. */
483 struct _cpp_file
*all_files
;
485 struct _cpp_file
*main_file
;
487 /* File and directory hash table. */
488 struct htab
*file_hash
;
489 struct htab
*dir_hash
;
490 struct file_hash_entry_pool
*file_hash_entries
;
492 /* Negative path lookup hash table. */
493 struct htab
*nonexistent_file_hash
;
494 struct obstack nonexistent_file_ob
;
496 /* Nonzero means don't look for #include "foo" the source-file
498 bool quote_ignores_source_dir
;
500 /* Nonzero if any file has contained #pragma once or #import has
504 /* Multiple include optimization and -Wheader-guard warning. */
505 const cpp_hashnode
*mi_cmacro
;
506 const cpp_hashnode
*mi_ind_cmacro
;
507 const cpp_hashnode
*mi_def_cmacro
;
508 location_t mi_loc
, mi_def_loc
;
512 cpp_token
*cur_token
;
513 tokenrun base_run
, *cur_run
;
514 unsigned int lookaheads
;
516 /* Nonzero prevents the lexer from re-using the token runs. */
517 unsigned int keep_tokens
;
519 /* Buffer to hold macro definition string. */
520 unsigned char *macro_buffer
;
521 unsigned int macro_buffer_len
;
523 /* Descriptor for converting from the source character set to the
524 execution character set. */
525 struct cset_converter narrow_cset_desc
;
527 /* Descriptor for converting from the source character set to the
528 UTF-8 execution character set. */
529 struct cset_converter utf8_cset_desc
;
531 /* Descriptor for converting from the source character set to the
532 UTF-16 execution character set. */
533 struct cset_converter char16_cset_desc
;
535 /* Descriptor for converting from the source character set to the
536 UTF-32 execution character set. */
537 struct cset_converter char32_cset_desc
;
539 /* Descriptor for converting from the source character set to the
540 wide execution character set. */
541 struct cset_converter wide_cset_desc
;
543 /* Date and time text. Calculated together if either is requested. */
544 const unsigned char *date
;
545 const unsigned char *time
;
547 /* Time stamp, set idempotently lazily. */
549 int time_stamp_kind
; /* Or errno. */
551 /* A token forcing paste avoidance, and one demarking macro arguments. */
552 cpp_token avoid_paste
;
555 /* Opaque handle to the dependencies of mkdeps.cc. */
558 /* Obstack holding all macro hash nodes. This never shrinks.
559 See identifiers.cc */
560 struct obstack hash_ob
;
562 /* Obstack holding buffer and conditional structures. This is a
563 real stack. See directives.cc. */
564 struct obstack buffer_ob
;
566 /* Pragma table - dynamic, because a library user can add to the
567 list of recognized pragmas. */
568 struct pragma_entry
*pragmas
;
570 /* Call backs to cpplib client. */
571 struct cpp_callbacks cb
;
573 /* Identifier hash table. */
574 struct ht
*hash_table
;
576 /* Identifier ancillary data hash table. */
577 struct ht
*extra_hash_table
;
579 /* Expression parser stack. */
580 struct op
*op_stack
, *op_limit
;
582 /* User visible options. */
583 struct cpp_options opts
;
585 /* Special nodes - identifiers with predefined significance to the
587 struct spec_nodes spec_nodes
;
589 /* Whether cpplib owns the hashtable. */
590 bool our_hashtable
, our_extra_hashtable
;
592 /* Traditional preprocessing output buffer (a logical line). */
596 unsigned char *limit
;
598 location_t first_line
;
601 /* Used for buffer overlays by traditional.cc. */
602 const unsigned char *saved_cur
, *saved_rlimit
, *saved_line_base
;
604 /* A saved list of the defined macros, for dependency checking
605 of precompiled headers. */
606 struct cpp_savedstate
*savedstate
;
608 /* Next value of __COUNTER__ macro. */
609 unsigned int counter
;
611 /* Table of comments, when state.save_comments is true. */
612 cpp_comment_table comments
;
614 /* List of saved macros by push_macro. */
615 struct def_pragma_macro
*pushed_macros
;
617 /* If non-zero, the lexer will use this location for the next token
618 instead of getting a location from the linemap. */
619 location_t forced_token_location
;
621 /* Location identifying the main source file -- intended to be line
622 zero of said file. */
625 /* If non-zero, override diagnostic locations (other than DK_NOTE
626 diagnostics) to this one. */
627 location_t diagnostic_override_loc
;
629 /* Returns true iff we should warn about UTF-8 bidirectional control
631 bool warn_bidi_p () const
633 return (CPP_OPTION (this, cpp_warn_bidirectional
)
634 & (bidirectional_unpaired
|bidirectional_any
));
638 /* Lists of tokens for #embed/__has_embed prefix/suffix/if_empty
640 struct cpp_embed_params_tokens
642 cpp_token
*cur_token
;
643 tokenrun base_run
, *cur_run
;
647 /* #embed and __has_embed parameters. */
648 struct cpp_embed_params
652 cpp_num_part limit
, offset
;
653 cpp_embed_params_tokens prefix
, suffix
, if_empty
, base64
;
656 /* Character classes. Based on the more primitive macros in safe-ctype.h.
657 If the definition of `numchar' looks odd to you, please look up the
658 definition of a pp-number in the C standard [section 6.4.8 of C99].
660 In the unlikely event that characters other than \r and \n enter
661 the set is_vspace, the macro handle_newline() in lex.cc must be
663 #define _dollar_ok(x) ((x) == '$' && CPP_OPTION (pfile, dollars_in_ident))
665 #define is_idchar(x) (ISIDNUM(x) || _dollar_ok(x))
666 #define is_numchar(x) ISIDNUM(x)
667 #define is_idstart(x) (ISIDST(x) || _dollar_ok(x))
668 #define is_numstart(x) ISDIGIT(x)
669 #define is_hspace(x) ISBLANK(x)
670 #define is_vspace(x) IS_VSPACE(x)
671 #define is_nvspace(x) IS_NVSPACE(x)
672 #define is_space(x) IS_SPACE_OR_NUL(x)
674 #define SEEN_EOL() (pfile->cur_token[-1].type == CPP_EOF)
676 /* This table is constant if it can be initialized at compile time,
677 which is the case if cpp was compiled with GCC >=2.7, or another
678 compiler that supports C99. */
679 #if HAVE_DESIGNATED_INITIALIZERS
680 extern const unsigned char _cpp_trigraph_map
[UCHAR_MAX
+ 1];
681 #elif __cpp_constexpr >= 201304L
682 extern const struct _cpp_trigraph_map_s
{
683 unsigned char map
[UCHAR_MAX
+ 1];
684 constexpr _cpp_trigraph_map_s ();
685 } _cpp_trigraph_map_d
;
686 #define _cpp_trigraph_map _cpp_trigraph_map_d.map
688 extern unsigned char _cpp_trigraph_map
[UCHAR_MAX
+ 1];
691 #if !defined (HAVE_UCHAR) && !defined (IN_GCC)
692 typedef unsigned char uchar
;
695 #define UC (const uchar *) /* Intended use: UC"string" */
700 _cpp_in_system_header (cpp_reader
*pfile
)
702 return pfile
->buffer
? pfile
->buffer
->sysp
: 0;
704 #define CPP_PEDANTIC(PF) CPP_OPTION (PF, cpp_pedantic)
705 #define CPP_WTRADITIONAL(PF) CPP_OPTION (PF, cpp_warn_traditional)
707 /* Return true if we're in the main file (unless it's considered to be
708 an include file in its own right. */
710 _cpp_in_main_source_file (cpp_reader
*pfile
)
712 return (!CPP_OPTION (pfile
, main_search
)
713 && pfile
->buffer
->file
== pfile
->main_file
);
716 /* True if NODE is a macro for the purposes of ifdef, defined etc. */
718 _cpp_defined_macro_p (const cpp_hashnode
*node
)
720 /* Do not treat conditional macros as being defined. This is due to
721 the powerpc port using conditional macros for 'vector', 'bool',
722 and 'pixel' to act as conditional keywords. This messes up tests
723 like #ifndef bool. */
724 return cpp_macro_p (node
) && !(node
->flags
& NODE_CONDITIONAL
);
728 extern bool _cpp_notify_macro_use (cpp_reader
*pfile
, cpp_hashnode
*node
,
730 inline bool _cpp_maybe_notify_macro_use (cpp_reader
*pfile
, cpp_hashnode
*node
,
733 if (!(node
->flags
& NODE_USED
))
734 return _cpp_notify_macro_use (pfile
, node
, loc
);
737 extern cpp_macro
*_cpp_new_macro (cpp_reader
*, cpp_macro_kind
, void *);
738 extern void _cpp_free_definition (cpp_hashnode
*);
739 extern bool _cpp_create_definition (cpp_reader
*, cpp_hashnode
*, location_t
);
740 extern void _cpp_pop_context (cpp_reader
*);
741 extern void _cpp_push_text_context (cpp_reader
*, cpp_hashnode
*,
742 const unsigned char *, size_t);
743 extern bool _cpp_save_parameter (cpp_reader
*, unsigned, cpp_hashnode
*,
745 extern void _cpp_unsave_parameters (cpp_reader
*, unsigned);
746 extern bool _cpp_arguments_ok (cpp_reader
*, cpp_macro
*, const cpp_hashnode
*,
748 extern const unsigned char *_cpp_builtin_macro_text (cpp_reader
*,
751 extern const cpp_token
*_cpp_get_token_no_padding (cpp_reader
*);
752 extern int _cpp_warn_if_unused_macro (cpp_reader
*, cpp_hashnode
*, void *);
753 extern void _cpp_push_token_context (cpp_reader
*, cpp_hashnode
*,
754 const cpp_token
*, unsigned int);
755 extern void _cpp_backup_tokens_direct (cpp_reader
*, unsigned int);
757 /* In identifiers.cc */
759 _cpp_init_hashtable (cpp_reader
*, cpp_hash_table
*, cpp_hash_table
*);
760 extern void _cpp_destroy_hashtable (cpp_reader
*);
763 enum _cpp_find_file_kind
764 { _cpp_FFK_NORMAL
, _cpp_FFK_FAKE
, _cpp_FFK_PRE_INCLUDE
, _cpp_FFK_HAS_INCLUDE
,
765 _cpp_FFK_EMBED
, _cpp_FFK_HAS_EMBED
};
766 extern _cpp_file
*_cpp_find_file (cpp_reader
*, const char *, cpp_dir
*,
767 int angle
, _cpp_find_file_kind
, location_t
);
768 extern bool _cpp_find_failed (_cpp_file
*);
769 extern void _cpp_mark_file_once_only (cpp_reader
*, struct _cpp_file
*);
770 extern cpp_dir
*search_path_head (cpp_reader
*, const char *, int,
771 include_type
, bool = false);
772 extern const char *_cpp_find_header_unit (cpp_reader
*, const char *file
,
773 bool angle_p
, location_t
);
774 extern int _cpp_stack_embed (cpp_reader
*, const char *, bool,
776 extern void _cpp_fake_include (cpp_reader
*, const char *);
777 extern bool _cpp_stack_file (cpp_reader
*, _cpp_file
*, include_type
, location_t
);
778 extern bool _cpp_stack_include (cpp_reader
*, const char *, int,
779 enum include_type
, location_t
);
780 extern int _cpp_compare_file_date (cpp_reader
*, const char *, int);
781 extern void _cpp_report_missing_guards (cpp_reader
*);
782 extern void _cpp_init_files (cpp_reader
*);
783 extern void _cpp_cleanup_files (cpp_reader
*);
784 extern void _cpp_pop_file_buffer (cpp_reader
*, struct _cpp_file
*,
785 const unsigned char *);
786 extern bool _cpp_save_file_entries (cpp_reader
*pfile
, FILE *f
);
787 extern bool _cpp_read_file_entries (cpp_reader
*, FILE *);
788 extern const char *_cpp_get_file_name (_cpp_file
*);
789 extern struct stat
*_cpp_get_file_stat (_cpp_file
*);
790 extern struct cpp_dir
*_cpp_get_file_dir (_cpp_file
*);
791 extern bool _cpp_has_header (cpp_reader
*, const char *, int,
795 extern cpp_num_part
_cpp_parse_expr (cpp_reader
*, const char *,
797 extern struct op
*_cpp_expand_op_stack (cpp_reader
*);
800 extern void _cpp_process_line_notes (cpp_reader
*, int);
801 extern void _cpp_clean_line (cpp_reader
*);
802 extern bool _cpp_get_fresh_line (cpp_reader
*);
803 extern bool _cpp_skip_block_comment (cpp_reader
*);
804 extern cpp_token
*_cpp_temp_token (cpp_reader
*);
805 extern const cpp_token
*_cpp_lex_token (cpp_reader
*);
806 extern cpp_token
*_cpp_lex_direct (cpp_reader
*);
807 extern unsigned char *_cpp_spell_ident_ucns (unsigned char *, cpp_hashnode
*);
808 extern int _cpp_equiv_tokens (const cpp_token
*, const cpp_token
*);
809 extern void _cpp_init_tokenrun (tokenrun
*, unsigned int);
810 extern int _cpp_remaining_tokens_num_in_context (cpp_context
*);
811 extern void _cpp_init_lexer (void);
812 static inline void *_cpp_reserve_room (cpp_reader
*pfile
, size_t have
,
815 if (BUFF_ROOM (pfile
->a_buff
) < (have
+ extra
))
816 _cpp_extend_buff (pfile
, &pfile
->a_buff
, extra
);
817 return BUFF_FRONT (pfile
->a_buff
);
819 extern void *_cpp_commit_buff (cpp_reader
*pfile
, size_t size
);
822 extern void _cpp_maybe_push_include_file (cpp_reader
*);
823 extern const char *cpp_named_operator2name (enum cpp_ttype type
);
824 extern void _cpp_restore_special_builtin (cpp_reader
*pfile
,
825 struct def_pragma_macro
*);
827 /* In directives.cc */
828 extern int _cpp_test_assertion (cpp_reader
*, unsigned int *);
829 extern int _cpp_handle_directive (cpp_reader
*, bool);
830 extern void _cpp_define_builtin (cpp_reader
*, const char *);
831 extern char ** _cpp_save_pragma_names (cpp_reader
*);
832 extern void _cpp_restore_pragma_names (cpp_reader
*, char **);
833 extern int _cpp_do__Pragma (cpp_reader
*, location_t
);
834 extern void _cpp_init_directives (cpp_reader
*);
835 extern void _cpp_init_internal_pragmas (cpp_reader
*);
836 extern void _cpp_free_embed_params_tokens (cpp_embed_params_tokens
*);
837 extern bool _cpp_parse_embed_params (cpp_reader
*, struct cpp_embed_params
*);
838 extern void _cpp_do_file_change (cpp_reader
*, enum lc_reason
, const char *,
839 linenum_type
, unsigned int);
840 extern void _cpp_pop_buffer (cpp_reader
*);
841 extern char *_cpp_bracket_include (cpp_reader
*);
844 extern location_t
cpp_diagnostic_get_current_location (cpp_reader
*);
846 /* In traditional.cc. */
847 extern bool _cpp_scan_out_logical_line (cpp_reader
*, cpp_macro
*, bool);
848 extern bool _cpp_read_logical_line_trad (cpp_reader
*);
849 extern void _cpp_overlay_buffer (cpp_reader
*pfile
, const unsigned char *,
851 extern void _cpp_remove_overlay (cpp_reader
*);
852 extern cpp_macro
*_cpp_create_trad_definition (cpp_reader
*);
853 extern bool _cpp_expansions_different_trad (const cpp_macro
*,
855 extern unsigned char *_cpp_copy_replacement_text (const cpp_macro
*,
857 extern size_t _cpp_replacement_text_len (const cpp_macro
*);
861 /* The normalization state at this point in the sequence.
862 It starts initialized to all zeros, and at the end
863 'level' is the normalization level of the sequence. */
865 struct normalize_state
867 /* The previous starter character. */
869 /* The combining class of the previous character (whether or not a
871 unsigned char prev_class
;
872 /* The lowest normalization level so far. */
873 enum cpp_normalize_level level
;
875 #define INITIAL_NORMALIZE_STATE { 0, 0, normalized_KC }
876 #define NORMALIZE_STATE_RESULT(st) ((st)->level)
878 /* We saw a character C that matches ISIDNUM(), update a
879 normalize_state appropriately. */
880 #define NORMALIZE_STATE_UPDATE_IDNUM(st, c) \
881 ((st)->previous = (c), (st)->prev_class = 0)
883 extern bool _cpp_valid_ucn (cpp_reader
*, const unsigned char **,
884 const unsigned char *, int,
885 struct normalize_state
*state
,
887 source_range
*char_range
,
888 cpp_string_location_reader
*loc_reader
);
890 extern bool _cpp_valid_utf8 (cpp_reader
*pfile
,
894 struct normalize_state
*nst
,
897 extern void _cpp_destroy_iconv (cpp_reader
*);
898 extern unsigned char *_cpp_convert_input (cpp_reader
*, const char *,
899 unsigned char *, size_t, size_t,
900 const unsigned char **, off_t
*);
901 extern const char *_cpp_default_encoding (void);
902 extern cpp_hashnode
* _cpp_interpret_identifier (cpp_reader
*pfile
,
903 const unsigned char *id
,
906 /* Utility routines and macros. */
907 #define DSC(str) (const unsigned char *)str, sizeof str - 1
909 /* These are inline functions instead of macros so we can get type
911 static inline int ustrcmp (const unsigned char *, const unsigned char *);
912 static inline int ustrncmp (const unsigned char *, const unsigned char *,
914 static inline size_t ustrlen (const unsigned char *);
915 static inline const unsigned char *uxstrdup (const unsigned char *);
916 static inline const unsigned char *ustrchr (const unsigned char *, int);
917 static inline int ufputs (const unsigned char *, FILE *);
919 /* Use a const char for the second parameter since it is usually a literal. */
920 static inline int ustrcspn (const unsigned char *, const char *);
923 ustrcmp (const unsigned char *s1
, const unsigned char *s2
)
925 return strcmp ((const char *)s1
, (const char *)s2
);
929 ustrncmp (const unsigned char *s1
, const unsigned char *s2
, size_t n
)
931 return strncmp ((const char *)s1
, (const char *)s2
, n
);
935 ustrcspn (const unsigned char *s1
, const char *s2
)
937 return strcspn ((const char *)s1
, s2
);
941 ustrlen (const unsigned char *s1
)
943 return strlen ((const char *)s1
);
946 static inline const unsigned char *
947 uxstrdup (const unsigned char *s1
)
949 return (const unsigned char *) xstrdup ((const char *)s1
);
952 static inline const unsigned char *
953 ustrchr (const unsigned char *s1
, int c
)
955 return (const unsigned char *) strchr ((const char *)s1
, c
);
959 ufputs (const unsigned char *s
, FILE *f
)
961 return fputs ((const char *)s
, f
);
964 /* In line-map.cc. */
966 /* Create and return a virtual location for a token that is part of a
967 macro expansion-list at a macro expansion point. See the comment
968 inside struct line_map_macro to see what an expansion-list exactly
971 A call to this function must come after a call to
974 MAP is the map into which the source location is created. TOKEN_NO
975 is the index of the token in the macro replacement-list, starting
978 ORIG_LOC is the location of the token outside of this macro
979 expansion. If the token comes originally from the macro
980 definition, it is the locus in the macro definition; otherwise it
981 is a location in the context of the caller of this macro expansion
982 (which is a virtual location or a source location if the caller is
983 itself a macro expansion or not).
985 MACRO_DEFINITION_LOC is the location in the macro definition,
986 either of the token itself or of a macro parameter that it
988 location_t
linemap_add_macro_token (const line_map_macro
*,
993 /* Return the source line number corresponding to source location
994 LOCATION. SET is the line map set LOCATION comes from. If
995 LOCATION is the location of token that is part of the
996 expansion-list of a macro expansion return the line number of the
997 macro expansion point. */
998 int linemap_get_expansion_line (const line_maps
*,
1001 /* Return the path of the file corresponding to source code location
1004 If LOCATION is the location of a token that is part of the
1005 replacement-list of a macro expansion return the file path of the
1006 macro expansion point.
1008 SET is the line map set LOCATION comes from. */
1009 const char* linemap_get_expansion_filename (const line_maps
*,
1012 /* A subclass of rich_location for emitting a diagnostic
1013 at the current location of the reader, but flagging
1014 it with set_escape_on_output (true). */
1015 class encoding_rich_location
: public rich_location
1018 encoding_rich_location (cpp_reader
*pfile
)
1019 : rich_location (pfile
->line_table
,
1020 cpp_diagnostic_get_current_location (pfile
))
1022 set_escape_on_output (true);
1025 encoding_rich_location (cpp_reader
*pfile
, location_t loc
)
1026 : rich_location (pfile
->line_table
, loc
)
1028 set_escape_on_output (true);
1036 #endif /* ! LIBCPP_INTERNAL_H */