mirror of
https://github.com/mirror/tinycc.git
synced 2025-02-04 06:30:10 +08:00
tccpp.c: parse flag to accept stray \
This adds a PARSE_FLAG_ACCEPT_STRAYS parse flag to accept stray backslashes in the source code, and uses it for pure preprocessing. For absolutely correct behaviour of # stringification, we need to use this flag when parsing macro definitions and in macro arguments, as well; this patch does not yet do so. The test case for that is something like #define STRINGIFY2(x) #x #define STRINGIFY(x) STRINGIFY2(x) STRINGIFY(\n) which should produce "\n", not a parse error or "\\n". See http://lists.nongnu.org/archive/html/tinycc-devel/2015-05/msg00002.html
This commit is contained in:
parent
a3d78b95d7
commit
0877ba7cbf
1
tcc.h
1
tcc.h
@ -1152,6 +1152,7 @@ ST_DATA TokenSym **table_ident;
|
|||||||
returned at eof */
|
returned at eof */
|
||||||
#define PARSE_FLAG_ASM_FILE 0x0008 /* we processing an asm file: '#' can be used for line comment, etc. */
|
#define PARSE_FLAG_ASM_FILE 0x0008 /* we processing an asm file: '#' can be used for line comment, etc. */
|
||||||
#define PARSE_FLAG_SPACES 0x0010 /* next() returns space tokens (for -E) */
|
#define PARSE_FLAG_SPACES 0x0010 /* next() returns space tokens (for -E) */
|
||||||
|
#define PARSE_FLAG_ACCEPT_STRAYS 0x0020 /* next() returns '\\' token */
|
||||||
|
|
||||||
ST_FUNC TokenSym *tok_alloc(const char *str, int len);
|
ST_FUNC TokenSym *tok_alloc(const char *str, int len);
|
||||||
ST_FUNC char *get_tok_str(int v, CValue *cv);
|
ST_FUNC char *get_tok_str(int v, CValue *cv);
|
||||||
|
10
tccpp.c
10
tccpp.c
@ -2271,7 +2271,13 @@ static inline void next_nomacro1(void)
|
|||||||
} else {
|
} else {
|
||||||
file->buf_ptr = p;
|
file->buf_ptr = p;
|
||||||
ch = *p;
|
ch = *p;
|
||||||
handle_stray();
|
if (parse_flags & PARSE_FLAG_ACCEPT_STRAYS) {
|
||||||
|
if (handle_stray_noerror() != 0) {
|
||||||
|
goto parse_simple;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
handle_stray();
|
||||||
|
}
|
||||||
p = file->buf_ptr;
|
p = file->buf_ptr;
|
||||||
goto redo_no_start;
|
goto redo_no_start;
|
||||||
}
|
}
|
||||||
@ -3307,7 +3313,7 @@ ST_FUNC int tcc_preprocess(TCCState *s1)
|
|||||||
ch = file->buf_ptr[0];
|
ch = file->buf_ptr[0];
|
||||||
tok_flags = TOK_FLAG_BOL | TOK_FLAG_BOF;
|
tok_flags = TOK_FLAG_BOL | TOK_FLAG_BOF;
|
||||||
parse_flags &= PARSE_FLAG_ASM_FILE;
|
parse_flags &= PARSE_FLAG_ASM_FILE;
|
||||||
parse_flags |= PARSE_FLAG_PREPROCESS | PARSE_FLAG_LINEFEED | PARSE_FLAG_SPACES;
|
parse_flags |= PARSE_FLAG_PREPROCESS | PARSE_FLAG_LINEFEED | PARSE_FLAG_SPACES | PARSE_FLAG_ACCEPT_STRAYS;
|
||||||
token_seen = 0;
|
token_seen = 0;
|
||||||
file->line_ref = 0;
|
file->line_ref = 0;
|
||||||
file_ref = NULL;
|
file_ref = NULL;
|
||||||
|
Loading…
Reference in New Issue
Block a user