Fixed multibyte handling logic for diff -Z (bug #1012075).
Resolves: rhbz#1012075
This commit is contained in:
parent
6911aa14f4
commit
5b4e2e345c
@ -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 <stdio.h>
|
||||
#include <unlocked-io.h>
|
||||
@ -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 <cmpbuf.h>
|
||||
#include <file-type.h>
|
||||
@ -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. */
|
||||
|
||||
|
@ -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 <twaugh@redhat.com> 3.3-4
|
||||
- Fixed multibyte handling logic for diff -Z (bug #1012075).
|
||||
|
||||
* Sat Aug 03 2013 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 3.3-3
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_20_Mass_Rebuild
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user