fix uniq group support in multibyte

This commit is contained in:
Ondřej Vašík 2013-12-16 17:48:21 +01:00
parent 3a87513acc
commit 8ff0950897

View File

@ -1,6 +1,6 @@
diff -urNp coreutils-8.21-orig/lib/linebuffer.h coreutils-8.21/lib/linebuffer.h
--- coreutils-8.21-orig/lib/linebuffer.h 2013-01-02 13:34:46.000000000 +0100
+++ coreutils-8.21/lib/linebuffer.h 2013-02-15 14:25:07.758469108 +0100
diff -urNp coreutils-8.22-orig/lib/linebuffer.h coreutils-8.22/lib/linebuffer.h
--- coreutils-8.22-orig/lib/linebuffer.h 2013-12-04 15:53:33.000000000 +0100
+++ coreutils-8.22/lib/linebuffer.h 2013-12-16 17:40:25.933887985 +0100
@@ -21,6 +21,11 @@
# include <stdio.h>
@ -23,9 +23,9 @@ diff -urNp coreutils-8.21-orig/lib/linebuffer.h coreutils-8.21/lib/linebuffer.h
};
/* Initialize linebuffer LINEBUFFER for use. */
diff -urNp coreutils-8.21-orig/src/cut.c coreutils-8.21/src/cut.c
--- coreutils-8.21-orig/src/cut.c 2013-02-05 00:40:31.000000000 +0100
+++ coreutils-8.21/src/cut.c 2013-02-15 14:25:07.760467982 +0100
diff -urNp coreutils-8.22-orig/src/cut.c coreutils-8.22/src/cut.c
--- coreutils-8.22-orig/src/cut.c 2013-12-04 15:48:30.000000000 +0100
+++ coreutils-8.22/src/cut.c 2013-12-16 17:40:25.935887295 +0100
@@ -28,6 +28,11 @@
#include <assert.h>
#include <getopt.h>
@ -110,7 +110,7 @@ diff -urNp coreutils-8.21-orig/src/cut.c coreutils-8.21/src/cut.c
struct range_pair
{
@@ -114,15 +178,25 @@ enum operating_mode
@@ -106,15 +169,25 @@ enum operating_mode
{
undefined_mode,
@ -137,7 +137,7 @@ diff -urNp coreutils-8.21-orig/src/cut.c coreutils-8.21/src/cut.c
/* If true do not output lines containing no delimeter characters.
Otherwise, all such lines are printed. This option is valid only
with field mode. */
@@ -134,6 +208,9 @@ static bool complement;
@@ -126,6 +199,9 @@ static bool complement;
/* The delimeter character for field mode. */
static unsigned char delim;
@ -147,7 +147,7 @@ diff -urNp coreutils-8.21-orig/src/cut.c coreutils-8.21/src/cut.c
/* True if the --output-delimiter=STRING option was specified. */
static bool output_delimiter_specified;
@@ -205,7 +282,7 @@ Print selected parts of lines from each
@@ -188,7 +264,7 @@ Print selected parts of lines from each
-f, --fields=LIST select only these fields; also print any line\n\
that contains no delimiter character, unless\n\
the -s option is specified\n\
@ -156,7 +156,7 @@ diff -urNp coreutils-8.21-orig/src/cut.c coreutils-8.21/src/cut.c
"), stdout);
fputs (_("\
--complement complement the set of selected bytes, characters\n\
@@ -480,6 +557,9 @@ set_fields (const char *fieldstr)
@@ -381,6 +457,9 @@ set_fields (const char *fieldstr)
if (operating_mode == byte_mode)
error (0, 0,
_("byte offset %s is too large"), quote (bad_num));
@ -449,7 +449,7 @@ diff -urNp coreutils-8.21-orig/src/cut.c coreutils-8.21/src/cut.c
}
/* Process file FILE to standard output.
@@ -767,6 +1100,8 @@ main (int argc, char **argv)
@@ -687,6 +1025,8 @@ main (int argc, char **argv)
bool ok;
bool delim_specified = false;
char *spec_list_string IF_LINT ( = NULL);
@ -458,7 +458,7 @@ diff -urNp coreutils-8.21-orig/src/cut.c coreutils-8.21/src/cut.c
initialize_main (&argc, &argv);
set_program_name (argv[0]);
@@ -789,7 +1124,6 @@ main (int argc, char **argv)
@@ -709,7 +1049,6 @@ main (int argc, char **argv)
switch (optc)
{
case 'b':
@ -466,7 +466,7 @@ diff -urNp coreutils-8.21-orig/src/cut.c coreutils-8.21/src/cut.c
/* Build the byte list. */
if (operating_mode != undefined_mode)
FATAL_ERROR (_("only one type of list may be specified"));
@@ -797,6 +1131,14 @@ main (int argc, char **argv)
@@ -717,6 +1056,14 @@ main (int argc, char **argv)
spec_list_string = optarg;
break;
@ -481,7 +481,7 @@ diff -urNp coreutils-8.21-orig/src/cut.c coreutils-8.21/src/cut.c
case 'f':
/* Build the field list. */
if (operating_mode != undefined_mode)
@@ -808,10 +1150,36 @@ main (int argc, char **argv)
@@ -728,10 +1075,36 @@ main (int argc, char **argv)
case 'd':
/* New delimiter. */
/* Interpret -d '' to mean 'use the NUL byte as the delimiter.' */
@ -522,7 +522,7 @@ diff -urNp coreutils-8.21-orig/src/cut.c coreutils-8.21/src/cut.c
break;
case OUTPUT_DELIMITER_OPTION:
@@ -824,6 +1191,7 @@ main (int argc, char **argv)
@@ -744,6 +1117,7 @@ main (int argc, char **argv)
break;
case 'n':
@ -530,7 +530,7 @@ diff -urNp coreutils-8.21-orig/src/cut.c coreutils-8.21/src/cut.c
break;
case 's':
@@ -873,15 +1241,34 @@ main (int argc, char **argv)
@@ -783,15 +1157,34 @@ main (int argc, char **argv)
}
if (!delim_specified)
@ -571,9 +571,9 @@ diff -urNp coreutils-8.21-orig/src/cut.c coreutils-8.21/src/cut.c
}
if (optind == argc)
diff -urNp coreutils-8.21-orig/src/expand.c coreutils-8.21/src/expand.c
--- coreutils-8.21-orig/src/expand.c 2013-01-31 01:46:24.000000000 +0100
+++ coreutils-8.21/src/expand.c 2013-02-15 14:25:07.774467536 +0100
diff -urNp coreutils-8.22-orig/src/expand.c coreutils-8.22/src/expand.c
--- coreutils-8.22-orig/src/expand.c 2013-12-04 15:48:30.000000000 +0100
+++ coreutils-8.22/src/expand.c 2013-12-16 17:40:25.936886952 +0100
@@ -37,12 +37,29 @@
#include <stdio.h>
#include <getopt.h>
@ -761,9 +761,9 @@ diff -urNp coreutils-8.21-orig/src/expand.c coreutils-8.21/src/expand.c
if (have_read_stdin && fclose (stdin) != 0)
error (EXIT_FAILURE, errno, "-");
diff -urNp coreutils-8.21-orig/src/fold.c coreutils-8.21/src/fold.c
--- coreutils-8.21-orig/src/fold.c 2013-01-31 01:46:24.000000000 +0100
+++ coreutils-8.21/src/fold.c 2013-02-15 14:25:07.789467891 +0100
diff -urNp coreutils-8.22-orig/src/fold.c coreutils-8.22/src/fold.c
--- coreutils-8.22-orig/src/fold.c 2013-12-04 15:48:30.000000000 +0100
+++ coreutils-8.22/src/fold.c 2013-12-16 17:40:25.938886274 +0100
@@ -22,12 +22,34 @@
#include <getopt.h>
#include <sys/types.h>
@ -1161,9 +1161,9 @@ diff -urNp coreutils-8.21-orig/src/fold.c coreutils-8.21/src/fold.c
break;
case 's': /* Break at word boundaries. */
diff -urNp coreutils-8.21-orig/src/join.c coreutils-8.21/src/join.c
--- coreutils-8.21-orig/src/join.c 2013-01-31 01:46:24.000000000 +0100
+++ coreutils-8.21/src/join.c 2013-02-15 14:25:07.804467922 +0100
diff -urNp coreutils-8.22-orig/src/join.c coreutils-8.22/src/join.c
--- coreutils-8.22-orig/src/join.c 2013-12-04 15:48:30.000000000 +0100
+++ coreutils-8.22/src/join.c 2013-12-16 17:40:25.940885607 +0100
@@ -22,18 +22,32 @@
#include <sys/types.h>
#include <getopt.h>
@ -1215,7 +1215,7 @@ diff -urNp coreutils-8.21-orig/src/join.c coreutils-8.21/src/join.c
/* If nonzero, check that the input is correctly ordered. */
static enum
@@ -262,13 +278,14 @@ xfields (struct line *line)
@@ -269,13 +285,14 @@ xfields (struct line *line)
if (ptr == lim)
return;
@ -1233,7 +1233,7 @@ diff -urNp coreutils-8.21-orig/src/join.c coreutils-8.21/src/join.c
{
/* Skip leading blanks before the first field. */
while (isblank (to_uchar (*ptr)))
@@ -292,6 +309,148 @@ xfields (struct line *line)
@@ -299,6 +316,148 @@ xfields (struct line *line)
extract_field (line, ptr, lim - ptr);
}
@ -1382,7 +1382,7 @@ diff -urNp coreutils-8.21-orig/src/join.c coreutils-8.21/src/join.c
static void
freeline (struct line *line)
{
@@ -313,56 +472,130 @@ keycmp (struct line const *line1, struct
@@ -320,56 +479,130 @@ keycmp (struct line const *line1, struct
size_t jf_1, size_t jf_2)
{
/* Start of field to compare in each file. */
@ -1536,7 +1536,7 @@ diff -urNp coreutils-8.21-orig/src/join.c coreutils-8.21/src/join.c
}
/* Check that successive input lines PREV and CURRENT from input file
@@ -454,6 +687,11 @@ get_line (FILE *fp, struct line **linep,
@@ -461,6 +694,11 @@ get_line (FILE *fp, struct line **linep,
}
++line_no[which - 1];
@ -1548,7 +1548,7 @@ diff -urNp coreutils-8.21-orig/src/join.c coreutils-8.21/src/join.c
xfields (line);
if (prevline[which - 1])
@@ -553,21 +791,28 @@ prfield (size_t n, struct line const *li
@@ -560,21 +798,28 @@ prfield (size_t n, struct line const *li
/* Output all the fields in line, other than the join field. */
@ -1580,7 +1580,7 @@ diff -urNp coreutils-8.21-orig/src/join.c coreutils-8.21/src/join.c
prfield (i, line);
}
}
@@ -578,7 +823,6 @@ static void
@@ -585,7 +830,6 @@ static void
prjoin (struct line const *line1, struct line const *line2)
{
const struct outlist *outlist;
@ -1588,7 +1588,7 @@ diff -urNp coreutils-8.21-orig/src/join.c coreutils-8.21/src/join.c
size_t field;
struct line const *line;
@@ -612,7 +856,7 @@ prjoin (struct line const *line1, struct
@@ -619,7 +863,7 @@ prjoin (struct line const *line1, struct
o = o->next;
if (o == NULL)
break;
@ -1597,7 +1597,7 @@ diff -urNp coreutils-8.21-orig/src/join.c coreutils-8.21/src/join.c
}
putchar (eolchar);
}
@@ -1090,21 +1334,46 @@ main (int argc, char **argv)
@@ -1097,21 +1341,46 @@ main (int argc, char **argv)
case 't':
{
@ -1654,9 +1654,9 @@ diff -urNp coreutils-8.21-orig/src/join.c coreutils-8.21/src/join.c
break;
case 'z':
diff -urNp coreutils-8.21-orig/src/pr.c coreutils-8.21/src/pr.c
--- coreutils-8.21-orig/src/pr.c 2013-01-31 01:46:24.000000000 +0100
+++ coreutils-8.21/src/pr.c 2013-02-15 14:25:07.819467936 +0100
diff -urNp coreutils-8.22-orig/src/pr.c coreutils-8.22/src/pr.c
--- coreutils-8.22-orig/src/pr.c 2013-12-04 15:48:30.000000000 +0100
+++ coreutils-8.22/src/pr.c 2013-12-16 17:40:25.944884263 +0100
@@ -312,6 +312,32 @@
#include <getopt.h>
@ -2410,9 +2410,9 @@ diff -urNp coreutils-8.21-orig/src/pr.c coreutils-8.21/src/pr.c
/* We've just printed some files and need to clean up things before
looking for more options and printing the next batch of files.
diff -urNp coreutils-8.21-orig/src/sort.c coreutils-8.21/src/sort.c
--- coreutils-8.21-orig/src/sort.c 2013-08-14 18:14:06.172216606 +0200
+++ coreutils-8.21/src/sort.c 2013-08-14 18:13:30.295247905 +0200
diff -urNp coreutils-8.22-orig/src/sort.c coreutils-8.22/src/sort.c
--- coreutils-8.22-orig/src/sort.c 2013-12-04 15:48:30.000000000 +0100
+++ coreutils-8.22/src/sort.c 2013-12-16 17:40:25.949882582 +0100
@@ -29,6 +29,14 @@
#include <sys/wait.h>
#include <signal.h>
@ -2432,8 +2432,8 @@ diff -urNp coreutils-8.21-orig/src/sort.c coreutils-8.21/src/sort.c
/* Nonzero if the corresponding locales are hard. */
static bool hard_LC_COLLATE;
+#if HAVE_LANGINFO_CODESET
-#if HAVE_NL_LANGINFO
+#if HAVE_LANGINFO_CODESET
static bool hard_LC_TIME;
#endif
@ -2468,20 +2468,20 @@ diff -urNp coreutils-8.21-orig/src/sort.c coreutils-8.21/src/sort.c
they were read if all keys compare equal. */
static bool stable;
+/* Tab character separating fields. If tab_length is 0, then fields are
-/* If TAB has this value, blanks separate fields. */
-enum { TAB_DEFAULT = CHAR_MAX + 1 };
-
-/* Tab character separating fields. If TAB_DEFAULT, then fields are
+/* Tab character separating fields. If tab_length is 0, then fields are
separated by the empty string between a non-blank character and a blank
character. */
-static int tab = TAB_DEFAULT;
+static char tab[MB_LEN_MAX + 1];
+static size_t tab_length = 0;
-static int tab = TAB_DEFAULT;
/* Flag to remove consecutive duplicate lines from the output.
Only the last of a sequence of equal lines will be output. */
@@ -783,6 +811,46 @@ reap_all (void)
@@ -811,6 +839,46 @@ reap_all (void)
reap (-1);
}
@ -2528,34 +2528,34 @@ diff -urNp coreutils-8.21-orig/src/sort.c coreutils-8.21/src/sort.c
/* Clean up any remaining temporary files. */
static void
@@ -1223,7 +1291,7 @@ zaptemp (char const *name)
@@ -1255,7 +1323,7 @@ zaptemp (char const *name)
free (node);
}
+#if HAVE_LANGINFO_CODESET
-#if HAVE_NL_LANGINFO
+#if HAVE_LANGINFO_CODESET
static int
struct_month_cmp (void const *m1, void const *m2)
@@ -1238,7 +1306,7 @@ struct_month_cmp (void const *m1, void c
@@ -1270,7 +1338,7 @@ struct_month_cmp (void const *m1, void c
/* Initialize the character class tables. */
static void
+inittables_uni (void)
-inittables (void)
+inittables_uni (void)
{
size_t i;
@@ -1250,7 +1318,7 @@ inittables_uni (void)
@@ -1282,7 +1350,7 @@ inittables (void)
fold_toupper[i] = toupper (i);
}
+#if HAVE_LANGINFO_CODESET
-#if HAVE_NL_LANGINFO
+#if HAVE_LANGINFO_CODESET
/* If we're not in the "C" locale, read different names for months. */
if (hard_LC_TIME)
{
@@ -1332,6 +1400,84 @@ specify_nmerge (int oi, char c, char con
@@ -1364,6 +1432,84 @@ specify_nmerge (int oi, char c, char con
xstrtol_fatal (e, oi, c, long_options, s);
}
@ -2640,29 +2640,29 @@ diff -urNp coreutils-8.21-orig/src/sort.c coreutils-8.21/src/sort.c
/* Specify the amount of main memory to use when sorting. */
static void
specify_sort_size (int oi, char c, char const *s)
@@ -1564,7 +1710,7 @@ buffer_linelim (struct buffer const *buf
@@ -1597,7 +1743,7 @@ buffer_linelim (struct buffer const *buf
by KEY in LINE. */
static char *
+begfield_uni (const struct line *line, const struct keyfield *key)
-begfield (struct line const *line, struct keyfield const *key)
+begfield_uni (const struct line *line, const struct keyfield *key)
{
char *ptr = line->text, *lim = ptr + line->length - 1;
size_t sword = key->sword;
@@ -1573,10 +1719,10 @@ begfield_uni (const struct line *line, c
@@ -1606,10 +1752,10 @@ begfield (struct line const *line, struc
/* The leading field separator itself is included in a field when -t
is absent. */
+ if (tab_length)
- if (tab != TAB_DEFAULT)
+ if (tab_length)
while (ptr < lim && sword--)
{
+ while (ptr < lim && *ptr != tab[0])
- while (ptr < lim && *ptr != tab)
+ while (ptr < lim && *ptr != tab[0])
++ptr;
if (ptr < lim)
++ptr;
@@ -1602,11 +1748,70 @@ begfield_uni (const struct line *line, c
@@ -1635,11 +1781,70 @@ begfield (struct line const *line, struc
return ptr;
}
@ -2729,38 +2729,38 @@ diff -urNp coreutils-8.21-orig/src/sort.c coreutils-8.21/src/sort.c
in LINE specified by KEY. */
static char *
+limfield_uni (const struct line *line, const struct keyfield *key)
-limfield (struct line const *line, struct keyfield const *key)
+limfield_uni (const struct line *line, const struct keyfield *key)
{
char *ptr = line->text, *lim = ptr + line->length - 1;
size_t eword = key->eword, echar = key->echar;
@@ -1621,10 +1826,10 @@ limfield_uni (const struct line *line, c
@@ -1654,10 +1859,10 @@ limfield (struct line const *line, struc
'beginning' is the first character following the delimiting TAB.
Otherwise, leave PTR pointing at the first 'blank' character after
the preceding field. */
+ if (tab_length)
- if (tab != TAB_DEFAULT)
+ if (tab_length)
while (ptr < lim && eword--)
{
+ while (ptr < lim && *ptr != tab[0])
- while (ptr < lim && *ptr != tab)
+ while (ptr < lim && *ptr != tab[0])
++ptr;
if (ptr < lim && (eword || echar))
++ptr;
@@ -1670,10 +1875,10 @@ limfield_uni (const struct line *line, c
@@ -1703,10 +1908,10 @@ limfield (struct line const *line, struc
*/
/* Make LIM point to the end of (one byte past) the current field. */
+ if (tab_length)
- if (tab != TAB_DEFAULT)
+ if (tab_length)
{
char *newlim;
+ newlim = memchr (ptr, tab[0], lim - ptr);
- newlim = memchr (ptr, tab, lim - ptr);
+ newlim = memchr (ptr, tab[0], lim - ptr);
if (newlim)
lim = newlim;
}
@@ -1704,6 +1909,130 @@ limfield_uni (const struct line *line, c
@@ -1737,6 +1942,130 @@ limfield (struct line const *line, struc
return ptr;
}
@ -2891,10 +2891,12 @@ diff -urNp coreutils-8.21-orig/src/sort.c coreutils-8.21/src/sort.c
/* Fill BUF reading from FP, moving buf->left bytes from the end
of buf->buf to the beginning first. If EOF is reached and the
file wasn't terminated by a newline, supply one. Set up BUF's line
@@ -1790,8 +2119,22 @@ fillbuf (struct buffer *buf, FILE *fp, c
@@ -1823,8 +2152,22 @@ fillbuf (struct buffer *buf, FILE *fp, c
else
{
if (key->skipsblanks)
- while (blanks[to_uchar (*line_start)])
- line_start++;
+ {
+#if HAVE_MBRTOWC
+ if (MB_CUR_MAX > 1)
@ -2911,21 +2913,19 @@ diff -urNp coreutils-8.21-orig/src/sort.c coreutils-8.21/src/sort.c
+ while (blanks[to_uchar (*line_start)])
+ line_start++;
+ }
- while (blanks[to_uchar (*line_start)])
- line_start++;
line->keybeg = line_start;
}
}
@@ -1912,7 +2255,7 @@ human_numcompare (char const *a, char co
@@ -1945,7 +2288,7 @@ human_numcompare (char const *a, char co
hideously fast. */
static int
+numcompare_uni (const char *a, const char *b)
-numcompare (char const *a, char const *b)
+numcompare_uni (const char *a, const char *b)
{
while (blanks[to_uchar (*a)])
a++;
@@ -1922,6 +2265,25 @@ numcompare_uni (const char *a, const cha
@@ -1955,6 +2298,25 @@ numcompare (char const *a, char const *b
return strnumcmp (a, b, decimal_point, thousands_sep);
}
@ -2951,43 +2951,43 @@ diff -urNp coreutils-8.21-orig/src/sort.c coreutils-8.21/src/sort.c
/* Work around a problem whereby the long double value returned by glibc's
strtold ("NaN", ...) contains uninitialized bits: clear all bytes of
A and B before calling strtold. FIXME: remove this function once
@@ -1972,7 +2334,7 @@ general_numcompare (char const *sa, char
@@ -2005,7 +2367,7 @@ general_numcompare (char const *sa, char
Return 0 if the name in S is not recognized. */
static int
+getmonth_uni (char const *month, size_t len, char **ea)
-getmonth (char const *month, char **ea)
+getmonth_uni (char const *month, size_t len, char **ea)
{
size_t lo = 0;
size_t hi = MONTHS_PER_YEAR;
@@ -2247,15 +2609,14 @@ debug_key (struct line const *line, stru
@@ -2280,15 +2642,14 @@ debug_key (struct line const *line, stru
char saved = *lim;
*lim = '\0';
+ skipblanks (&beg, lim);
- while (blanks[to_uchar (*beg)])
- beg++;
+ skipblanks (&beg, lim);
char *tighter_lim = beg;
if (lim < beg)
tighter_lim = lim;
else if (key->month)
+ getmonth (beg, lim-beg, &tighter_lim);
- getmonth (beg, &tighter_lim);
+ getmonth (beg, lim-beg, &tighter_lim);
else if (key->general_numeric)
ignore_value (strtold (beg, &tighter_lim));
else if (key->numeric || key->human_numeric)
@@ -2399,7 +2760,7 @@ key_warnings (struct keyfield const *gke
@@ -2432,7 +2793,7 @@ key_warnings (struct keyfield const *gke
bool maybe_space_aligned = !hard_LC_COLLATE && default_key_compare (key)
&& !(key->schar || key->echar);
bool line_offset = key->eword == 0 && key->echar != 0; /* -k1.x,1.y */
+ if (!gkey_only && !tab_length && !line_offset
- if (!gkey_only && tab == TAB_DEFAULT && !line_offset
+ if (!gkey_only && !tab_length && !line_offset
&& ((!key->skipsblanks && !(implicit_skip || maybe_space_aligned))
|| (!key->skipsblanks && key->schar)
|| (!key->skipeblanks && key->echar)))
@@ -2457,11 +2818,87 @@ key_warnings (struct keyfield const *gke
@@ -2490,11 +2851,87 @@ key_warnings (struct keyfield const *gke
error (0, 0, _("option '-r' only applies to last-resort comparison"));
}
@ -3071,21 +3071,21 @@ diff -urNp coreutils-8.21-orig/src/sort.c coreutils-8.21/src/sort.c
are no more keys or a difference is found. */
static int
+keycompare_uni (const struct line *a, const struct line *b)
-keycompare (struct line const *a, struct line const *b)
+keycompare_uni (const struct line *a, const struct line *b)
{
struct keyfield *key = keylist;
@@ -2546,7 +2983,7 @@ keycompare_uni (const struct line *a, co
@@ -2579,7 +3016,7 @@ keycompare (struct line const *a, struct
else if (key->human_numeric)
diff = human_numcompare (ta, tb);
else if (key->month)
+ diff = getmonth (ta, tlena, NULL) - getmonth (tb, tlenb, NULL);
- diff = getmonth (ta, NULL) - getmonth (tb, NULL);
+ diff = getmonth (ta, tlena, NULL) - getmonth (tb, tlenb, NULL);
else if (key->random)
diff = compare_random (ta, tlena, tb, tlenb);
else if (key->version)
@@ -2662,6 +3099,191 @@ keycompare_uni (const struct line *a, co
@@ -2695,6 +3132,191 @@ keycompare (struct line const *a, struct
return key->reverse ? -diff : diff;
}
@ -3277,7 +3277,7 @@ diff -urNp coreutils-8.21-orig/src/sort.c coreutils-8.21/src/sort.c
/* Compare two lines A and B, returning negative, zero, or positive
depending on whether A compares less than, equal to, or greater than B. */
@@ -2689,14 +3311,6 @@ compare (struct line const *a, struct li
@@ -2722,14 +3344,6 @@ compare (struct line const *a, struct li
diff = - NONZERO (blen);
else if (blen == 0)
diff = 1;
@ -3292,16 +3292,16 @@ diff -urNp coreutils-8.21-orig/src/sort.c coreutils-8.21/src/sort.c
else if (! (diff = memcmp (a->text, b->text, MIN (alen, blen))))
diff = alen < blen ? -1 : alen != blen;
@@ -4157,7 +4771,7 @@ main (int argc, char **argv)
@@ -4190,7 +4804,7 @@ main (int argc, char **argv)
initialize_exit_failure (SORT_FAILURE);
hard_LC_COLLATE = hard_locale (LC_COLLATE);
+#if HAVE_LANGINFO_CODESET
-#if HAVE_NL_LANGINFO
+#if HAVE_LANGINFO_CODESET
hard_LC_TIME = hard_locale (LC_TIME);
#endif
@@ -4178,6 +4792,29 @@ main (int argc, char **argv)
@@ -4211,6 +4825,29 @@ main (int argc, char **argv)
thousands_sep = -1;
}
@ -3331,17 +3331,18 @@ diff -urNp coreutils-8.21-orig/src/sort.c coreutils-8.21/src/sort.c
have_read_stdin = false;
inittables ();
@@ -4452,13 +5089,34 @@ main (int argc, char **argv)
@@ -4485,13 +5122,34 @@ main (int argc, char **argv)
case 't':
{
- char newtab = optarg[0];
- if (! newtab)
+ char newtab[MB_LEN_MAX + 1];
+ size_t newtab_length = 1;
+ strncpy (newtab, optarg, MB_LEN_MAX);
+ if (! newtab[0])
- char newtab = optarg[0];
- if (! newtab)
error (SORT_FAILURE, 0, _("empty tab"));
- if (optarg[1])
+#if HAVE_MBRTOWC
+ if (MB_CUR_MAX > 1)
+ {
@ -3362,32 +3363,31 @@ diff -urNp coreutils-8.21-orig/src/sort.c coreutils-8.21/src/sort.c
+ }
+#endif
+ if (newtab_length == 1 && optarg[1])
- if (optarg[1])
{
if (STREQ (optarg, "\\0"))
+ newtab[0] = '\0';
- newtab = '\0';
+ newtab[0] = '\0';
else
{
/* Provoke with 'sort -txx'. Complain about
@@ -4469,9 +5127,12 @@ main (int argc, char **argv)
@@ -4502,9 +5160,12 @@ main (int argc, char **argv)
quote (optarg));
}
}
- if (tab != TAB_DEFAULT && tab != newtab)
+ if (tab_length
+ && (tab_length != newtab_length
+ || memcmp (tab, newtab, tab_length) != 0))
- if (tab != TAB_DEFAULT && tab != newtab)
error (SORT_FAILURE, 0, _("incompatible tabs"));
- tab = newtab;
+ memcpy (tab, newtab, newtab_length);
+ tab_length = newtab_length;
- tab = newtab;
}
break;
diff -urNp coreutils-8.21-orig/src/unexpand.c coreutils-8.21/src/unexpand.c
--- coreutils-8.21-orig/src/unexpand.c 2013-01-31 01:46:24.000000000 +0100
+++ coreutils-8.21/src/unexpand.c 2013-02-15 14:25:07.834467715 +0100
diff -urNp coreutils-8.22-orig/src/unexpand.c coreutils-8.22/src/unexpand.c
--- coreutils-8.22-orig/src/unexpand.c 2013-12-04 15:48:30.000000000 +0100
+++ coreutils-8.22/src/unexpand.c 2013-12-16 17:40:25.951881910 +0100
@@ -38,12 +38,29 @@
#include <stdio.h>
#include <getopt.h>
@ -3629,7 +3629,7 @@ diff -urNp coreutils-8.21-orig/src/unexpand.c coreutils-8.21/src/unexpand.c
void
usage (int status)
{
@@ -523,7 +742,12 @@ main (int argc, char **argv)
@@ -523,7 +744,12 @@ main (int argc, char **argv)
file_list = (optind < argc ? &argv[optind] : stdin_argv);
@ -3643,9 +3643,9 @@ diff -urNp coreutils-8.21-orig/src/unexpand.c coreutils-8.21/src/unexpand.c
if (have_read_stdin && fclose (stdin) != 0)
error (EXIT_FAILURE, errno, "-");
diff -urNp coreutils-8.21-orig/src/uniq.c coreutils-8.21/src/uniq.c
--- coreutils-8.21-orig/src/uniq.c 2013-01-31 01:46:24.000000000 +0100
+++ coreutils-8.21/src/uniq.c 2013-02-15 14:25:07.839467991 +0100
diff -urNp coreutils-8.22-orig/src/uniq.c coreutils-8.22/src/uniq.c
--- coreutils-8.22-orig/src/uniq.c 2013-12-04 15:48:30.000000000 +0100
+++ coreutils-8.22/src/uniq.c 2013-12-16 17:41:06.711697074 +0100
@@ -21,6 +21,16 @@
#include <getopt.h>
#include <sys/types.h>
@ -3684,7 +3684,7 @@ diff -urNp coreutils-8.21-orig/src/uniq.c coreutils-8.21/src/uniq.c
/* The official name of this program (e.g., no 'g' prefix). */
#define PROGRAM_NAME "uniq"
@@ -108,6 +130,10 @@
@@ -143,6 +165,10 @@ enum
GROUP_OPTION = CHAR_MAX + 1
};
@ -3695,7 +3695,7 @@ diff -urNp coreutils-8.21-orig/src/uniq.c coreutils-8.21/src/uniq.c
static struct option const longopts[] =
{
{"count", no_argument, NULL, 'c'},
@@ -205,7 +231,7 @@ size_opt (char const *opt, char const *m
@@ -249,7 +275,7 @@ size_opt (char const *opt, char const *m
return a pointer to the beginning of the line's field to be compared. */
static char * _GL_ATTRIBUTE_PURE
@ -3704,7 +3704,7 @@ diff -urNp coreutils-8.21-orig/src/uniq.c coreutils-8.21/src/uniq.c
{
size_t count;
char const *lp = line->buffer;
@@ -225,6 +251,83 @@ find_field (struct linebuffer const *lin
@@ -269,6 +295,83 @@ find_field (struct linebuffer const *lin
return line->buffer + i;
}
@ -3788,7 +3788,7 @@ diff -urNp coreutils-8.21-orig/src/uniq.c coreutils-8.21/src/uniq.c
/* Return false if two strings OLD and NEW match, true if not.
OLD and NEW point not to the beginnings of the lines
but rather to the beginnings of the fields to compare.
@@ -233,6 +336,8 @@ find_field (struct linebuffer const *lin
@@ -277,6 +380,8 @@ find_field (struct linebuffer const *lin
static bool
different (char *old, char *new, size_t oldlen, size_t newlen)
{
@ -3797,7 +3797,7 @@ diff -urNp coreutils-8.21-orig/src/uniq.c coreutils-8.21/src/uniq.c
if (check_chars < oldlen)
oldlen = check_chars;
if (check_chars < newlen)
@@ -240,14 +345,100 @@ different (char *old, char *new, size_t
@@ -284,14 +389,100 @@ different (char *old, char *new, size_t
if (ignore_case)
{
@ -3903,7 +3903,7 @@ diff -urNp coreutils-8.21-orig/src/uniq.c coreutils-8.21/src/uniq.c
/* Output the line in linebuffer LINE to standard output
provided that the switches say it should be output.
@@ -303,18 +494,45 @@ check_file (const char *infile, const ch
@@ -356,18 +547,55 @@ check_file (const char *infile, const ch
char *prevfield IF_LINT ( = NULL);
size_t prevlen IF_LINT ( = 0);
bool first_group_printed = false;
@ -3932,8 +3932,16 @@ diff -urNp coreutils-8.21-orig/src/uniq.c coreutils-8.21/src/uniq.c
+ {
+ thisstate = thisline->state;
+
+ if (prevline->length == 0 || different_multi
+ (thisfield, prevfield, thislen, prevlen, thisstate, prevstate))
+ new_group = (prevline->length == 0 || different_multi
+ (thisfield, prevfield, thislen, prevlen, thisstate, prevstate));
+
+ if (new_group && grouping != GM_NONE
+ && (grouping == GM_PREPEND || grouping == GM_BOTH
+ || (first_group_printed && (grouping == GM_APPEND
+ || grouping == GM_SEPARATE))))
+ putchar (delimiter);
+
+ if (new_group || grouping != GM_NONE)
+ {
+ fwrite (thisline->buffer, sizeof (char),
+ thisline->length, stdout);
@ -3942,14 +3950,35 @@ diff -urNp coreutils-8.21-orig/src/uniq.c coreutils-8.21/src/uniq.c
+ prevfield = thisfield;
+ prevlen = thislen;
+ prevstate = thisstate;
+ first_group_printed = true;
+ }
+ }
+ else
+ {
+#endif
new_group = (prevline->length == 0
|| different (thisfield, prevfield, thislen, prevlen));
@@ -330,17 +549,26 @@ check_file (const char *infile, const ch
@@ -376,7 +604,7 @@ check_file (const char *infile, const ch
&& (grouping == GM_PREPEND || grouping == GM_BOTH
|| (first_group_printed && (grouping == GM_APPEND
|| grouping == GM_SEPARATE))))
- putchar (delimiter);
+ putchar (delimiter);
if (new_group || grouping != GM_NONE)
{
@@ -388,6 +616,9 @@ check_file (const char *infile, const ch
prevlen = thislen;
first_group_printed = true;
}
+#if HAVE_MBRTOWC
+ }
+#endif
}
if ((grouping == GM_BOTH || grouping == GM_APPEND) && first_group_printed)
putchar (delimiter);
@@ -398,17 +629,26 @@ check_file (const char *infile, const ch
size_t prevlen;
uintmax_t match_count = 0;
bool first_delimiter = true;
@ -3976,7 +4005,7 @@ diff -urNp coreutils-8.21-orig/src/uniq.c coreutils-8.21/src/uniq.c
if (readlinebuffer_delim (thisline, stdin, delimiter) == 0)
{
if (ferror (stdin))
@@ -349,6 +577,14 @@ check_file (const char *infile, const ch
@@ -417,6 +657,14 @@ check_file (const char *infile, const ch
}
thisfield = find_field (thisline);
thislen = thisline->length - 1 - (thisfield - thisline->buffer);
@ -3991,7 +4020,7 @@ diff -urNp coreutils-8.21-orig/src/uniq.c coreutils-8.21/src/uniq.c
match = !different (thisfield, prevfield, thislen, prevlen);
match_count += match;
@@ -381,6 +617,9 @@ check_file (const char *infile, const ch
@@ -449,6 +697,9 @@ check_file (const char *infile, const ch
SWAP_LINES (prevline, thisline);
prevfield = thisfield;
prevlen = thislen;
@ -4001,7 +4030,7 @@ diff -urNp coreutils-8.21-orig/src/uniq.c coreutils-8.21/src/uniq.c
if (!match)
match_count = 0;
}
@@ -426,6 +665,19 @@ main (int argc, char **argv)
@@ -495,6 +746,19 @@ main (int argc, char **argv)
atexit (close_stdout);
@ -4021,10 +4050,10 @@ diff -urNp coreutils-8.21-orig/src/uniq.c coreutils-8.21/src/uniq.c
skip_chars = 0;
skip_fields = 0;
check_chars = SIZE_MAX;
diff -urNp coreutils-8.21-orig/tests/local.mk coreutils-8.21/tests/local.mk
--- coreutils-8.21-orig/tests/local.mk 2013-02-15 14:24:32.645654553 +0100
+++ coreutils-8.21/tests/local.mk 2013-02-15 14:25:07.873467648 +0100
@@ -325,6 +325,7 @@ all_tests = \
diff -urNp coreutils-8.22-orig/tests/local.mk coreutils-8.22/tests/local.mk
--- coreutils-8.22-orig/tests/local.mk 2013-12-16 17:39:49.187181544 +0100
+++ coreutils-8.22/tests/local.mk 2013-12-16 17:40:25.955880566 +0100
@@ -324,6 +324,7 @@ all_tests = \
tests/misc/sort-discrim.sh \
tests/misc/sort-files0-from.pl \
tests/misc/sort-float.sh \
@ -4032,9 +4061,9 @@ diff -urNp coreutils-8.21-orig/tests/local.mk coreutils-8.21/tests/local.mk
tests/misc/sort-merge.pl \
tests/misc/sort-merge-fdlimit.sh \
tests/misc/sort-month.sh \
diff -urNp coreutils-8.21-orig/tests/misc/cut.pl coreutils-8.21/tests/misc/cut.pl
--- coreutils-8.21-orig/tests/misc/cut.pl 2013-02-05 00:40:31.000000000 +0100
+++ coreutils-8.21/tests/misc/cut.pl 2013-11-27 19:47:58.430539269 +0100
diff -urNp coreutils-8.22-orig/tests/misc/cut.pl coreutils-8.22/tests/misc/cut.pl
--- coreutils-8.22-orig/tests/misc/cut.pl 2013-12-04 15:48:30.000000000 +0100
+++ coreutils-8.22/tests/misc/cut.pl 2013-12-16 17:40:25.956880230 +0100
@@ -23,9 +23,11 @@ use strict;
# Turn off localization of executable's output.
@ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3;
@ -4049,7 +4078,7 @@ diff -urNp coreutils-8.21-orig/tests/misc/cut.pl coreutils-8.21/tests/misc/cut.p
my $prog = 'cut';
my $try = "Try '$prog --help' for more information.\n";
@@ -224,6 +226,7 @@
@@ -225,6 +227,7 @@ if ($mb_locale ne 'C')
my @new_t = @$t;
my $test_name = shift @new_t;
@ -4057,9 +4086,9 @@ diff -urNp coreutils-8.21-orig/tests/misc/cut.pl coreutils-8.21/tests/misc/cut.p
push @new, ["$test_name-mb", @new_t, {ENV => "LC_ALL=$mb_locale"}];
}
push @Tests, @new;
diff -urNp coreutils-8.21-orig/tests/misc/expand.pl coreutils-8.21/tests/misc/expand.pl
--- coreutils-8.21-orig/tests/misc/expand.pl 2013-01-31 01:46:24.000000000 +0100
+++ coreutils-8.21/tests/misc/expand.pl 2013-11-27 19:47:58.431538769 +0100
diff -urNp coreutils-8.22-orig/tests/misc/expand.pl coreutils-8.22/tests/misc/expand.pl
--- coreutils-8.22-orig/tests/misc/expand.pl 2013-12-04 15:48:30.000000000 +0100
+++ coreutils-8.22/tests/misc/expand.pl 2013-12-16 17:40:25.957879894 +0100
@@ -23,6 +23,15 @@ use strict;
# Turn off localization of executable's output.
@ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3;
@ -4114,9 +4143,9 @@ diff -urNp coreutils-8.21-orig/tests/misc/expand.pl coreutils-8.21/tests/misc/ex
my $save_temps = $ENV{DEBUG};
my $verbose = $ENV{VERBOSE};
diff -urNp coreutils-8.21-orig/tests/misc/fold.pl coreutils-8.21/tests/misc/fold.pl
--- coreutils-8.21-orig/tests/misc/fold.pl 2013-01-31 01:46:24.000000000 +0100
+++ coreutils-8.21/tests/misc/fold.pl 2013-11-27 19:47:58.431538769 +0100
diff -urNp coreutils-8.22-orig/tests/misc/fold.pl coreutils-8.22/tests/misc/fold.pl
--- coreutils-8.22-orig/tests/misc/fold.pl 2013-12-04 15:48:30.000000000 +0100
+++ coreutils-8.22/tests/misc/fold.pl 2013-12-16 17:40:25.958879558 +0100
@@ -20,9 +20,18 @@ use strict;
(my $program_name = $0) =~ s|.*/||;
@ -4186,9 +4215,9 @@ diff -urNp coreutils-8.21-orig/tests/misc/fold.pl coreutils-8.21/tests/misc/fold
-my $prog = 'fold';
my $fail = run_tests ($program_name, $prog, \@Tests, $save_temps, $verbose);
exit $fail;
diff -urNp coreutils-8.21-orig/tests/misc/join.pl coreutils-8.21/tests/misc/join.pl
--- coreutils-8.21-orig/tests/misc/join.pl 2013-01-31 01:46:24.000000000 +0100
+++ coreutils-8.21/tests/misc/join.pl 2013-11-27 19:47:58.432538269 +0100
diff -urNp coreutils-8.22-orig/tests/misc/join.pl coreutils-8.22/tests/misc/join.pl
--- coreutils-8.22-orig/tests/misc/join.pl 2013-12-04 15:48:30.000000000 +0100
+++ coreutils-8.22/tests/misc/join.pl 2013-12-16 17:40:25.959879222 +0100
@@ -25,6 +25,15 @@ my $limits = getlimits ();
my $prog = 'join';
@ -4205,7 +4234,7 @@ diff -urNp coreutils-8.21-orig/tests/misc/join.pl coreutils-8.21/tests/misc/join
my $delim = chr 0247;
sub t_subst ($)
{
@@ -306,8 +315,49 @@ foreach my $t (@tv)
@@ -326,8 +335,49 @@ foreach my $t (@tv)
push @Tests, $new_ent;
}
@ -4255,9 +4284,9 @@ diff -urNp coreutils-8.21-orig/tests/misc/join.pl coreutils-8.21/tests/misc/join
my $save_temps = $ENV{DEBUG};
my $verbose = $ENV{VERBOSE};
diff -urNp coreutils-8.21-orig/tests/misc/sort-mb-tests.sh coreutils-8.21/tests/misc/sort-mb-tests.sh
--- coreutils-8.21-orig/tests/misc/sort-mb-tests.sh 1970-01-01 01:00:00.000000000 +0100
+++ coreutils-8.21/tests/misc/sort-mb-tests.sh 2013-02-18 17:44:03.852275681 +0100
diff -urNp coreutils-8.22-orig/tests/misc/sort-mb-tests.sh coreutils-8.22/tests/misc/sort-mb-tests.sh
--- coreutils-8.22-orig/tests/misc/sort-mb-tests.sh 1970-01-01 01:00:00.000000000 +0100
+++ coreutils-8.22/tests/misc/sort-mb-tests.sh 2013-12-16 17:40:25.959879222 +0100
@@ -0,0 +1,45 @@
+#!/bin/sh
+# Verify sort's multi-byte support.
@ -4304,9 +4333,9 @@ diff -urNp coreutils-8.21-orig/tests/misc/sort-mb-tests.sh coreutils-8.21/tests/
+compare exp out || { fail=1; cat out; }
+
+Exit $fail
diff -urNp coreutils-8.21-orig/tests/misc/sort-merge.pl coreutils-8.21/tests/misc/sort-merge.pl
--- coreutils-8.21-orig/tests/misc/sort-merge.pl 2013-01-31 01:46:24.000000000 +0100
+++ coreutils-8.21/tests/misc/sort-merge.pl 2013-11-27 19:47:58.435536769 +0100
diff -urNp coreutils-8.22-orig/tests/misc/sort-merge.pl coreutils-8.22/tests/misc/sort-merge.pl
--- coreutils-8.22-orig/tests/misc/sort-merge.pl 2013-12-04 15:48:30.000000000 +0100
+++ coreutils-8.22/tests/misc/sort-merge.pl 2013-12-16 17:40:25.960878886 +0100
@@ -26,6 +26,15 @@ my $prog = 'sort';
# Turn off localization of executable's output.
@ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3;
@ -4363,9 +4392,9 @@ diff -urNp coreutils-8.21-orig/tests/misc/sort-merge.pl coreutils-8.21/tests/mis
my $save_temps = $ENV{DEBUG};
my $verbose = $ENV{VERBOSE};
diff -urNp coreutils-8.21-orig/tests/misc/sort.pl coreutils-8.21/tests/misc/sort.pl
--- coreutils-8.21-orig/tests/misc/sort.pl 2013-01-31 01:46:24.000000000 +0100
+++ coreutils-8.21/tests/misc/sort.pl 2013-11-27 19:47:58.436536269 +0100
diff -urNp coreutils-8.22-orig/tests/misc/sort.pl coreutils-8.22/tests/misc/sort.pl
--- coreutils-8.22-orig/tests/misc/sort.pl 2013-12-04 15:48:30.000000000 +0100
+++ coreutils-8.22/tests/misc/sort.pl 2013-12-16 17:40:25.962878214 +0100
@@ -24,10 +24,15 @@ my $prog = 'sort';
# Turn off localization of executable's output.
@ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3;
@ -4383,11 +4412,10 @@ diff -urNp coreutils-8.21-orig/tests/misc/sort.pl coreutils-8.21/tests/misc/sort
# Since each test is run with a file name and with redirected stdin,
# the name in the diagnostic is either the file name or "-".
# Normalize each diagnostic to use '-'.
@@ -414,6 +419,37 @@
and push (@$t, {ENV=>'_POSIX2_VERSION=199209'}), last;
@@ -415,6 +420,37 @@ foreach my $t (@Tests)
}
}
+
+if ($mb_locale ne 'C')
+ {
+ # Duplicate each test vector, appending "-mb" to the test name and
@ -4418,9 +4446,10 @@ diff -urNp coreutils-8.21-orig/tests/misc/sort.pl coreutils-8.21/tests/misc/sort
+ }
+ push @Tests, @new;
+ }
+
@Tests = triple_test \@Tests;
# Remember that triple_test creates from each test with exactly one "IN"
@@ -424,6 +460,7 @@ foreach my $t (@Tests)
# Remove the IN_PIPE version of the "output-is-input" test above.
# The others aren't susceptible because they have three inputs each.
@ -4429,9 +4458,9 @@ diff -urNp coreutils-8.21-orig/tests/misc/sort.pl coreutils-8.21/tests/misc/sort
my $save_temps = $ENV{DEBUG};
my $verbose = $ENV{VERBOSE};
diff -urNp coreutils-8.21-orig/tests/misc/unexpand.pl coreutils-8.21/tests/misc/unexpand.pl
--- coreutils-8.21-orig/tests/misc/unexpand.pl 2013-01-31 01:46:24.000000000 +0100
+++ coreutils-8.21/tests/misc/unexpand.pl 2013-11-27 19:47:58.436536269 +0100
diff -urNp coreutils-8.22-orig/tests/misc/unexpand.pl coreutils-8.22/tests/misc/unexpand.pl
--- coreutils-8.22-orig/tests/misc/unexpand.pl 2013-12-04 15:48:30.000000000 +0100
+++ coreutils-8.22/tests/misc/unexpand.pl 2013-12-16 17:40:25.962878214 +0100
@@ -27,6 +27,14 @@ my $limits = getlimits ();
my $prog = 'unexpand';
@ -4485,9 +4514,9 @@ diff -urNp coreutils-8.21-orig/tests/misc/unexpand.pl coreutils-8.21/tests/misc/
my $save_temps = $ENV{DEBUG};
my $verbose = $ENV{VERBOSE};
diff -urNp coreutils-8.21-orig/tests/misc/uniq.pl coreutils-8.21/tests/misc/uniq.pl
--- coreutils-8.21-orig/tests/misc/uniq.pl 2013-01-31 01:46:25.000000000 +0100
+++ coreutils-8.21/tests/misc/uniq.pl 2013-11-27 19:47:58.437535769 +0100
diff -urNp coreutils-8.22-orig/tests/misc/uniq.pl coreutils-8.22/tests/misc/uniq.pl
--- coreutils-8.22-orig/tests/misc/uniq.pl 2013-12-04 15:48:30.000000000 +0100
+++ coreutils-8.22/tests/misc/uniq.pl 2013-12-16 17:41:34.077961751 +0100
@@ -23,9 +23,17 @@ my $limits = getlimits ();
my $prog = 'uniq';
my $try = "Try '$prog --help' for more information.\n";
@ -4506,11 +4535,10 @@ diff -urNp coreutils-8.21-orig/tests/misc/uniq.pl coreutils-8.21/tests/misc/uniq
# When possible, create a "-z"-testing variant of each test.
sub add_z_variants($)
{
@@ -207,7 +215,45 @@
$t->[0] =~ /^obs-plus/
@@ -261,6 +269,45 @@ foreach my $t (@Tests)
and push @$t, {ENV=>'_POSIX2_VERSION=199209'};
}
+
+if ($mb_locale ne 'C')
+ {
+ # Duplicate each test vector, appending "-mb" to the test name and
@ -4534,12 +4562,13 @@ diff -urNp coreutils-8.21-orig/tests/misc/uniq.pl coreutils-8.21/tests/misc/uniq
+ push @new_t, $sub;
+ push @$t, $sub;
+ }
+ next if ($test_name =~ "schar" or $test_name =~ "^obs-plus" or $test_name =~ "119" or $test_name =~ "128" or $test_name =~ "129" or $test_name =~ "130" or $test_name =~ "131" or $test_name =~ "132" or $test_name =~ "133" or $test_name =~ "145");
+ next if ($test_name =~ "schar" or $test_name =~ "^obs-plus"
+ or $test_name =~ "119" or $test_name =~ "145");
+ push @new, ["$test_name-mb", @new_t, {ENV => "LC_ALL=$mb_locale"}];
+ }
+ push @Tests, @new;
+ }
+
+# Remember that triple_test creates from each test with exactly one "IN"
+# file two more tests (.p and .r suffix on name) corresponding to reading
+# input from a file and from a pipe. The pipe-reading test would fail
@ -4552,9 +4581,9 @@ diff -urNp coreutils-8.21-orig/tests/misc/uniq.pl coreutils-8.21/tests/misc/uniq
@Tests = add_z_variants \@Tests;
@Tests = triple_test \@Tests;
diff -urNp coreutils-8.21-orig/tests/pr/pr-tests.pl coreutils-8.21/tests/pr/pr-tests.pl
--- coreutils-8.21-orig/tests/pr/pr-tests.pl 2013-01-31 01:46:25.000000000 +0100
+++ coreutils-8.21/tests/pr/pr-tests.pl 2013-11-27 19:48:12.683409258 +0100
diff -urNp coreutils-8.22-orig/tests/pr/pr-tests.pl coreutils-8.22/tests/pr/pr-tests.pl
--- coreutils-8.22-orig/tests/pr/pr-tests.pl 2013-12-04 15:48:30.000000000 +0100
+++ coreutils-8.22/tests/pr/pr-tests.pl 2013-12-16 17:40:25.965877206 +0100
@@ -23,6 +23,15 @@ use strict;
my $prog = 'pr';