Working on directives

This commit is contained in:
Pierre Pronchery 2008-02-27 12:34:55 +00:00
parent 6aec55b1b2
commit e52fa8b9ca

View File

@ -104,6 +104,8 @@ static const size_t _cpp_operators_cnt = sizeof(_cpp_operators)
/* prototypes */ /* prototypes */
/* useful */ /* useful */
static int _cpp_isword(int c);
/* filters */ /* filters */
static int _cpp_filter_includes(int * c, void * data); static int _cpp_filter_includes(int * c, void * data);
static int _cpp_filter_newlines(int * c, void * data); static int _cpp_filter_newlines(int * c, void * data);
@ -131,6 +133,13 @@ static int _cpp_callback_unknown(Parser * parser, Token * token, int c,
/* Cpp */ /* Cpp */
/* private */ /* private */
/* cpp_isword */
static int _cpp_isword(int c)
{
return isalnum(c) || c == '_';
}
/* cpp_filter_includes */ /* cpp_filter_includes */
static int _cpp_filter_includes(int * c, void * data) static int _cpp_filter_includes(int * c, void * data)
/* FIXME should be a wrapper around parser_scan() instead */ /* FIXME should be a wrapper around parser_scan() instead */
@ -342,14 +351,14 @@ static int _cpp_callback_comment(Parser * parser, Token * token, int c,
/* cpp_callback_directive */ /* cpp_callback_directive */
static char * _directive_word(Parser * parser, int c);
static int _cpp_callback_directive(Parser * parser, Token * token, int c, static int _cpp_callback_directive(Parser * parser, Token * token, int c,
void * data) void * data)
/* FIXME actually parse and implement, careful with comments */ /* FIXME actually parse and implement, careful with comments */
{ {
Cpp * cpp = data; Cpp * cpp = data;
char * str = NULL; char * str = NULL;
size_t len = 0;
char * p;
if(cpp->directive_newline != 1 || c != '#') if(cpp->directive_newline != 1 || c != '#')
{ {
@ -359,23 +368,39 @@ static int _cpp_callback_directive(Parser * parser, Token * token, int c,
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "%s", "DEBUG: cpp_callback_directive()\n"); fprintf(stderr, "%s", "DEBUG: cpp_callback_directive()\n");
#endif #endif
while(isspace((c = parser_scan_filter(parser))) && c != '\n');
if(!_cpp_isword(c))
return -1;
if((str = _directive_word(parser, c)) == NULL)
return -1;
token_set_code(token, CPP_CODE_META);
token_set_string(token, str);
free(str);
while((c = parser_scan_filter(parser)) != EOF && c != '\n');
return 0;
}
static char * _directive_word(Parser * parser, int c)
/* FIXME this code is probably useful in other places too */
{
char * str = NULL;
size_t len = 0;
char * p;
do do
{ {
if((p = realloc(str, len + 1)) == NULL) if((p = realloc(str, len + 1)) == NULL)
{ {
error_set_code(1, "%s", strerror(errno)); error_set_code(1, "%s", strerror(errno));
free(str); free(str);
return -1; return NULL;
} }
str = p; str = p;
str[len++] = c; str[len++] = c;
} }
while((c = parser_scan_filter(parser)) != '\n'); while(_cpp_isword((c = parser_scan_filter(parser))));
str[len] = '\0'; str[len] = '\0';
token_set_code(token, CPP_CODE_META); return str;
token_set_string(token, str);
free(str);
return 0;
} }
@ -480,8 +505,6 @@ static int _cpp_callback_quote(Parser * parser, Token * token, int c,
/* cpp_callback_word */ /* cpp_callback_word */
static int _isword(int c);
static int _cpp_callback_word(Parser * parser, Token * token, int c, static int _cpp_callback_word(Parser * parser, Token * token, int c,
void * data) void * data)
{ {
@ -489,7 +512,7 @@ static int _cpp_callback_word(Parser * parser, Token * token, int c,
size_t len = 0; size_t len = 0;
char * p; char * p;
if(!_isword(c)) if(!_cpp_isword(c))
return 1; return 1;
#ifdef DEBUG #ifdef DEBUG
fprintf(stderr, "DEBUG: cpp_callback_word('%c')\n", c); fprintf(stderr, "DEBUG: cpp_callback_word('%c')\n", c);
@ -505,7 +528,7 @@ static int _cpp_callback_word(Parser * parser, Token * token, int c,
str = p; str = p;
str[len++] = c; str[len++] = c;
} }
while(_isword((c = parser_scan_filter(parser)))); while(_cpp_isword((c = parser_scan_filter(parser))));
str[len] = '\0'; str[len] = '\0';
token_set_code(token, CPP_CODE_WORD); token_set_code(token, CPP_CODE_WORD);
token_set_string(token, str); token_set_string(token, str);
@ -513,11 +536,6 @@ static int _cpp_callback_word(Parser * parser, Token * token, int c,
return 0; return 0;
} }
static int _isword(int c)
{
return isalnum(c) || c == '_';
}
/* cpp_callback_unknown */ /* cpp_callback_unknown */
static int _cpp_callback_unknown(Parser * parser, Token * token, int c, static int _cpp_callback_unknown(Parser * parser, Token * token, int c,