correct version of "Identifiers can start and/or contain"

A problem was in TOK_ASMDIR_text:
    -    sprintf(sname, ".%s", get_tok_str(tok1, NULL));
    +    sprintf(sname, "%s", get_tok_str(tok1, NULL));
    When tok1 is '.text', then sname is '..text'
This commit is contained in:
seyko
2016-04-13 10:23:46 +03:00
parent 989b5ee8ae
commit 6a49afb3ed
4 changed files with 94 additions and 72 deletions

14
tccpp.c
View File

@ -1328,6 +1328,9 @@ ST_FUNC void parse_define(void)
parse_flags |= PARSE_FLAG_SPACES;
next_nomacro_spc();
if (tok == '(') {
/* must be able to parse TOK_DOTS (in asm mode '.' can be part of identifier) */
parse_flags &= ~PARSE_FLAG_ASM_FILE;
isidnum_table['.' - CH_EOF] = 0;
next_nomacro();
ps = &first;
if (tok != ')') for (;;) {
@ -1355,6 +1358,9 @@ ST_FUNC void parse_define(void)
}
next_nomacro_spc();
t = MACRO_FUNC;
parse_flags |= (saved_parse_flags & PARSE_FLAG_ASM_FILE);
isidnum_table['.' - CH_EOF] =
(parse_flags & PARSE_FLAG_ASM_FILE) ? IS_ID : 0;
}
tok_str_new(&str);
spc = 2;
@ -2508,7 +2514,8 @@ maybe_newline:
p--;
PEEKC(c, p);
parse_ident_slow:
while (isidnum_table[c - CH_EOF] & (IS_ID|IS_NUM)) {
while (isidnum_table[c - CH_EOF] & (IS_ID|IS_NUM))
{
cstr_ccat(&tokcstr, c);
PEEKC(c, p);
}
@ -2567,7 +2574,7 @@ maybe_newline:
cstr_reset(&tokcstr);
cstr_ccat(&tokcstr, '.');
goto parse_num;
} else if ((isidnum_table['.' - CH_EOF] & IS_ID) != 0) { /* asm mode */
} else if (parse_flags & PARSE_FLAG_ASM_FILE) {
*--p = c = '.';
goto parse_ident_fast;
} else if (c == '.') {
@ -3364,6 +3371,9 @@ ST_FUNC void preprocess_init(TCCState *s1)
isidnum_table['$' - CH_EOF] =
tcc_state->dollars_in_identifiers ? IS_ID : 0;
isidnum_table['.' - CH_EOF] =
(parse_flags & PARSE_FLAG_ASM_FILE) ? IS_ID : 0;
}
ST_FUNC void preprocess_new(void)