diff --git a/src/diff.c b/src/diff.c index 807d38f..341f57f 100644 --- a/src/diff.c +++ b/src/diff.c @@ -124,6 +124,7 @@ enum NORMAL_OPTION, SDIFF_MERGE_ASSIST_OPTION, STRIP_TRAILING_CR_OPTION, + STRIP_ANSIC_COMMENTS_OPTION, SUPPRESS_BLANK_EMPTY_OPTION, SUPPRESS_COMMON_LINES_OPTION, TABSIZE_OPTION, @@ -202,6 +203,7 @@ static struct option const longopts[] = {"speed-large-files", 0, 0, 'H'}, {"starting-file", 1, 0, 'S'}, {"strip-trailing-cr", 0, 0, STRIP_TRAILING_CR_OPTION}, + {"strip-ansic-comments", 0, 0, STRIP_ANSIC_COMMENTS_OPTION}, {"suppress-blank-empty", 0, 0, SUPPRESS_BLANK_EMPTY_OPTION}, {"suppress-common-lines", 0, 0, SUPPRESS_COMMON_LINES_OPTION}, {"tabsize", 1, 0, TABSIZE_OPTION}, @@ -575,6 +577,10 @@ main (int argc, char **argv) strip_trailing_cr = true; break; + case STRIP_ANSIC_COMMENTS_OPTION: + strip_ansic_comments = true; + break; + case SUPPRESS_BLANK_EMPTY_OPTION: suppress_blank_empty = true; break; @@ -853,6 +859,7 @@ static char const * const option_help_msgid[] = { N_("-B --ignore-blank-lines Ignore changes whose lines are all blank."), N_("-I RE --ignore-matching-lines=RE Ignore changes whose lines all match RE."), N_("--strip-trailing-cr Strip trailing carriage return on input."), + N_("--strip-ansic-comments Strip ANSI C comments on input."), #if O_BINARY N_("--binary Read and write data in binary mode."), #endif diff --git a/src/diff.h b/src/diff.h index 97f8d96..0e1769b 100644 --- a/src/diff.h +++ b/src/diff.h @@ -156,6 +156,9 @@ XTERN bool suppress_blank_empty; /* Remove trailing carriage returns from input. */ XTERN bool strip_trailing_cr; +/* Remove ANSI C comments from input. */ +XTERN bool strip_ansic_comments; + /* In directory comparison, specify file to start with (-S). This is used for resuming an aborted comparison. All file names less than this name are ignored. */ diff --git a/src/diff3.c b/src/diff3.c index 0f11fdc..a445dd5 100644 --- a/src/diff3.c +++ b/src/diff3.c @@ -139,6 +139,9 @@ static bool text; /* Remove trailing carriage returns from input. */ static bool strip_trailing_cr; +/* Remove ANSI C comments from input. */ +static bool strip_ansic_comments; + /* If nonzero, write out an ed script instead of the standard diff3 format. */ static bool edscript; diff --git a/src/io.c b/src/io.c index 031be3d..63bbb67 100644 --- a/src/io.c +++ b/src/io.c @@ -523,6 +523,46 @@ prepare_text (struct file_data *current) /* Don't use uninitialized storage when planting or using sentinels. */ memset (p + buffered, 0, sizeof (word)); + if (strip_ansic_comments && (dst = memchr (p, '/', buffered))) + { + char const *src = dst; + char const *srclim = p + buffered; + int in = 0; + + do + { + if (!in) + { + if (*src == '/') + { + if (++src >= srclim) + { + *dst++ = *src; + break; + } + + if (*src == '*') + { + src++; + in = 1; + continue; + } + else + *dst++ = '/'; + } + *dst++ = *src++; + } + else if (*src++ == '*' && *src == '/') + { + src++; + in = 0; + } + } + while (src < srclim); + + buffered -= src - dst; + } + if (strip_trailing_cr && (dst = memchr (p, '\r', buffered))) { char const *src = dst;