From 187a04704d0e1e101c261eb574426dc6b566dd23 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Tue, 13 May 2008 13:18:18 +0000 Subject: [PATCH] Added a filter for comments --- include/cpp.h | 4 +++- src/cpp.c | 40 ++++++++++++++++++++++++++++++++++------ src/main.c | 2 +- 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/include/cpp.h b/include/cpp.h index 6db6887..fae7108 100644 --- a/include/cpp.h +++ b/include/cpp.h @@ -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; diff --git a/src/cpp.c b/src/cpp.c index 8998577..077034e 100644 --- a/src/cpp.c +++ b/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; - token_set_code(token, CPP_CODE_WHITESPACE); - token_set_string(token, " "); + 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); diff --git a/src/main.c b/src/main.c index 5ff884c..8718edd 100644 --- a/src/main.c +++ b/src/main.c @@ -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;