Added a filter for comments
This commit is contained in:
parent
0c17a6cf60
commit
187a04704d
|
@ -30,7 +30,8 @@ typedef enum _CppFilter
|
|||
{
|
||||
CPP_FILTER_NONE = 0,
|
||||
CPP_FILTER_TRIGRAPH = 1,
|
||||
CPP_FILTER_WHITESPACE = 2
|
||||
CPP_FILTER_WHITESPACE = 2,
|
||||
CPP_FILTER_COMMENT = 4
|
||||
} CppFilter;
|
||||
|
||||
typedef enum _CppCode
|
||||
|
@ -101,6 +102,7 @@ typedef enum _CppCode
|
|||
CPP_CODE_SQUOTE,
|
||||
CPP_CODE_WHITESPACE,
|
||||
CPP_CODE_NEWLINE,
|
||||
CPP_CODE_COMMENT,
|
||||
CPP_CODE_WORD, /* FIXME numbers and keywords? */
|
||||
CPP_CODE_UNKNOWN
|
||||
} CppCode;
|
||||
|
|
36
src/cpp.c
36
src/cpp.c
|
@ -487,7 +487,8 @@ static int _cpp_callback_otherspace(Parser * parser, Token * token, int c,
|
|||
size_t len = 0;
|
||||
char * p;
|
||||
|
||||
if(!isspace(c) || c == '\n')
|
||||
assert(c != '\n');
|
||||
if(!isspace(c))
|
||||
return 1;
|
||||
#ifdef DEBUG
|
||||
fprintf(stderr, "DEBUG: %s()\n", __func__);
|
||||
|
@ -520,8 +521,12 @@ static int _cpp_callback_otherspace(Parser * parser, Token * token, int c,
|
|||
/* cpp_callback_comment */
|
||||
static int _cpp_callback_comment(Parser * parser, Token * token, int c,
|
||||
void * data)
|
||||
/* TODO implement a flag to actually keep the content */
|
||||
{
|
||||
Cpp * cpp = data;
|
||||
char * str = NULL;
|
||||
size_t len = 2;
|
||||
char * p;
|
||||
|
||||
if(c != '/')
|
||||
return 1;
|
||||
#ifdef DEBUG
|
||||
|
@ -534,6 +539,15 @@ static int _cpp_callback_comment(Parser * parser, Token * token, int c,
|
|||
return 0;
|
||||
}
|
||||
for(c = parser_scan_filter(parser); c != EOF;)
|
||||
{
|
||||
if(!(cpp->filters & CPP_FILTER_COMMENT))
|
||||
{
|
||||
if((p = realloc(str, len + 3)) == NULL)
|
||||
return -error_set_code(1, "%s", strerror(
|
||||
errno));
|
||||
str = p;
|
||||
str[len++] = c;
|
||||
}
|
||||
if(c == '*')
|
||||
{
|
||||
if((c = parser_scan_filter(parser)) == '/')
|
||||
|
@ -541,10 +555,24 @@ static int _cpp_callback_comment(Parser * parser, Token * token, int c,
|
|||
}
|
||||
else
|
||||
c = parser_scan_filter(parser);
|
||||
}
|
||||
if(c == EOF)
|
||||
return -1;
|
||||
return -error_set_code(1, "%s", "End of file within a comment");
|
||||
if(str != NULL)
|
||||
{
|
||||
str[0] = '/';
|
||||
str[1] = '*';
|
||||
str[len++] = '/';
|
||||
str[len] = '\0';
|
||||
token_set_code(token, CPP_CODE_COMMENT);
|
||||
token_set_string(token, str);
|
||||
free(str);
|
||||
}
|
||||
else
|
||||
{
|
||||
token_set_code(token, CPP_CODE_WHITESPACE);
|
||||
token_set_string(token, " ");
|
||||
}
|
||||
parser_scan_filter(parser);
|
||||
return 0;
|
||||
}
|
||||
|
@ -996,7 +1024,7 @@ Cpp * cpp_new(char const * filename, int filters)
|
|||
parser_add_callback(cpp->parser, _cpp_callback_newline, cpp);
|
||||
parser_add_callback(cpp->parser, _cpp_callback_otherspace, cpp);
|
||||
}
|
||||
parser_add_callback(cpp->parser, _cpp_callback_comment, NULL);
|
||||
parser_add_callback(cpp->parser, _cpp_callback_comment, cpp);
|
||||
parser_add_callback(cpp->parser, _cpp_callback_directive, cpp);
|
||||
parser_add_callback(cpp->parser, _cpp_callback_comma, NULL);
|
||||
parser_add_callback(cpp->parser, _cpp_callback_operator, NULL);
|
||||
|
|
|
@ -75,7 +75,7 @@ static int _cpp(Prefs * prefs, int filec, char * filev[])
|
|||
static int _cpp_do(Prefs * prefs, FILE * fp, char const * filename)
|
||||
{
|
||||
int ret;
|
||||
int filter = CPP_FILTER_WHITESPACE;
|
||||
int filter = CPP_FILTER_WHITESPACE | CPP_FILTER_COMMENT;
|
||||
Cpp * cpp;
|
||||
size_t i;
|
||||
size_t j;
|
||||
|
|
Loading…
Reference in New Issue
Block a user