From 5b4e2e345c500bf3137072d90f94a577593ee54b Mon Sep 17 00:00:00 2001 From: Tim Waugh Date: Oct 23 2013 11:03:47 +0000 Subject: Fixed multibyte handling logic for diff -Z (bug #1012075). Resolves: rhbz#1012075 --- diff --git a/diffutils-i18n.patch b/diffutils-i18n.patch index 8fcb66e..be365e4 100644 --- a/diffutils-i18n.patch +++ b/diffutils-i18n.patch @@ -1,6 +1,6 @@ diff -up diffutils-3.3/src/diff.c.i18n diffutils-3.3/src/diff.c --- diffutils-3.3/src/diff.c.i18n 2013-02-02 04:39:05.000000000 +0000 -+++ diffutils-3.3/src/diff.c 2013-03-26 09:40:26.213878482 +0000 ++++ diffutils-3.3/src/diff.c 2013-10-23 11:25:18.729708853 +0100 @@ -74,6 +74,8 @@ static void try_help (char const *, char static void check_stdout (void); static void usage (void); @@ -26,7 +26,7 @@ diff -up diffutils-3.3/src/diff.c.i18n diffutils-3.3/src/diff.c while ((c = getopt_long (argc, argv, shortopts, longopts, NULL)) != -1) diff -up diffutils-3.3/src/diff.h.i18n diffutils-3.3/src/diff.h --- diffutils-3.3/src/diff.h.i18n 2013-02-02 04:39:05.000000000 +0000 -+++ diffutils-3.3/src/diff.h 2013-03-26 09:42:32.941357743 +0000 ++++ diffutils-3.3/src/diff.h 2013-10-23 11:25:18.729708853 +0100 @@ -23,6 +23,17 @@ #include #include @@ -60,7 +60,7 @@ diff -up diffutils-3.3/src/diff.h.i18n diffutils-3.3/src/diff.h extern struct change *find_reverse_change (struct change *); diff -up diffutils-3.3/src/io.c.i18n diffutils-3.3/src/io.c --- diffutils-3.3/src/io.c.i18n 2013-02-02 04:39:05.000000000 +0000 -+++ diffutils-3.3/src/io.c 2013-03-26 09:40:26.215878488 +0000 ++++ diffutils-3.3/src/io.c 2013-10-23 12:03:09.155348827 +0100 @@ -23,6 +23,7 @@ #include #include @@ -98,7 +98,7 @@ diff -up diffutils-3.3/src/io.c.i18n diffutils-3.3/src/io.c static void find_and_hash_each_line (struct file_data *current) -@@ -234,12 +257,302 @@ find_and_hash_each_line (struct file_dat +@@ -234,12 +257,300 @@ find_and_hash_each_line (struct file_dat bool same_length_diff_contents_compare_anyway = diff_length_compare_anyway | ig_case; @@ -269,7 +269,7 @@ diff -up diffutils-3.3/src/io.c.i18n diffutils-3.3/src/io.c + { + if (*p1 == '\n') + { -+ p = p1; ++ p = p1 + 1; + goto hashing_done; + } + @@ -281,10 +281,10 @@ diff -up diffutils-3.3/src/io.c.i18n diffutils-3.3/src/io.c + } + + size_t repetitions = 1; ++ bool no_convert = 0; + + if (ig_white_space & IGNORE_TAB_EXPANSION) + { -+ bool flag = 0; + if (convfail) + column++; + else @@ -297,7 +297,7 @@ diff -up diffutils-3.3/src/io.c.i18n diffutils-3.3/src/io.c + case L'\t': + mbc[0] = ' '; + mblength = 1; -+ flag = 1; ++ no_convert = 1; + p++; + assert(mblength == 1); + repetitions = tabsize - column % tabsize; @@ -314,31 +314,29 @@ diff -up diffutils-3.3/src/io.c.i18n diffutils-3.3/src/io.c + column += wcwidth (wc); + break; + } ++ } + -+ if (ig_case) ++ if (ig_case) ++ { ++ lo_wc = towlower (wc); ++ if (lo_wc != wc) + { -+ lo_wc = towlower (wc); -+ if (lo_wc != wc) -+ { -+ flag = 1; -+ p += mblength; -+ memset (&state_wc, '\0', sizeof(mbstate_t)); -+ mblength = wcrtomb (mbc, lo_wc, &state_wc); ++ no_convert = 1; ++ p += mblength; ++ memset (&state_wc, '\0', sizeof(mbstate_t)); ++ mblength = wcrtomb (mbc, lo_wc, &state_wc); + -+ assert (mblength != (size_t)-1 && -+ mblength != (size_t)-2); ++ assert (mblength != (size_t)-1 && ++ mblength != (size_t)-2); + -+ mblength = (mblength < 1) ? 1 : mblength; -+ } -+ } -+ -+ if (!flag) -+ { -+ for (i = 0; i < mblength; i++) -+ mbc[i] = *p++; ++ mblength = (mblength < 1) ? 1 : mblength; + } + } + ++ if (!no_convert) ++ for (i = 0; i < mblength; i++) ++ mbc[i] = *p++; ++ + do + { + for (i = 0; i < mblength; i++) @@ -401,7 +399,7 @@ diff -up diffutils-3.3/src/io.c.i18n diffutils-3.3/src/io.c /* Hash this line until we find a newline. */ switch (ig_white_space) { -@@ -390,7 +703,7 @@ find_and_hash_each_line (struct file_dat +@@ -390,7 +701,7 @@ find_and_hash_each_line (struct file_dat else if (!diff_length_compare_anyway) continue; @@ -412,7 +410,7 @@ diff -up diffutils-3.3/src/io.c.i18n diffutils-3.3/src/io.c diff -up diffutils-3.3/src/util.c.i18n diffutils-3.3/src/util.c --- diffutils-3.3/src/util.c.i18n 2013-02-02 04:39:05.000000000 +0000 -+++ diffutils-3.3/src/util.c 2013-03-26 09:40:26.215878488 +0000 ++++ diffutils-3.3/src/util.c 2013-10-23 11:25:18.730708857 +0100 @@ -408,7 +408,8 @@ finish_output (void) Return nonzero if the lines differ. */ diff --git a/diffutils.spec b/diffutils.spec index c32e4c5..aaa1231 100644 --- a/diffutils.spec +++ b/diffutils.spec @@ -1,7 +1,7 @@ Summary: A GNU collection of diff utilities Name: diffutils Version: 3.3 -Release: 3%{?dist} +Release: 4%{?dist} Group: Applications/Text URL: http://www.gnu.org/software/diffutils/diffutils.html Source: ftp://ftp.gnu.org/gnu/diffutils/diffutils-%{version}.tar.xz @@ -75,6 +75,9 @@ rm -rf $RPM_BUILD_ROOT %{_infodir}/diffutils.info*gz %changelog +* Wed Oct 23 2013 Tim Waugh 3.3-4 +- Fixed multibyte handling logic for diff -Z (bug #1012075). + * Sat Aug 03 2013 Fedora Release Engineering - 3.3-3 - Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild