From 409b66fa006274b97ef74cf52e0d885002e2952c5357050bd4610b3a8bb84e6b Mon Sep 17 00:00:00 2001 From: Bernhard Voelker Date: Thu, 16 Jul 2015 01:29:46 +0000 Subject: [PATCH] - Sync I18N patch from semi-official repository (shared among distributions, maintained by Padraig Brady): https://github.com/pixelb/coreutils/tree/i18n * coreutils-i18n.patch: Improve cut(1) performance in field-mode in UTF8 locales. Squash in sort-keycompare-mb.patch. * sort-keycompare-mb.patch: Remove. - coreutils-build-timeout-as-pie.patch: Refresh. OBS-URL: https://build.opensuse.org/package/show/Base:System/coreutils?expand=0&rev=263 --- coreutils-build-timeout-as-pie.patch | 2 +- coreutils-i18n.patch | 376 ++++++++++++++++----------- coreutils-testsuite.changes | 14 +- coreutils-testsuite.spec | 2 - coreutils.changes | 14 +- coreutils.spec | 2 - sort-keycompare-mb.patch | 84 ------ 7 files changed, 245 insertions(+), 249 deletions(-) delete mode 100644 sort-keycompare-mb.patch diff --git a/coreutils-build-timeout-as-pie.patch b/coreutils-build-timeout-as-pie.patch index df3c7a9..0607fbb 100644 --- a/coreutils-build-timeout-as-pie.patch +++ b/coreutils-build-timeout-as-pie.patch @@ -36,4 +36,4 @@ Index: src/local.mk + # for various ACL functions copy_ldadd += $(LIB_ACL) - src_ls_LDADD += $(LIB_ACL) + src_ls_LDADD += $(LIB_HAS_ACL) diff --git a/coreutils-i18n.patch b/coreutils-i18n.patch index deab516..0dccc29 100644 --- a/coreutils-i18n.patch +++ b/coreutils-i18n.patch @@ -1,12 +1,12 @@ lib/linebuffer.h | 8 - src/cut.c | 433 ++++++++++++++++++++++++- + src/cut.c | 443 ++++++++++++++++++++++++- src/expand.c | 165 +++++++++ - src/fold.c | 290 +++++++++++++++-- - src/join.c | 363 ++++++++++++++++++--- - src/pr.c | 435 ++++++++++++++++++++++--- - src/sort.c | 745 +++++++++++++++++++++++++++++++++++++++++--- + src/fold.c | 308 ++++++++++++++++- + src/join.c | 363 ++++++++++++++++++-- + src/pr.c | 444 +++++++++++++++++++++++-- + src/sort.c | 763 +++++++++++++++++++++++++++++++++++++++++--- src/unexpand.c | 228 +++++++++++++ - src/uniq.c | 265 +++++++++++++++ + src/uniq.c | 265 ++++++++++++++- tests/i18n/sort.sh | 29 + tests/local.mk | 2 tests/misc/cut.pl | 7 @@ -15,16 +15,16 @@ tests/misc/join.pl | 50 ++ tests/misc/sort-mb-tests.sh | 45 ++ tests/misc/sort-merge.pl | 42 ++ - tests/misc/sort.pl | 39 ++ + tests/misc/sort.pl | 40 ++ tests/misc/unexpand.pl | 39 ++ tests/misc/uniq.pl | 55 +++ - tests/pr/pr-tests.pl | 50 ++ - 21 files changed, 3198 insertions(+), 182 deletions(-) + tests/pr/pr-tests.pl | 49 ++ + 21 files changed, 3255 insertions(+), 180 deletions(-) Index: lib/linebuffer.h =================================================================== ---- lib/linebuffer.h.orig 2015-06-16 07:00:37.000000000 +0200 -+++ lib/linebuffer.h 2015-07-09 17:15:19.619057660 +0200 +--- lib/linebuffer.h.orig ++++ lib/linebuffer.h @@ -21,6 +21,11 @@ # include @@ -49,8 +49,8 @@ Index: lib/linebuffer.h /* Initialize linebuffer LINEBUFFER for use. */ Index: src/cut.c =================================================================== ---- src/cut.c.orig 2015-06-26 19:05:22.000000000 +0200 -+++ src/cut.c 2015-07-09 17:15:19.619057660 +0200 +--- src/cut.c.orig ++++ src/cut.c @@ -28,6 +28,11 @@ #include #include @@ -283,7 +283,7 @@ Index: src/cut.c /* Read from stream STREAM, printing to standard output any selected fields. */ static void -@@ -648,13 +805,201 @@ cut_fields (FILE *stream) +@@ -648,13 +805,211 @@ cut_fields (FILE *stream) } } @@ -467,9 +467,19 @@ Index: src/cut.c + + case field_mode: + if (delimlen == 1) -+ cut_fields (stream); -+ else -+ cut_fields_mb (stream); ++ { ++ /* Check if we have utf8 multibyte locale, so we can use this ++ optimization because of uniqueness of characters, which is ++ not true for e.g. SJIS */ ++ char * loc = setlocale(LC_CTYPE, NULL); ++ if (loc && (strstr (loc, "UTF-8") || strstr (loc, "utf-8") || ++ strstr (loc, "UTF8") || strstr (loc, "utf8"))) ++ { ++ cut_fields (stream); ++ break; ++ } ++ } ++ cut_fields_mb (stream); + break; + + default: @@ -488,7 +498,7 @@ Index: src/cut.c } /* Process file FILE to standard output. -@@ -706,6 +1051,7 @@ main (int argc, char **argv) +@@ -706,6 +1061,7 @@ main (int argc, char **argv) bool ok; bool delim_specified = false; char *spec_list_string IF_LINT ( = NULL); @@ -496,7 +506,7 @@ Index: src/cut.c initialize_main (&argc, &argv); set_program_name (argv[0]); -@@ -728,7 +1074,6 @@ main (int argc, char **argv) +@@ -728,7 +1084,6 @@ main (int argc, char **argv) switch (optc) { case 'b': @@ -504,7 +514,7 @@ Index: src/cut.c /* Build the byte list. */ if (operating_mode != undefined_mode) FATAL_ERROR (_("only one type of list may be specified")); -@@ -736,6 +1081,14 @@ main (int argc, char **argv) +@@ -736,6 +1091,14 @@ main (int argc, char **argv) spec_list_string = optarg; break; @@ -519,7 +529,7 @@ Index: src/cut.c case 'f': /* Build the field list. */ if (operating_mode != undefined_mode) -@@ -747,10 +1100,38 @@ main (int argc, char **argv) +@@ -747,10 +1110,38 @@ main (int argc, char **argv) case 'd': /* New delimiter. */ /* Interpret -d '' to mean 'use the NUL byte as the delimiter.' */ @@ -562,7 +572,7 @@ Index: src/cut.c break; case OUTPUT_DELIMITER_OPTION: -@@ -763,6 +1144,7 @@ main (int argc, char **argv) +@@ -763,6 +1154,7 @@ main (int argc, char **argv) break; case 'n': @@ -570,7 +580,7 @@ Index: src/cut.c break; case 's': -@@ -802,15 +1184,34 @@ main (int argc, char **argv) +@@ -802,15 +1194,34 @@ main (int argc, char **argv) } if (!delim_specified) @@ -613,8 +623,8 @@ Index: src/cut.c if (optind == argc) Index: src/expand.c =================================================================== ---- src/expand.c.orig 2015-06-26 19:05:22.000000000 +0200 -+++ src/expand.c 2015-07-09 17:15:19.619057660 +0200 +--- src/expand.c.orig ++++ src/expand.c @@ -37,12 +37,34 @@ #include #include @@ -809,20 +819,43 @@ Index: src/expand.c error (EXIT_FAILURE, errno, "-"); Index: src/fold.c =================================================================== ---- src/fold.c.orig 2015-06-26 19:05:22.000000000 +0200 -+++ src/fold.c 2015-07-09 17:17:59.750295812 +0200 -@@ -18,6 +18,10 @@ - - #include - -+#if HAVE_WCHAR_H -+#include -+#endif -+ - #include +--- src/fold.c.orig ++++ src/fold.c +@@ -22,11 +22,33 @@ #include #include -@@ -34,20 +38,41 @@ + ++/* Get mbstate_t, mbrtowc(), wcwidth(). */ ++#if HAVE_WCHAR_H ++# include ++#endif ++ ++/* Get iswprint(), iswblank(), wcwidth(). */ ++#if HAVE_WCTYPE_H ++# include ++#endif ++ + #include "system.h" + #include "error.h" + #include "fadvise.h" + #include "xdectoint.h" + ++/* MB_LEN_MAX is incorrectly defined to be 1 in at least one GCC ++ installation; work around this configuration error. */ ++#if !defined MB_LEN_MAX || MB_LEN_MAX < 2 ++# undef MB_LEN_MAX ++# define MB_LEN_MAX 16 ++#endif ++ ++/* Some systems, like BeOS, have multibyte encodings but lack mbstate_t. */ ++#if HAVE_MBRTOWC && defined mbstate_t ++# define mbrtowc(pwc, s, n, ps) (mbrtowc) (pwc, s, n, 0) ++#endif ++ + #define TAB_WIDTH 8 + + /* The official name of this program (e.g., no 'g' prefix). */ +@@ -34,20 +56,41 @@ #define AUTHORS proper_name ("David MacKenzie") @@ -868,7 +901,7 @@ Index: src/fold.c {"spaces", no_argument, NULL, 's'}, {"width", required_argument, NULL, 'w'}, {GETOPT_HELP_OPTION_DECL}, -@@ -75,6 +100,7 @@ Wrap input lines in each FILE, writing t +@@ -75,6 +118,7 @@ Wrap input lines in each FILE, writing t fputs (_("\ -b, --bytes count bytes rather than columns\n\ @@ -876,7 +909,7 @@ Index: src/fold.c -s, --spaces break at spaces\n\ -w, --width=WIDTH use WIDTH columns instead of 80\n\ "), stdout); -@@ -92,7 +118,7 @@ Wrap input lines in each FILE, writing t +@@ -92,7 +136,7 @@ Wrap input lines in each FILE, writing t static size_t adjust_column (size_t column, char c) { @@ -885,7 +918,7 @@ Index: src/fold.c { if (c == '\b') { -@@ -115,30 +141,14 @@ adjust_column (size_t column, char c) +@@ -115,30 +159,14 @@ adjust_column (size_t column, char c) to stdout, with maximum line length WIDTH. Return true if successful. */ @@ -918,7 +951,7 @@ Index: src/fold.c fadvise (istream, FADVISE_SEQUENTIAL); -@@ -168,6 +178,15 @@ fold_file (char const *filename, size_t +@@ -168,6 +196,15 @@ fold_file (char const *filename, size_t bool found_blank = false; size_t logical_end = offset_out; @@ -934,16 +967,16 @@ Index: src/fold.c /* Look for the last blank. */ while (logical_end) { -@@ -214,11 +233,221 @@ fold_file (char const *filename, size_t +@@ -214,11 +251,221 @@ fold_file (char const *filename, size_t line_out[offset_out++] = c; } - saved_errno = errno; + *saved_errno = errno; - - if (offset_out) - fwrite (line_out, sizeof (char), (size_t) offset_out, stdout); - ++ ++ if (offset_out) ++ fwrite (line_out, sizeof (char), (size_t) offset_out, stdout); ++ +} + +#if HAVE_MBRTOWC @@ -1115,10 +1148,10 @@ Index: src/fold.c + } + + *saved_errno = errno; -+ -+ if (offset_out) -+ fwrite (line_out, sizeof (char), (size_t) offset_out, stdout); -+ + + if (offset_out) + fwrite (line_out, sizeof (char), (size_t) offset_out, stdout); + +} +#endif + @@ -1157,7 +1190,7 @@ Index: src/fold.c if (ferror (istream)) { error (0, saved_errno, "%s", filename); -@@ -251,7 +480,8 @@ main (int argc, char **argv) +@@ -251,7 +498,8 @@ main (int argc, char **argv) atexit (close_stdout); @@ -1167,7 +1200,7 @@ Index: src/fold.c while ((optc = getopt_long (argc, argv, shortopts, longopts, NULL)) != -1) { -@@ -260,7 +490,15 @@ main (int argc, char **argv) +@@ -260,7 +508,15 @@ main (int argc, char **argv) switch (optc) { case 'b': /* Count bytes rather than columns. */ @@ -1186,8 +1219,8 @@ Index: src/fold.c case 's': /* Break at word boundaries. */ Index: src/join.c =================================================================== ---- src/join.c.orig 2015-06-26 19:05:22.000000000 +0200 -+++ src/join.c 2015-07-09 17:15:19.620057636 +0200 +--- src/join.c.orig ++++ src/join.c @@ -22,18 +22,32 @@ #include #include @@ -1682,8 +1715,8 @@ Index: src/join.c case 'z': Index: src/pr.c =================================================================== ---- src/pr.c.orig 2015-06-26 19:05:22.000000000 +0200 -+++ src/pr.c 2015-07-09 17:36:00.714903141 +0200 +--- src/pr.c.orig ++++ src/pr.c @@ -312,6 +312,24 @@ #include @@ -1709,7 +1742,26 @@ Index: src/pr.c #include "system.h" #include "error.h" #include "fadvise.h" -@@ -416,7 +434,20 @@ struct COLUMN +@@ -324,6 +342,18 @@ + #include "xstrtol.h" + #include "xdectoint.h" + ++/* Some systems, like BeOS, have multibyte encodings but lack mbstate_t. */ ++#if HAVE_MBRTOWC && defined mbstate_t ++# define mbrtowc(pwc, s, n, ps) (mbrtowc) (pwc, s, n, 0) ++#endif ++ ++#ifndef HAVE_DECL_WCWIDTH ++"this configure-time declaration test was not run" ++#endif ++#if !HAVE_DECL_WCWIDTH ++extern int wcwidth (); ++#endif ++ + /* The official name of this program (e.g., no 'g' prefix). */ + #define PROGRAM_NAME "pr" + +@@ -416,7 +446,20 @@ struct COLUMN typedef struct COLUMN COLUMN; @@ -1731,18 +1783,15 @@ Index: src/pr.c static bool read_line (COLUMN *p); static bool print_page (void); static bool print_stored (COLUMN *p); -@@ -427,8 +458,8 @@ static void pad_across_to (int position) - static void add_line_number (COLUMN *p); +@@ -428,6 +471,7 @@ static void add_line_number (COLUMN *p); static void getoptnum (const char *n_str, int min, int *num, const char *errfmt); --static void getoptarg (char *arg, char switch_char, char *character, -- int *number); -+static void getoptarg (char *arg, char switch_char, char *character, int *character_length, -+ int *character_width, int *number); + static void getoptarg (char *arg, char switch_char, char *character, ++ int *character_length, int *character_width, + int *number); static void print_files (int number_of_files, char **av); static void init_parameters (int number_of_files); - static void init_header (char const *filename, int desc); -@@ -441,7 +472,6 @@ static void store_char (char c); +@@ -441,7 +485,6 @@ static void store_char (char c); static void pad_down (unsigned int lines); static void read_rest_of_line (COLUMN *p); static void skip_read (COLUMN *p, int column_number); @@ -1750,7 +1799,7 @@ Index: src/pr.c static void cleanup (void); static void print_sep_string (void); static void separator_string (const char *optarg_S); -@@ -453,7 +483,7 @@ static COLUMN *column_vector; +@@ -453,7 +496,7 @@ static COLUMN *column_vector; we store the leftmost columns contiguously in buff. To print a line from buff, get the index of the first character from line_vector[i], and print up to line_vector[i + 1]. */ @@ -1759,7 +1808,7 @@ Index: src/pr.c /* Index of the position in buff where the next character will be stored. */ -@@ -557,7 +587,7 @@ static int chars_per_column; +@@ -557,7 +600,7 @@ static int chars_per_column; static bool untabify_input = false; /* (-e) The input tab character. */ @@ -1768,7 +1817,7 @@ Index: src/pr.c /* (-e) Tabstops are at chars_per_tab, 2*chars_per_tab, 3*chars_per_tab, ... where the leftmost column is 1. */ -@@ -567,7 +597,10 @@ static int chars_per_input_tab = 8; +@@ -567,7 +610,10 @@ static int chars_per_input_tab = 8; static bool tabify_output = false; /* (-i) The output tab character. */ @@ -1780,7 +1829,7 @@ Index: src/pr.c /* (-i) The width of the output tab. */ static int chars_per_output_tab = 8; -@@ -637,7 +670,13 @@ static int line_number; +@@ -637,7 +683,13 @@ static int line_number; static bool numbered_lines = false; /* (-n) Character which follows each line number. */ @@ -1795,7 +1844,7 @@ Index: src/pr.c /* (-n) line counting starts with 1st line of input file (not with 1st line of 1st page printed). */ -@@ -690,6 +729,7 @@ static bool use_col_separator = false; +@@ -690,6 +742,7 @@ static bool use_col_separator = false; -a|COLUMN|-m is a 'space' and with the -J option a 'tab'. */ static char *col_sep_string = (char *) ""; static int col_sep_length = 0; @@ -1803,7 +1852,7 @@ Index: src/pr.c static char *column_separator = (char *) " "; static char *line_separator = (char *) "\t"; -@@ -840,6 +880,13 @@ separator_string (const char *optarg_S) +@@ -840,6 +893,13 @@ separator_string (const char *optarg_S) col_sep_length = (int) strlen (optarg_S); col_sep_string = xmalloc (col_sep_length + 1); strcpy (col_sep_string, optarg_S); @@ -1817,7 +1866,7 @@ Index: src/pr.c } int -@@ -864,6 +911,21 @@ main (int argc, char **argv) +@@ -864,6 +924,21 @@ main (int argc, char **argv) atexit (close_stdout); @@ -1839,7 +1888,7 @@ Index: src/pr.c n_files = 0; file_names = (argc > 1 ? xmalloc ((argc - 1) * sizeof (char *)) -@@ -940,8 +1002,12 @@ main (int argc, char **argv) +@@ -940,8 +1015,12 @@ main (int argc, char **argv) break; case 'e': if (optarg) @@ -1854,7 +1903,7 @@ Index: src/pr.c /* Could check tab width > 0. */ untabify_input = true; break; -@@ -954,8 +1020,12 @@ main (int argc, char **argv) +@@ -954,8 +1033,12 @@ main (int argc, char **argv) break; case 'i': if (optarg) @@ -1869,7 +1918,7 @@ Index: src/pr.c /* Could check tab width > 0. */ tabify_output = true; break; -@@ -973,8 +1043,8 @@ main (int argc, char **argv) +@@ -973,8 +1056,8 @@ main (int argc, char **argv) case 'n': numbered_lines = true; if (optarg) @@ -1880,7 +1929,7 @@ Index: src/pr.c break; case 'N': skip_count = false; -@@ -998,7 +1068,7 @@ main (int argc, char **argv) +@@ -998,7 +1081,7 @@ main (int argc, char **argv) old_s = false; /* Reset an additional input of -s, -S dominates -s */ col_sep_string = bad_cast (""); @@ -1889,7 +1938,7 @@ Index: src/pr.c use_col_separator = true; if (optarg) separator_string (optarg); -@@ -1152,10 +1222,45 @@ getoptnum (const char *n_str, int min, i +@@ -1152,10 +1235,45 @@ getoptnum (const char *n_str, int min, i a number. */ static void @@ -1937,7 +1986,7 @@ Index: src/pr.c if (*arg) { long int tmp_long; -@@ -1177,6 +1282,11 @@ static void +@@ -1177,6 +1295,11 @@ static void init_parameters (int number_of_files) { int chars_used_by_number = 0; @@ -1949,7 +1998,7 @@ Index: src/pr.c lines_per_body = lines_per_page - lines_per_header - lines_per_footer; if (lines_per_body <= 0) -@@ -1214,7 +1324,7 @@ init_parameters (int number_of_files) +@@ -1214,7 +1337,7 @@ init_parameters (int number_of_files) else col_sep_string = column_separator; @@ -1958,7 +2007,7 @@ Index: src/pr.c use_col_separator = true; } /* It's rather pointless to define a TAB separator with column -@@ -1244,11 +1354,11 @@ init_parameters (int number_of_files) +@@ -1244,11 +1367,11 @@ init_parameters (int number_of_files) + TAB_WIDTH (chars_per_input_tab, chars_per_number); */ /* Estimate chars_per_text without any margin and keep it constant. */ @@ -1972,7 +2021,7 @@ Index: src/pr.c /* The number is part of the column width unless we are printing files in parallel. */ -@@ -1257,7 +1367,7 @@ init_parameters (int number_of_files) +@@ -1257,7 +1380,7 @@ init_parameters (int number_of_files) } chars_per_column = (chars_per_line - chars_used_by_number @@ -1981,7 +2030,7 @@ Index: src/pr.c if (chars_per_column < 1) error (EXIT_FAILURE, 0, _("page width too narrow")); -@@ -1275,7 +1385,7 @@ init_parameters (int number_of_files) +@@ -1275,7 +1398,7 @@ init_parameters (int number_of_files) We've to use 8 as the lower limit, if we use chars_per_default_tab = 8 to expand a tab which is not an input_tab-char. */ free (clump_buff); @@ -1990,7 +2039,7 @@ Index: src/pr.c } /* Open the necessary files, -@@ -1383,7 +1493,7 @@ init_funcs (void) +@@ -1383,7 +1506,7 @@ init_funcs (void) /* Enlarge p->start_position of first column to use the same form of padding_not_printed with all columns. */ @@ -1999,7 +2048,7 @@ Index: src/pr.c /* This loop takes care of all but the rightmost column. */ -@@ -1417,7 +1527,7 @@ init_funcs (void) +@@ -1417,7 +1540,7 @@ init_funcs (void) } else { @@ -2008,7 +2057,7 @@ Index: src/pr.c h_next = h + chars_per_column; } } -@@ -1708,9 +1818,9 @@ static void +@@ -1708,9 +1831,9 @@ static void align_column (COLUMN *p) { padding_not_printed = p->start_position; @@ -2020,7 +2069,7 @@ Index: src/pr.c padding_not_printed = ANYWHERE; } -@@ -1981,13 +2091,13 @@ store_char (char c) +@@ -1981,13 +2104,13 @@ store_char (char c) /* May be too generous. */ buff = X2REALLOC (buff, &buff_allocated); } @@ -2036,7 +2085,7 @@ Index: src/pr.c char *s; int num_width; -@@ -2004,22 +2114,24 @@ add_line_number (COLUMN *p) +@@ -2004,22 +2127,24 @@ add_line_number (COLUMN *p) /* Tabification is assumed for multiple columns, also for n-separators, but 'default n-separator = TAB' hasn't been given priority over equal column_width also specified by POSIX. */ @@ -2065,7 +2114,7 @@ Index: src/pr.c output_position = POS_AFTER_TAB (chars_per_output_tab, output_position); } -@@ -2180,7 +2292,7 @@ print_white_space (void) +@@ -2180,7 +2305,7 @@ print_white_space (void) while (goal - h_old > 1 && (h_new = POS_AFTER_TAB (chars_per_output_tab, h_old)) <= goal) { @@ -2074,7 +2123,7 @@ Index: src/pr.c h_old = h_new; } while (++h_old <= goal) -@@ -2200,6 +2312,7 @@ print_sep_string (void) +@@ -2200,6 +2325,7 @@ print_sep_string (void) { char *s; int l = col_sep_length; @@ -2082,7 +2131,7 @@ Index: src/pr.c s = col_sep_string; -@@ -2213,6 +2326,7 @@ print_sep_string (void) +@@ -2213,6 +2339,7 @@ print_sep_string (void) { for (; separators_not_printed > 0; --separators_not_printed) { @@ -2090,7 +2139,7 @@ Index: src/pr.c while (l-- > 0) { /* 3 types of sep_strings: spaces only, spaces and chars, -@@ -2226,12 +2340,15 @@ print_sep_string (void) +@@ -2226,12 +2353,15 @@ print_sep_string (void) } else { @@ -2107,7 +2156,7 @@ Index: src/pr.c /* sep_string ends with some spaces */ if (spaces_not_printed > 0) print_white_space (); -@@ -2259,7 +2376,7 @@ print_clump (COLUMN *p, int n, char *clu +@@ -2259,7 +2389,7 @@ print_clump (COLUMN *p, int n, char *clu required number of tabs and spaces. */ static void @@ -2116,7 +2165,7 @@ Index: src/pr.c { if (tabify_output) { -@@ -2283,6 +2400,74 @@ print_char (char c) +@@ -2283,6 +2413,74 @@ print_char (char c) putchar (c); } @@ -2191,7 +2240,7 @@ Index: src/pr.c /* Skip to page PAGE before printing. PAGE may be larger than total number of pages. */ -@@ -2462,9 +2647,9 @@ read_line (COLUMN *p) +@@ -2462,9 +2660,9 @@ read_line (COLUMN *p) align_empty_cols = false; } @@ -2203,7 +2252,7 @@ Index: src/pr.c padding_not_printed = ANYWHERE; } -@@ -2534,7 +2719,7 @@ print_stored (COLUMN *p) +@@ -2534,7 +2732,7 @@ print_stored (COLUMN *p) int i; int line = p->current_line++; @@ -2212,7 +2261,7 @@ Index: src/pr.c /* FIXME UMR: Uninitialized memory read: * This is occurring while in: -@@ -2546,7 +2731,7 @@ print_stored (COLUMN *p) +@@ -2546,7 +2744,7 @@ print_stored (COLUMN *p) xmalloc [xmalloc.c:94] init_store_cols [pr.c:1648] */ @@ -2221,7 +2270,7 @@ Index: src/pr.c pad_vertically = true; -@@ -2565,9 +2750,9 @@ print_stored (COLUMN *p) +@@ -2565,9 +2763,9 @@ print_stored (COLUMN *p) } } @@ -2233,7 +2282,7 @@ Index: src/pr.c padding_not_printed = ANYWHERE; } -@@ -2580,8 +2765,8 @@ print_stored (COLUMN *p) +@@ -2580,8 +2778,8 @@ print_stored (COLUMN *p) if (spaces_not_printed == 0) { output_position = p->start_position + end_vector[line]; @@ -2244,7 +2293,7 @@ Index: src/pr.c } return true; -@@ -2600,7 +2785,7 @@ print_stored (COLUMN *p) +@@ -2600,7 +2798,7 @@ print_stored (COLUMN *p) number of characters is 1.) */ static int @@ -2253,7 +2302,7 @@ Index: src/pr.c { unsigned char uc = c; char *s = clump_buff; -@@ -2610,10 +2795,10 @@ char_to_clump (char c) +@@ -2610,10 +2808,10 @@ char_to_clump (char c) int chars; int chars_per_c = 8; @@ -2266,7 +2315,7 @@ Index: src/pr.c { width = TAB_WIDTH (chars_per_c, input_position); -@@ -2694,6 +2879,164 @@ char_to_clump (char c) +@@ -2694,6 +2892,164 @@ char_to_clump (char c) return chars; } @@ -2433,8 +2482,8 @@ Index: src/pr.c Index: src/sort.c =================================================================== ---- src/sort.c.orig 2015-06-26 19:05:22.000000000 +0200 -+++ src/sort.c 2015-07-09 17:28:20.750707716 +0200 +--- src/sort.c.orig ++++ src/sort.c @@ -29,6 +29,14 @@ #include #include @@ -3112,7 +3161,7 @@ Index: src/sort.c else if (key->random) diff = compare_random (ta, tlena, tb, tlenb); else if (key->version) -@@ -2694,6 +3134,193 @@ keycompare (struct line const *a, struct +@@ -2694,6 +3134,211 @@ keycompare (struct line const *a, struct return key->reverse ? -diff : diff; } @@ -3217,6 +3266,9 @@ Index: src/sort.c + size_t lena = lima <= texta ? 0 : lima - texta; + size_t lenb = limb <= textb ? 0 : limb - textb; + ++ char enda IF_LINT (= 0); ++ char endb IF_LINT (= 0); ++ + char const *translate = key->translate; + bool const *ignore = key->ignore; + @@ -3236,6 +3288,12 @@ Index: src/sort.c + texta = copy_a; textb = copy_b; + lena = new_len_a; lenb = new_len_b; + } ++ else ++ { ++ /* Use the keys in-place, temporarily null-terminated. */ ++ enda = texta[lena]; texta[lena] = '\0'; ++ endb = textb[lenb]; textb[lenb] = '\0'; ++ } + + if (key->random) + diff = compare_random (texta, lena, textb, lenb); @@ -3259,13 +3317,22 @@ Index: src/sort.c + diff = 1; + else if (hard_LC_COLLATE && !folding) + { -+ diff = xmemcoll0 (texta, lena, textb, lenb); ++ diff = xmemcoll0 (texta, lena + 1, textb, lenb + 1); + } + else -+ diff = memcmp (texta, textb, MIN (lena + 1,lenb + 1)); ++ { ++ diff = memcmp (texta, textb, MIN (lena, lenb)); ++ if (diff == 0) ++ diff = lena < lenb ? -1 : lena != lenb; ++ } + + if (ignore || translate) + free (texta); ++ else ++ { ++ texta[lena] = enda; ++ textb[lenb] = endb; ++ } + + if (diff) + goto not_equal; @@ -3306,7 +3373,7 @@ Index: 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. */ -@@ -2721,7 +3348,7 @@ compare (struct line const *a, struct li +@@ -2721,7 +3366,7 @@ compare (struct line const *a, struct li diff = - NONZERO (blen); else if (blen == 0) diff = 1; @@ -3315,7 +3382,7 @@ Index: src/sort.c { /* Note xmemcoll0 is a performance enhancement as it will not unconditionally write '\0' after the -@@ -4120,6 +4747,7 @@ set_ordering (char const *s, struct keyf +@@ -4120,6 +4765,7 @@ set_ordering (char const *s, struct keyf break; case 'f': key->translate = fold_toupper; @@ -3323,7 +3390,7 @@ Index: src/sort.c break; case 'g': key->general_numeric = true; -@@ -4197,7 +4825,7 @@ main (int argc, char **argv) +@@ -4197,7 +4843,7 @@ main (int argc, char **argv) initialize_exit_failure (SORT_FAILURE); hard_LC_COLLATE = hard_locale (LC_COLLATE); @@ -3332,7 +3399,7 @@ Index: src/sort.c hard_LC_TIME = hard_locale (LC_TIME); #endif -@@ -4218,6 +4846,29 @@ main (int argc, char **argv) +@@ -4218,6 +4864,29 @@ main (int argc, char **argv) thousands_sep = -1; } @@ -3362,7 +3429,7 @@ Index: src/sort.c have_read_stdin = false; inittables (); -@@ -4492,13 +5143,34 @@ main (int argc, char **argv) +@@ -4492,13 +5161,34 @@ main (int argc, char **argv) case 't': { @@ -3401,7 +3468,7 @@ Index: src/sort.c else { /* Provoke with 'sort -txx'. Complain about -@@ -4509,9 +5181,12 @@ main (int argc, char **argv) +@@ -4509,9 +5199,12 @@ main (int argc, char **argv) quote (optarg)); } } @@ -3418,8 +3485,8 @@ Index: src/sort.c Index: src/unexpand.c =================================================================== ---- src/unexpand.c.orig 2015-06-26 19:05:22.000000000 +0200 -+++ src/unexpand.c 2015-07-09 17:15:19.622057589 +0200 +--- src/unexpand.c.orig ++++ src/unexpand.c @@ -38,12 +38,29 @@ #include #include @@ -3677,8 +3744,8 @@ Index: src/unexpand.c error (EXIT_FAILURE, errno, "-"); Index: src/uniq.c =================================================================== ---- src/uniq.c.orig 2015-06-26 19:04:19.000000000 +0200 -+++ src/uniq.c 2015-07-09 17:15:19.622057589 +0200 +--- src/uniq.c.orig ++++ src/uniq.c @@ -21,6 +21,17 @@ #include #include @@ -4064,8 +4131,8 @@ Index: src/uniq.c check_chars = SIZE_MAX; Index: tests/i18n/sort.sh =================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ tests/i18n/sort.sh 2015-07-09 17:15:19.622057589 +0200 +--- /dev/null ++++ tests/i18n/sort.sh @@ -0,0 +1,29 @@ +#!/bin/sh +# Verify sort's multi-byte support. @@ -4098,28 +4165,21 @@ Index: tests/i18n/sort.sh +Exit $fail Index: tests/local.mk =================================================================== ---- tests/local.mk.orig 2015-07-03 14:03:55.000000000 +0200 -+++ tests/local.mk 2015-07-09 17:28:19.101746451 +0200 -@@ -341,6 +341,7 @@ all_tests = \ +--- tests/local.mk.orig ++++ tests/local.mk +@@ -341,6 +341,8 @@ all_tests = \ tests/misc/sort-discrim.sh \ tests/misc/sort-files0-from.pl \ tests/misc/sort-float.sh \ + tests/misc/sort-mb-tests.sh \ ++ tests/i18n/sort.sh \ tests/misc/sort-merge.pl \ tests/misc/sort-merge-fdlimit.sh \ tests/misc/sort-month.sh \ -@@ -532,6 +533,7 @@ all_tests = \ - tests/du/threshold.sh \ - tests/du/trailing-slash.sh \ - tests/du/two-args.sh \ -+ tests/i18n/sort.sh \ - tests/id/gnu-zero-uids.sh \ - tests/id/no-context.sh \ - tests/id/context.sh \ Index: tests/misc/cut.pl =================================================================== ---- tests/misc/cut.pl.orig 2015-06-26 19:04:19.000000000 +0200 -+++ tests/misc/cut.pl 2015-07-09 17:15:19.622057589 +0200 +--- tests/misc/cut.pl.orig ++++ tests/misc/cut.pl @@ -23,9 +23,11 @@ use strict; # Turn off localization of executable's output. @ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3; @@ -4144,8 +4204,8 @@ Index: tests/misc/cut.pl push @Tests, @new; Index: tests/misc/expand.pl =================================================================== ---- tests/misc/expand.pl.orig 2015-06-26 19:04:19.000000000 +0200 -+++ tests/misc/expand.pl 2015-07-09 17:15:19.622057589 +0200 +--- tests/misc/expand.pl.orig ++++ tests/misc/expand.pl @@ -23,6 +23,15 @@ use strict; # Turn off localization of executable's output. @ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3; @@ -4202,8 +4262,8 @@ Index: tests/misc/expand.pl Index: tests/misc/fold.pl =================================================================== ---- tests/misc/fold.pl.orig 2015-06-26 19:04:19.000000000 +0200 -+++ tests/misc/fold.pl 2015-07-09 17:15:19.623057566 +0200 +--- tests/misc/fold.pl.orig ++++ tests/misc/fold.pl @@ -20,9 +20,18 @@ use strict; (my $program_name = $0) =~ s|.*/||; @@ -4275,8 +4335,8 @@ Index: tests/misc/fold.pl exit $fail; Index: tests/misc/join.pl =================================================================== ---- tests/misc/join.pl.orig 2015-06-26 19:04:19.000000000 +0200 -+++ tests/misc/join.pl 2015-07-09 17:15:19.623057566 +0200 +--- tests/misc/join.pl.orig ++++ tests/misc/join.pl @@ -25,6 +25,15 @@ my $limits = getlimits (); my $prog = 'join'; @@ -4345,8 +4405,8 @@ Index: tests/misc/join.pl Index: tests/misc/sort-mb-tests.sh =================================================================== ---- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ tests/misc/sort-mb-tests.sh 2015-07-09 17:15:19.623057566 +0200 +--- /dev/null ++++ tests/misc/sort-mb-tests.sh @@ -0,0 +1,45 @@ +#!/bin/sh +# Verify sort's multi-byte support. @@ -4395,8 +4455,8 @@ Index: tests/misc/sort-mb-tests.sh +Exit $fail Index: tests/misc/sort-merge.pl =================================================================== ---- tests/misc/sort-merge.pl.orig 2015-06-26 19:04:19.000000000 +0200 -+++ tests/misc/sort-merge.pl 2015-07-09 17:15:19.623057566 +0200 +--- tests/misc/sort-merge.pl.orig ++++ tests/misc/sort-merge.pl @@ -26,6 +26,15 @@ my $prog = 'sort'; # Turn off localization of executable's output. @ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3; @@ -4455,8 +4515,8 @@ Index: tests/misc/sort-merge.pl Index: tests/misc/sort.pl =================================================================== ---- tests/misc/sort.pl.orig 2015-06-26 19:04:19.000000000 +0200 -+++ tests/misc/sort.pl 2015-07-09 17:28:20.750707716 +0200 +--- tests/misc/sort.pl.orig ++++ tests/misc/sort.pl @@ -24,10 +24,15 @@ my $prog = 'sort'; # Turn off localization of executable's output. @ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3; @@ -4474,7 +4534,7 @@ Index: tests/misc/sort.pl # 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 '-'. -@@ -419,6 +424,37 @@ foreach my $t (@Tests) +@@ -419,6 +424,38 @@ foreach my $t (@Tests) } } @@ -4504,6 +4564,7 @@ Index: tests/misc/sort.pl + #disable several failing tests until investigation, disable all tests with envvars set + next if (grep {ref $_ eq 'HASH' && exists $_->{ENV}} (@new_t)); + next if ($test_name =~ "18g" or $test_name =~ "sort-numeric" or $test_name =~ "08[ab]" or $test_name =~ "03[def]" or $test_name =~ "h4" or $test_name =~ "n1" or $test_name =~ "2[01]a"); ++ next if ($test_name =~ "11[ab]"); # avoid FP: expected result differs to MB result due to collation rules. + push @new, ["$test_name-mb", @new_t, {ENV => "LC_ALL=$mb_locale"}]; + } + push @Tests, @new; @@ -4512,7 +4573,7 @@ Index: tests/misc/sort.pl @Tests = triple_test \@Tests; # Remember that triple_test creates from each test with exactly one "IN" -@@ -428,6 +464,7 @@ foreach my $t (@Tests) +@@ -428,6 +465,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. @Tests = grep {$_->[0] ne 'output-is-input.p'} @Tests; @@ -4522,8 +4583,8 @@ Index: tests/misc/sort.pl my $verbose = $ENV{VERBOSE}; Index: tests/misc/unexpand.pl =================================================================== ---- tests/misc/unexpand.pl.orig 2015-06-26 19:04:19.000000000 +0200 -+++ tests/misc/unexpand.pl 2015-07-09 17:15:19.623057566 +0200 +--- tests/misc/unexpand.pl.orig ++++ tests/misc/unexpand.pl @@ -27,6 +27,14 @@ my $limits = getlimits (); my $prog = 'unexpand'; @@ -4579,8 +4640,8 @@ Index: tests/misc/unexpand.pl Index: tests/misc/uniq.pl =================================================================== ---- tests/misc/uniq.pl.orig 2015-06-26 19:04:19.000000000 +0200 -+++ tests/misc/uniq.pl 2015-07-09 17:15:19.623057566 +0200 +--- tests/misc/uniq.pl.orig ++++ tests/misc/uniq.pl @@ -23,9 +23,17 @@ my $limits = getlimits (); my $prog = 'uniq'; my $try = "Try '$prog --help' for more information.\n"; @@ -4655,13 +4716,12 @@ Index: tests/misc/uniq.pl Index: tests/pr/pr-tests.pl =================================================================== ---- tests/pr/pr-tests.pl.orig 2015-06-26 19:04:19.000000000 +0200 -+++ tests/pr/pr-tests.pl 2015-07-09 17:15:19.624057542 +0200 -@@ -22,6 +22,16 @@ use strict; - @ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3; - +--- tests/pr/pr-tests.pl.orig ++++ tests/pr/pr-tests.pl +@@ -24,6 +24,15 @@ use strict; my $prog = 'pr'; -+ + my $normalize_strerror = "s/': .*/'/"; + +my $mb_locale; +#Uncomment the following line to enable multibyte tests +$mb_locale = $ENV{LOCALE_FR_UTF8}; @@ -4671,10 +4731,10 @@ Index: tests/pr/pr-tests.pl +my $try = "Try \`$prog --help' for more information.\n"; +my $inval = "$prog: invalid byte, character or field list\n$try"; + - my $normalize_strerror = "s/': .*/'/"; - my @tv = ( -@@ -467,8 +477,48 @@ push @Tests, + + # -b option is no longer an official option. But it's still working to +@@ -467,8 +476,48 @@ push @Tests, {IN=>{3=>"x\ty\tz\n"}}, {OUT=>join("\t", qw(a b c m n o x y z)) . "\n"} ]; diff --git a/coreutils-testsuite.changes b/coreutils-testsuite.changes index f2683ce..ba5d7f7 100644 --- a/coreutils-testsuite.changes +++ b/coreutils-testsuite.changes @@ -1,3 +1,15 @@ +------------------------------------------------------------------- +Thu Jul 16 01:28:36 UTC 2015 - mail@bernhard-voelker.de + +- Sync I18N patch from semi-official repository (shared among + distributions, maintained by Padraig Brady): + https://github.com/pixelb/coreutils/tree/i18n + * coreutils-i18n.patch: Improve cut(1) performance in field-mode + in UTF8 locales. Squash in sort-keycompare-mb.patch. + * sort-keycompare-mb.patch: Remove. + +- coreutils-build-timeout-as-pie.patch: Refresh. + ------------------------------------------------------------------- Thu Jul 9 15:12:10 CEST 2015 - pth@suse.de @@ -151,7 +163,7 @@ Thu Jul 9 15:12:10 CEST 2015 - pth@suse.de coreutils-tests-shorten-extreme-factor-tests.patch sort-keycompare-mb.patch -- Patches removed because they're included in 8.24: +- Patches removed because they're included in 8.24: coreutils-chroot-perform-chdir-unless-skip-chdir.patch coreutils-df-doc-df-a-includes-duplicate-file-systems.patch coreutils-df-improve-mount-point-selection.patch diff --git a/coreutils-testsuite.spec b/coreutils-testsuite.spec index 533aa46..d8cf7e1 100644 --- a/coreutils-testsuite.spec +++ b/coreutils-testsuite.spec @@ -99,7 +99,6 @@ Source3: baselibs.conf Patch1: coreutils-remove_hostname_documentation.patch Patch3: coreutils-remove_kill_documentation.patch Patch4: coreutils-i18n.patch -Patch5: sort-keycompare-mb.patch Patch8: coreutils-sysinfo.patch Patch16: coreutils-invalid-ids.patch @@ -149,7 +148,6 @@ the GNU fileutils, sh-utils, and textutils packages. %prep %setup -q -n coreutils-%{version} %patch4 -%patch5 %patch1 %patch3 %patch8 diff --git a/coreutils.changes b/coreutils.changes index f2683ce..ba5d7f7 100644 --- a/coreutils.changes +++ b/coreutils.changes @@ -1,3 +1,15 @@ +------------------------------------------------------------------- +Thu Jul 16 01:28:36 UTC 2015 - mail@bernhard-voelker.de + +- Sync I18N patch from semi-official repository (shared among + distributions, maintained by Padraig Brady): + https://github.com/pixelb/coreutils/tree/i18n + * coreutils-i18n.patch: Improve cut(1) performance in field-mode + in UTF8 locales. Squash in sort-keycompare-mb.patch. + * sort-keycompare-mb.patch: Remove. + +- coreutils-build-timeout-as-pie.patch: Refresh. + ------------------------------------------------------------------- Thu Jul 9 15:12:10 CEST 2015 - pth@suse.de @@ -151,7 +163,7 @@ Thu Jul 9 15:12:10 CEST 2015 - pth@suse.de coreutils-tests-shorten-extreme-factor-tests.patch sort-keycompare-mb.patch -- Patches removed because they're included in 8.24: +- Patches removed because they're included in 8.24: coreutils-chroot-perform-chdir-unless-skip-chdir.patch coreutils-df-doc-df-a-includes-duplicate-file-systems.patch coreutils-df-improve-mount-point-selection.patch diff --git a/coreutils.spec b/coreutils.spec index 886f153..2d4f81f 100644 --- a/coreutils.spec +++ b/coreutils.spec @@ -99,7 +99,6 @@ Source3: baselibs.conf Patch1: coreutils-remove_hostname_documentation.patch Patch3: coreutils-remove_kill_documentation.patch Patch4: coreutils-i18n.patch -Patch5: sort-keycompare-mb.patch Patch8: coreutils-sysinfo.patch Patch16: coreutils-invalid-ids.patch @@ -149,7 +148,6 @@ the GNU fileutils, sh-utils, and textutils packages. %prep %setup -q -n coreutils-%{version} %patch4 -%patch5 %patch1 %patch3 %patch8 diff --git a/sort-keycompare-mb.patch b/sort-keycompare-mb.patch deleted file mode 100644 index 1b35ae9..0000000 --- a/sort-keycompare-mb.patch +++ /dev/null @@ -1,84 +0,0 @@ -Subject: sort i18n: make sure to NUL-terminate the sort keys - -Fixes http://bugs.gnu.org/18540 - -* src/sort.c (keycompare_mb): use the keys alone, i.e. null-terminated. -Patch analogously to non-multibyte upstream patch: - http://git.sv.gnu.org/cgit/coreutils.git/commit/?id=b877ea4b3e - -* tests/misc/sort.pl (23): Add test, taken from upstream patch: - http://git.sv.gnu.org/cgit/coreutils.git/commit/?id=4d8c4dfc21 -(11a): Exempt from MB run, as the collation order in the French -locale would provoke a false positive, because the strcoll() comparison -between the trailing blank and tabs leads to a different result there. -(11b): Likewise. - ---- - src/sort.c | 22 ++++++++++++++++++++-- - tests/misc/sort.pl | 1 + - 2 files changed, 21 insertions(+), 2 deletions(-) - -Index: src/sort.c -=================================================================== ---- src/sort.c.orig 2015-07-09 14:50:08.426211492 +0200 -+++ src/sort.c 2015-07-09 14:50:08.439211187 +0200 -@@ -3235,6 +3235,9 @@ keycompare_mb (const struct line *a, con - size_t lena = lima <= texta ? 0 : lima - texta; - size_t lenb = limb <= textb ? 0 : limb - textb; - -+ char enda IF_LINT (= 0); -+ char endb IF_LINT (= 0); -+ - char const *translate = key->translate; - bool const *ignore = key->ignore; - -@@ -3254,6 +3257,12 @@ keycompare_mb (const struct line *a, con - texta = copy_a; textb = copy_b; - lena = new_len_a; lenb = new_len_b; - } -+ else -+ { -+ /* Use the keys in-place, temporarily null-terminated. */ -+ enda = texta[lena]; texta[lena] = '\0'; -+ endb = textb[lenb]; textb[lenb] = '\0'; -+ } - - if (key->random) - diff = compare_random (texta, lena, textb, lenb); -@@ -3277,13 +3286,22 @@ keycompare_mb (const struct line *a, con - diff = 1; - else if (hard_LC_COLLATE && !folding) - { -- diff = xmemcoll0 (texta, lena, textb, lenb); -+ diff = xmemcoll0 (texta, lena + 1, textb, lenb + 1); - } - else -- diff = memcmp (texta, textb, MIN (lena + 1,lenb + 1)); -+ { -+ diff = memcmp (texta, textb, MIN (lena, lenb)); -+ if (diff == 0) -+ diff = lena < lenb ? -1 : lena != lenb; -+ } - - if (ignore || translate) - free (texta); -+ else -+ { -+ texta[lena] = enda; -+ textb[lenb] = endb; -+ } - - if (diff) - goto not_equal; -Index: tests/misc/sort.pl -=================================================================== ---- tests/misc/sort.pl.orig 2015-07-09 14:50:08.429211422 +0200 -+++ tests/misc/sort.pl 2015-07-09 14:50:08.440211164 +0200 -@@ -450,6 +450,7 @@ if ($mb_locale ne 'C') - #disable several failing tests until investigation, disable all tests with envvars set - next if (grep {ref $_ eq 'HASH' && exists $_->{ENV}} (@new_t)); - next if ($test_name =~ "18g" or $test_name =~ "sort-numeric" or $test_name =~ "08[ab]" or $test_name =~ "03[def]" or $test_name =~ "h4" or $test_name =~ "n1" or $test_name =~ "2[01]a"); -+ next if ($test_name =~ "11[ab]"); # avoid FP: expected result differs to MB result due to collation rules. - push @new, ["$test_name-mb", @new_t, {ENV => "LC_ALL=$mb_locale"}]; - } - push @Tests, @new;