Fixed parsing of quoted content
This commit is contained in:
parent
b501ac22c6
commit
9725bf001b
56
src/cpp.c
56
src/cpp.c
|
@ -390,12 +390,10 @@ static int _cpp_callback_operator(Parser * parser, Token * token, int c,
|
||||||
|
|
||||||
|
|
||||||
/* cpp_callback_quote */
|
/* cpp_callback_quote */
|
||||||
static int _quote_escape(int c);
|
|
||||||
|
|
||||||
static int _cpp_callback_quote(Parser * parser, Token * token, int c,
|
static int _cpp_callback_quote(Parser * parser, Token * token, int c,
|
||||||
void * data)
|
void * data)
|
||||||
{
|
{
|
||||||
const int d = c;
|
int escape = 0;
|
||||||
char * str = NULL;
|
char * str = NULL;
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
char * p;
|
char * p;
|
||||||
|
@ -407,27 +405,30 @@ static int _cpp_callback_quote(Parser * parser, Token * token, int c,
|
||||||
else
|
else
|
||||||
return 1;
|
return 1;
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stderr, "DEBUG: cpp_callback_quote('%c')\n", c);
|
fprintf(stderr, "%s%c%s", "DEBUG: cpp_callback_quote('", c, "')\n");
|
||||||
#endif
|
#endif
|
||||||
while((p = realloc(str, len + 3)) != NULL)
|
while((p = realloc(str, len + 3)) != NULL)
|
||||||
{
|
{
|
||||||
str = p;
|
str = p;
|
||||||
str[len++] = c;
|
str[len++] = c;
|
||||||
if((c = parser_scan_filter(parser)) == EOF
|
if((c = parser_scan_filter(parser)) == EOF || c == '\n')
|
||||||
|| c == '\n' || c == d)
|
|
||||||
break; /* unexpected end of line, file or of string */
|
|
||||||
if(c != '\\')
|
|
||||||
continue; /* character is not escaped */
|
|
||||||
if((c = parser_scan_filter(parser)) == EOF)
|
|
||||||
break;
|
break;
|
||||||
c = _quote_escape(c);
|
if(escape)
|
||||||
|
{
|
||||||
|
escape = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if(c == str[0])
|
||||||
|
break;
|
||||||
|
if(c == '\\')
|
||||||
|
escape = 1;
|
||||||
}
|
}
|
||||||
if(str == NULL || c != d)
|
if(str == NULL || c != str[0])
|
||||||
{
|
{
|
||||||
free(str);
|
free(str);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
str[len++] = d;
|
str[len++] = str[0];
|
||||||
str[len] = '\0';
|
str[len] = '\0';
|
||||||
token_set_string(token, str);
|
token_set_string(token, str);
|
||||||
free(str);
|
free(str);
|
||||||
|
@ -435,35 +436,6 @@ static int _cpp_callback_quote(Parser * parser, Token * token, int c,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int _quote_escape(int c)
|
|
||||||
/* FIXME - handle octal and hexadecimal input
|
|
||||||
* - seems to break further interpretation (eg '\0') */
|
|
||||||
{
|
|
||||||
switch(c)
|
|
||||||
{
|
|
||||||
case '0':
|
|
||||||
return '\0';
|
|
||||||
case 'a':
|
|
||||||
return '\a';
|
|
||||||
case 'b':
|
|
||||||
return '\b';
|
|
||||||
case 'e':
|
|
||||||
return '\e';
|
|
||||||
case 'f':
|
|
||||||
return '\f';
|
|
||||||
case 'n':
|
|
||||||
return '\n';
|
|
||||||
case 'r':
|
|
||||||
return '\r';
|
|
||||||
case 't':
|
|
||||||
return '\t';
|
|
||||||
case 'v':
|
|
||||||
return '\v';
|
|
||||||
default:
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* cpp_callback_word */
|
/* cpp_callback_word */
|
||||||
static int _isword(int c);
|
static int _isword(int c);
|
||||||
|
|
Loading…
Reference in New Issue
Block a user