aboutsummaryrefslogtreecommitdiff
path: root/gcc/cpplib.h
diff options
context:
space:
mode:
authorZack Weinberg <zack@gcc.gnu.org>2000-04-25 19:32:36 +0000
committerZack Weinberg <zack@gcc.gnu.org>2000-04-25 19:32:36 +0000
commitc5a047348d810987513ce54c6533c1314ad19593 (patch)
tree5a047961b22821bc1f9f0aa156612fd5c002d95c /gcc/cpplib.h
parente0075d846d4a4bbcb3a5114bdc8f4f130bf819b1 (diff)
downloadgcc-c5a047348d810987513ce54c6533c1314ad19593.zip
gcc-c5a047348d810987513ce54c6533c1314ad19593.tar.gz
gcc-c5a047348d810987513ce54c6533c1314ad19593.tar.bz2
[multiple changes]
2000-04-25 Zack Weinberg <zack@wolery.cumb.org> * cpplib.h (struct cpp_buffer): Add 'mapped' flag; fix commentary. 2000-04-25 Neil Booth <NeilB@earthling.net> Restore previous patch, plus the following fixes: * cpphash.c (_cpp_create_definition): Test PREV_WHITESPACE in flags, not CPP_OPEN_PAREN. * cpplex.c (expand_token_space, init_token_list, cpp_free_token_list): Put the dummy token at list->tokens[-1]. (_cpp_lex_line, _cpp_lex_file): token list is 0-based. From-SVN: r33419
Diffstat (limited to 'gcc/cpplib.h')
-rw-r--r--gcc/cpplib.h129
1 files changed, 84 insertions, 45 deletions
diff --git a/gcc/cpplib.h b/gcc/cpplib.h
index 764d8e6..aca02a9 100644
--- a/gcc/cpplib.h
+++ b/gcc/cpplib.h
@@ -34,13 +34,26 @@ typedef struct cpp_options cpp_options;
typedef struct cpp_printer cpp_printer;
typedef struct cpp_token cpp_token;
typedef struct cpp_toklist cpp_toklist;
+typedef struct cpp_name cpp_name;
+
+/* The first two groups, apart from '=', can appear in preprocessor
+ expressions. This allows a lookup table to be implemented in
+ _cpp_parse_expr.
+
+ The first group, to CPP_LAST_EQ, can be immediately followed by an
+ '='. The lexer needs operators ending in '=', like ">>=", to be in
+ the same order as their counterparts without the '=', like ">>". */
+
+/* Positions in the table. */
+#define CPP_LAST_EQ CPP_LSHIFT
+#define CPP_FIRST_DIGRAPH CPP_HASH
- /* Put operators that can appear in a preprocessor expression first.
- This allows a lookup table to be implemented in _cpp_parse_expr.
- Ordering within this group is currently not significant, apart
- from those ending in '=' being at the end. */
#define TTYPE_TABLE \
- T(CPP_PLUS = 0, "+") /* math */ \
+ T(CPP_EQ = 0, "=") \
+ T(CPP_NOT, "!") \
+ T(CPP_GREATER, ">") /* compare */ \
+ T(CPP_LESS, "<") \
+ T(CPP_PLUS, "+") /* math */ \
T(CPP_MINUS, "-") \
T(CPP_MULT, "*") \
T(CPP_DIV, "/") \
@@ -51,22 +64,19 @@ typedef struct cpp_toklist cpp_toklist;
T(CPP_COMPL, "~") \
T(CPP_RSHIFT, ">>") \
T(CPP_LSHIFT, "<<") \
- T(CPP_NOT, "!") /* logicals */ \
- T(CPP_AND_AND, "&&") \
+\
+ T(CPP_AND_AND, "&&") /* logical */ \
T(CPP_OR_OR, "||") \
T(CPP_QUERY, "?") \
T(CPP_COLON, ":") \
T(CPP_COMMA, ",") /* grouping */ \
T(CPP_OPEN_PAREN, "(") \
T(CPP_CLOSE_PAREN, ")") \
- T(CPP_GREATER, ">") /* compare */ \
- T(CPP_LESS, "<") \
- T(CPP_EQ_EQ, "==") \
+ T(CPP_EQ_EQ, "==") /* compare */ \
T(CPP_NOT_EQ, "!=") \
T(CPP_GREATER_EQ, ">=") \
T(CPP_LESS_EQ, "<=") \
\
- /* The remainder of the punctuation. Order is not significant. */ \
T(CPP_PLUS_EQ, "+=") /* math */ \
T(CPP_MINUS_EQ, "-=") \
T(CPP_MULT_EQ, "*=") \
@@ -78,55 +88,67 @@ typedef struct cpp_toklist cpp_toklist;
T(CPP_COMPL_EQ, "~=") \
T(CPP_RSHIFT_EQ, ">>=") \
T(CPP_LSHIFT_EQ, "<<=") \
- T(CPP_EQ, "=") /* assign */ \
+ /* Digraphs together, beginning with CPP_FIRST_DIGRAPH. */ \
+ T(CPP_HASH, "#") /* digraphs */ \
+ T(CPP_PASTE, "##") \
+ T(CPP_OPEN_SQUARE, "[") \
+ T(CPP_CLOSE_SQUARE, "]") \
+ T(CPP_OPEN_BRACE, "{") \
+ T(CPP_CLOSE_BRACE, "}") \
+ /* The remainder of the punctuation. Order is not significant. */ \
+ T(CPP_SEMICOLON, ";") /* structure */ \
+ T(CPP_ELLIPSIS, "...") \
+ T(CPP_BACKSLASH, "\\") \
T(CPP_PLUS_PLUS, "++") /* increment */ \
T(CPP_MINUS_MINUS, "--") \
T(CPP_DEREF, "->") /* accessors */ \
T(CPP_DOT, ".") \
- T(CPP_OPEN_SQUARE, "[") \
- T(CPP_CLOSE_SQUARE, "]") \
T(CPP_SCOPE, "::") \
T(CPP_DEREF_STAR, "->*") \
T(CPP_DOT_STAR, ".*") \
- T(CPP_OPEN_BRACE, "{") /* structure */ \
- T(CPP_CLOSE_BRACE, "}") \
- T(CPP_SEMICOLON, ";") \
- T(CPP_ELLIPSIS, "...") \
- T(CPP_HASH, "#") \
- T(CPP_PASTE, "##") \
- T(CPP_BACKSLASH, "\\") \
T(CPP_MIN, "<?") /* extension */ \
T(CPP_MAX, ">?") \
- T(CPP_OTHER, spell_other) /* stray punctuation */ \
+ H(CPP_OTHER, spell_other) /* stray punctuation */ \
\
- T(CPP_NAME, spell_name) /* word */ \
- T(CPP_INT, 0) /* 23 */ \
- T(CPP_FLOAT, 0) /* 3.14159 */ \
- T(CPP_NUMBER, spell_name) /* 34_be+ta */ \
- T(CPP_CHAR, spell_char) /* 'char' */ \
- T(CPP_WCHAR, spell_char) /* L'char' */ \
- T(CPP_STRING, spell_string) /* "string" */ \
- T(CPP_WSTRING, spell_string) /* L"string" */ \
+ H(CPP_NAME, spell_name) /* word */ \
+ N(CPP_INT, 0) /* 23 */ \
+ N(CPP_FLOAT, 0) /* 3.14159 */ \
+ H(CPP_NUMBER, spell_name) /* 34_be+ta */ \
+ H(CPP_CHAR, spell_char) /* 'char' */ \
+ H(CPP_WCHAR, spell_char) /* L'char' */ \
+ H(CPP_STRING, spell_string) /* "string" */ \
+ H(CPP_WSTRING, spell_string) /* L"string" */ \
\
- T(CPP_COMMENT, spell_comment) /* Only if output comments. */ \
- T(CPP_VSPACE, "\n") /* End of line. */ \
- T(CPP_EOF, 0) /* End of file. */ \
- T(CPP_HEADER_NAME, 0) /* <stdio.h> in #include */ \
- T(CPP_ASSERTION, 0) /* (...) in #assert */ \
+ H(CPP_C_COMMENT, spell_comment) /* Only if output comments. */ \
+ H(CPP_CPP_COMMENT, spell_comment) /* Only if output comments. */ \
+ H(CPP_CHILL_COMMENT, spell_comment) /* Only if output comments. */ \
+ N(CPP_MACRO_ARG, 0) /* Macro argument. */ \
+ N(CPP_SUBLIST, 0) /* Sublist. */ \
+ E(CPP_VSPACE, "\n") /* End of line. */ \
+ N(CPP_EOF, 0) /* End of file. */ \
+ N(CPP_HEADER_NAME, 0) /* <stdio.h> in #include */ \
+ N(CPP_ASSERTION, 0) /* (...) in #assert */ \
\
/* Obsolete - will be removed when no code uses them still. */ \
- T(CPP_HSPACE, 0) /* Horizontal white space. */ \
- T(CPP_POP, 0) /* End of buffer. */ \
- T(CPP_DIRECTIVE, 0) /* #define and the like */ \
- T(CPP_MACRO, 0) /* Like a NAME, but expanded. */
+ H(CPP_COMMENT, 0) /* Only if output comments. */ \
+ N(CPP_HSPACE, 0) /* Horizontal white space. */ \
+ N(CPP_POP, 0) /* End of buffer. */ \
+ N(CPP_DIRECTIVE, 0) /* #define and the like */ \
+ N(CPP_MACRO, 0) /* Like a NAME, but expanded. */
#define T(e, s) e,
+#define H(e, s) e,
+#define N(e, s) e,
+#define E(e, s) e,
enum cpp_ttype
{
TTYPE_TABLE
N_TTYPES
};
#undef T
+#undef H
+#undef N
+#undef E
/* Payload of a NAME, NUMBER, FLOAT, STRING, or COMMENT token. */
struct cpp_name
@@ -135,8 +157,12 @@ struct cpp_name
unsigned int offset; /* from list->namebuf */
};
-/* Per token flags. */
-#define HSPACE_BEFORE (1 << 0) /* token preceded by hspace */
+#define TOK_NAME(list, token) ((list)->namebuf + (token)->val.name.offset)
+
+/* Flags for the cpp_token structure. */
+#define PREV_WHITESPACE 1 /* If whitespace before this token. */
+#define DIGRAPH 2 /* If it was a digraph. */
+#define UNSIGNED_INT 4 /* If int preprocessing token unsigned. */
/* A preprocessing token.
This has been carefully packed and should occupy 16 bytes on
@@ -150,8 +176,9 @@ struct cpp_token
unsigned char type;
#endif
unsigned char flags; /* flags - see above */
- unsigned int aux; /* hash of a NAME, or something -
- see uses in the code */
+ unsigned int aux; /* CPP_OTHER character. Hash of a
+ NAME, or something - see uses
+ in the code */
union
{
struct cpp_name name; /* a string */
@@ -168,7 +195,7 @@ typedef int (*parse_cleanup_t) PARAMS ((cpp_buffer *, cpp_reader *));
struct cpp_toklist
{
- struct cpp_token *tokens; /* actual tokens as an array */
+ cpp_token *tokens; /* actual tokens as an array */
unsigned int tokens_used; /* tokens used */
unsigned int tokens_cap; /* tokens allocated */
@@ -178,6 +205,11 @@ struct cpp_toklist
unsigned int line; /* starting line number */
+ /* Comment copying. */
+ cpp_token *comments; /* comment tokens. */
+ unsigned int comments_used; /* comment tokens used. */
+ unsigned int comments_cap; /* comment token capacity. */
+
/* Only used if tokens[0].type == CPP_DIRECTIVE. This is the
handler to call after lexing the rest of this line. The flags
indicate whether the rest of the line gets special treatment
@@ -244,8 +276,12 @@ struct cpp_buffer
/* True if we have already warned about C++ comments in this file.
The warning happens only for C89 extended mode with -pedantic on,
- and only once per file (otherwise it would be far too noisy). */
+ or for -Wtraditional, and only once per file (otherwise it would
+ be far too noisy). */
char warned_cplusplus_comments;
+
+ /* True if this buffer's data is mmapped. */
+ char mapped;
};
struct file_name_map_list;
@@ -561,6 +597,7 @@ struct cpp_printer
/* Name under which this program was invoked. */
extern const char *progname;
+extern void _cpp_lex_file PARAMS((cpp_reader *));
extern int cpp_handle_options PARAMS ((cpp_reader *, int, char **));
extern enum cpp_ttype cpp_get_token PARAMS ((cpp_reader *));
extern enum cpp_ttype cpp_get_non_space_token PARAMS ((cpp_reader *));
@@ -580,6 +617,8 @@ extern void cpp_assert PARAMS ((cpp_reader *, const char *));
extern void cpp_undef PARAMS ((cpp_reader *, const char *));
extern void cpp_unassert PARAMS ((cpp_reader *, const char *));
+extern void cpp_free_token_list PARAMS ((cpp_toklist *));
+
/* N.B. The error-message-printer prototypes have not been nicely
formatted because exgettext needs to see 'msgid' on the same line
as the name of the function in order to work properly. Only the