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_NONE = 0,
|
||||||
CPP_FILTER_TRIGRAPH = 1,
|
CPP_FILTER_TRIGRAPH = 1,
|
||||||
CPP_FILTER_WHITESPACE = 2
|
CPP_FILTER_WHITESPACE = 2,
|
||||||
|
CPP_FILTER_COMMENT = 4
|
||||||
} CppFilter;
|
} CppFilter;
|
||||||
|
|
||||||
typedef enum _CppCode
|
typedef enum _CppCode
|
||||||
|
@ -101,6 +102,7 @@ typedef enum _CppCode
|
||||||
CPP_CODE_SQUOTE,
|
CPP_CODE_SQUOTE,
|
||||||
CPP_CODE_WHITESPACE,
|
CPP_CODE_WHITESPACE,
|
||||||
CPP_CODE_NEWLINE,
|
CPP_CODE_NEWLINE,
|
||||||
|
CPP_CODE_COMMENT,
|
||||||
CPP_CODE_WORD, /* FIXME numbers and keywords? */
|
CPP_CODE_WORD, /* FIXME numbers and keywords? */
|
||||||
CPP_CODE_UNKNOWN
|
CPP_CODE_UNKNOWN
|
||||||
} CppCode;
|
} 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;
|
size_t len = 0;
|
||||||
char * p;
|
char * p;
|
||||||
|
|
||||||
if(!isspace(c) || c == '\n')
|
assert(c != '\n');
|
||||||
|
if(!isspace(c))
|
||||||
return 1;
|
return 1;
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stderr, "DEBUG: %s()\n", __func__);
|
fprintf(stderr, "DEBUG: %s()\n", __func__);
|
||||||
|
@ -520,8 +521,12 @@ static int _cpp_callback_otherspace(Parser * parser, Token * token, int c,
|
||||||
/* cpp_callback_comment */
|
/* cpp_callback_comment */
|
||||||
static int _cpp_callback_comment(Parser * parser, Token * token, int c,
|
static int _cpp_callback_comment(Parser * parser, Token * token, int c,
|
||||||
void * data)
|
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 != '/')
|
if(c != '/')
|
||||||
return 1;
|
return 1;
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
@ -534,6 +539,15 @@ static int _cpp_callback_comment(Parser * parser, Token * token, int c,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
for(c = parser_scan_filter(parser); c != EOF;)
|
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 == '*')
|
||||||
{
|
{
|
||||||
if((c = parser_scan_filter(parser)) == '/')
|
if((c = parser_scan_filter(parser)) == '/')
|
||||||
|
@ -541,10 +555,24 @@ static int _cpp_callback_comment(Parser * parser, Token * token, int c,
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
c = parser_scan_filter(parser);
|
c = parser_scan_filter(parser);
|
||||||
|
}
|
||||||
if(c == EOF)
|
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_code(token, CPP_CODE_WHITESPACE);
|
||||||
token_set_string(token, " ");
|
token_set_string(token, " ");
|
||||||
|
}
|
||||||
parser_scan_filter(parser);
|
parser_scan_filter(parser);
|
||||||
return 0;
|
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_newline, cpp);
|
||||||
parser_add_callback(cpp->parser, _cpp_callback_otherspace, 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_directive, cpp);
|
||||||
parser_add_callback(cpp->parser, _cpp_callback_comma, NULL);
|
parser_add_callback(cpp->parser, _cpp_callback_comma, NULL);
|
||||||
parser_add_callback(cpp->parser, _cpp_callback_operator, 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)
|
static int _cpp_do(Prefs * prefs, FILE * fp, char const * filename)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
int filter = CPP_FILTER_WHITESPACE;
|
int filter = CPP_FILTER_WHITESPACE | CPP_FILTER_COMMENT;
|
||||||
Cpp * cpp;
|
Cpp * cpp;
|
||||||
size_t i;
|
size_t i;
|
||||||
size_t j;
|
size_t j;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user