From 7d37c15030e561c90426c556685e0c0cfe39c18b Mon Sep 17 00:00:00 2001 From: Rmys Date: Wed, 17 Aug 2022 10:01:07 +0300 Subject: [PATCH] coreutils-9.1 --- pisi-index.xml | 52 +- pisi-index.xml.sha1sum | 2 +- pisi-index.xml.xz | Bin 118448 -> 118528 bytes pisi-index.xml.xz.sha1sum | 2 +- .../files/coreutils-8.32-i18n-1.patch | 5528 +++++++++++++++++ .../files/remove_am_silent_rules.patch | 10 +- system/base/coreutils/pspec.xml | 15 +- 7 files changed, 5587 insertions(+), 22 deletions(-) create mode 100644 system/base/coreutils/files/coreutils-8.32-i18n-1.patch diff --git a/pisi-index.xml b/pisi-index.xml index f6e8209a..d18cb51b 100644 --- a/pisi-index.xml +++ b/pisi-index.xml @@ -6863,7 +6863,7 @@ POSIX 1003.1e capabilities library POSIX 1003.1e desteği libcap is a library for getting and setting POSIX.1e (formerly POSIX 6) draft 15 capabilities. - https://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/libcap-2.27.tar.xz + https://www.kernel.org/pub/linux/libs/security/linux-privs/libcap2/libcap-2.65.tar.xz attr-devel pam-devel @@ -6891,7 +6891,7 @@ libcap için geliştirme dosyaları system.devel - libcap + libcap /usr/include @@ -6916,6 +6916,13 @@ + + 2022-08-02 + 2.65 + Version bump. + Mustafa Cinasal + muscnsl@gmail.com + 2021-06-16 2.27 @@ -11675,7 +11682,7 @@ - 2022-08-13 + 2022-08-17 3.2.11 Version bump. Mustafa Cinasal @@ -15065,7 +15072,7 @@ Le paquet des utilitaires pour le fichier de mot de passe Shadow regroupe les programmes nécessaires à convertir les fichiers de mots de passe traditionnels V7*NIX au format de mot passe shadow SVR4 ainsi que d'autres outils destinés à la gestion des fichiers des groupes et de mots de passe (qui fonctionnent aussi bien pour les mots de passe shadow que non-shadow). The Shadow password file utilities package includes programs necessary to convert traditional V7 *NIX password files to the SVR4 shadow password format, and additional tools to maintain password and group files (that work with both shadow and non-shadow passwords). Shadow parola dosyası yardımcı uygulamalar paketi, geleneksel V7 *nix parola dosyalarını SVR4 shadow parola biçimine dönüştüren programlar ile parola ve grup dosyalarının bakımı için ilave araçlar içerir. - https://github.com/shadow-maint/shadow/releases/download/4.8.1/shadow-4.8.1.tar.xz + https://github.com/shadow-maint/shadow/releases/download/4.12.1/shadow-4.12.1.tar.xz pisi-shadowbase.sh @@ -15099,9 +15106,20 @@ /usr/share/doc /usr/share/info /usr/share/locale + /usr/include + + default/useradd + + + 2022-08-15 + 4.12.1 + Version bump. + Mustafa Cinasal + muscnsl@gmail.com + 2021-10-21 4.8.1 @@ -16618,7 +16636,7 @@ Standart dosya, metin ve kabuk uygulamaları Utilitaires standards GNU pour fichiers (chmod, cp, dd, dir, ls...), utilitaires texte (sort, tr, head, wc...) et utilitaires d'interpréteur de commande (shell) (whoami, who...) GNU dosya uygulamaları (chmod, cp, dd, dir, ls...), sh uygulamaları (whoami, who,...) ve metin uygulamalarının (sort, tr, head, wc..) birlikteliğinden oluşmaktadır. - http://ftp.gnu.org/gnu/coreutils/coreutils-8.31.tar.xz + http://ftp.gnu.org/gnu/coreutils/coreutils-9.1.tar.xz acl-devel attr-devel @@ -16631,11 +16649,9 @@ texinfo - coreutils-8.31-i18n-1.patch + coreutils-8.32-i18n-1.patch remove_am_silent_rules.patch coreutils-8.26-test-lock.patch - coreutils-8.31-improve-test-cp-proc-short-read.patch - coreutils-8.31-root-tests.patch system/base/coreutils/pspec.xml @@ -16660,6 +16676,13 @@ + + 2022-08-03 + 9.1 + Version bump. + Mustafa Cinasal + muscnsl@gmail.com + 2021-01-20 8.31 @@ -17401,7 +17424,7 @@ attr offre des utilitaires qui servent à manipuler les attributs étendus des objects de système de fichier. attr contains a set of tools for manipulating extended attributes on filesystem objects, in particular getfattr and setfattr. attr dosya sistemi nesnelerinin özniteliklerini değiştirmek için gerekli bir dizi araç sunar. - http://download.savannah.nongnu.org/releases/attr/attr-2.4.48.tar.gz + http://download.savannah.nongnu.org/releases/attr/attr-2.5.1.tar.gz system/base/attr/pspec.xml @@ -17421,7 +17444,7 @@ attr için geliştirme dosyaları system.devel - attr + attr /usr/include @@ -17436,7 +17459,7 @@ emul32 emul32 - attr + attr /lib32 @@ -17446,6 +17469,13 @@ + + 2022-08-11 + 2.5.1 + Version bump. + Mustafa Cinasal + muscnsl@gmail.com + 2020-12-09 2.4.48 diff --git a/pisi-index.xml.sha1sum b/pisi-index.xml.sha1sum index f6cda3fa..774dea3c 100644 --- a/pisi-index.xml.sha1sum +++ b/pisi-index.xml.sha1sum @@ -1 +1 @@ -0a274dbba301ca38dff5a613dd0eee5266861ddc \ No newline at end of file +f7c2cad88eb69acf9d8df2805a03b54b679ffd59 \ No newline at end of file diff --git a/pisi-index.xml.xz b/pisi-index.xml.xz index c5b1be59f1d6113e35cc3cf18fc05039683f5cd9..97d6260756b882144f118db9c591f407675210fc 100644 GIT binary patch delta 89176 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%0DCa4Kb0>BFj8cH+O1mLf3SOOprO_1C#vl$(y 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 ! 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 U_ivuMU?)-EPJXbl}gyn={$}wn^~wAoiWmdGXby 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 +Date: Mon, 4 Oct 2021 08:54:37 +0200 +Subject: [PATCH] coreutils-i18n.patch + +--- + bootstrap.conf | 1 + + configure.ac | 2 + + lib/linebuffer.h | 8 + + lib/mbfile.c | 3 + + lib/mbfile.h | 255 ++++++++++++ + m4/mbfile.m4 | 14 + + src/cut.c | 508 +++++++++++++++++++++-- + src/expand-common.c | 114 ++++++ + src/expand-common.h | 12 + + src/expand.c | 90 +++- + src/fold.c | 312 ++++++++++++-- + src/join.c | 359 ++++++++++++++-- + src/local.mk | 4 +- + src/pr.c | 443 ++++++++++++++++++-- + src/sort.c | 792 +++++++++++++++++++++++++++++++++--- + src/unexpand.c | 103 ++++- + src/uniq.c | 119 +++++- + tests/Coreutils.pm | 3 + + tests/expand/mb.sh | 183 +++++++++ + tests/i18n/sort.sh | 29 ++ + tests/local.mk | 4 + + tests/misc/expand.pl | 42 ++ + tests/misc/fold.pl | 50 ++- + tests/misc/join.pl | 50 +++ + tests/misc/sort-mb-tests.sh | 45 ++ + tests/misc/sort-merge.pl | 42 ++ + tests/misc/sort.pl | 40 +- + tests/misc/unexpand.pl | 39 ++ + tests/misc/uniq.pl | 55 +++ + tests/pr/pr-tests.pl | 49 +++ + tests/unexpand/mb.sh | 172 ++++++++ + 31 files changed, 3700 insertions(+), 242 deletions(-) + create mode 100644 lib/mbfile.c + create mode 100644 lib/mbfile.h + create mode 100644 m4/mbfile.m4 + create mode 100755 tests/expand/mb.sh + create mode 100755 tests/i18n/sort.sh + create mode 100755 tests/misc/sort-mb-tests.sh + create mode 100755 tests/unexpand/mb.sh + +diff --git a/bootstrap.conf b/bootstrap.conf +index c1399e3..60b39cf 100644 +--- a/bootstrap.conf ++++ b/bootstrap.conf +@@ -162,6 +162,7 @@ gnulib_modules=" + maintainer-makefile + malloc-gnu + manywarnings ++ mbfile + mbrlen + mbrtowc + mbsalign +diff --git a/configure.ac b/configure.ac +index 7e4afc9..4656a35 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -476,6 +476,8 @@ fi + # I'm leaving it here for now. This whole thing needs to be modernized... + gl_WINSIZE_IN_PTEM + ++gl_MBFILE ++ + gl_HEADER_TIOCGWINSZ_IN_TERMIOS_H + + if test $gl_cv_sys_tiocgwinsz_needs_termios_h = no && \ +diff --git a/lib/linebuffer.h b/lib/linebuffer.h +index 07d45ca..af62e6c 100644 +--- a/lib/linebuffer.h ++++ b/lib/linebuffer.h +@@ -22,6 +22,11 @@ + # include "idx.h" + # include + ++/* Get mbstate_t. */ ++# if HAVE_WCHAR_H ++# include ++# endif ++ + /* A 'struct linebuffer' holds a line of text. */ + + struct linebuffer +@@ -29,6 +34,9 @@ struct linebuffer + idx_t size; /* Allocated. */ + idx_t length; /* Used. */ + char *buffer; ++# if HAVE_WCHAR_H ++ mbstate_t state; ++# endif + }; + + /* Initialize linebuffer LINEBUFFER for use. */ +diff --git a/lib/mbfile.c b/lib/mbfile.c +new file mode 100644 +index 0000000..b0a468e +--- /dev/null ++++ b/lib/mbfile.c +@@ -0,0 +1,3 @@ ++#include ++#define MBFILE_INLINE _GL_EXTERN_INLINE ++#include "mbfile.h" +diff --git a/lib/mbfile.h b/lib/mbfile.h +new file mode 100644 +index 0000000..11f1b12 +--- /dev/null ++++ b/lib/mbfile.h +@@ -0,0 +1,255 @@ ++/* Multibyte character I/O: macros for multi-byte encodings. ++ Copyright (C) 2001, 2005, 2009-2015 Free Software Foundation, Inc. ++ ++ This program is free software: you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . */ ++ ++/* Written by Mitsuru Chinen ++ and Bruno Haible . */ ++ ++/* The macros in this file implement multi-byte character input from a ++ stream. ++ ++ mb_file_t ++ is the type for multibyte character input stream, usable for variable ++ declarations. ++ ++ mbf_char_t ++ is the type for multibyte character or EOF, usable for variable ++ declarations. ++ ++ mbf_init (mbf, stream) ++ initializes the MB_FILE for reading from stream. ++ ++ mbf_getc (mbc, mbf) ++ reads the next multibyte character from mbf and stores it in mbc. ++ ++ mb_iseof (mbc) ++ returns true if mbc represents the EOF value. ++ ++ Here are the function prototypes of the macros. ++ ++ extern void mbf_init (mb_file_t mbf, FILE *stream); ++ extern void mbf_getc (mbf_char_t mbc, mb_file_t mbf); ++ extern bool mb_iseof (const mbf_char_t mbc); ++ */ ++ ++#ifndef _MBFILE_H ++#define _MBFILE_H 1 ++ ++#include ++#include ++#include ++#include ++ ++/* Tru64 with Desktop Toolkit C has a bug: must be included before ++ . ++ BSD/OS 4.1 has a bug: and must be included before ++ . */ ++#include ++#include ++#include ++ ++#include "mbchar.h" ++ ++#ifndef _GL_INLINE_HEADER_BEGIN ++ #error "Please include config.h first." ++#endif ++_GL_INLINE_HEADER_BEGIN ++#ifndef MBFILE_INLINE ++# define MBFILE_INLINE _GL_INLINE ++#endif ++ ++struct mbfile_multi { ++ FILE *fp; ++ bool eof_seen; ++ bool have_pushback; ++ mbstate_t state; ++ unsigned int bufcount; ++ char buf[MBCHAR_BUF_SIZE]; ++ struct mbchar pushback; ++}; ++ ++MBFILE_INLINE void ++mbfile_multi_getc (struct mbchar *mbc, struct mbfile_multi *mbf) ++{ ++ size_t bytes; ++ ++ /* If EOF has already been seen, don't use getc. This matters if ++ mbf->fp is connected to an interactive tty. */ ++ if (mbf->eof_seen) ++ goto eof; ++ ++ /* Return character pushed back, if there is one. */ ++ if (mbf->have_pushback) ++ { ++ mb_copy (mbc, &mbf->pushback); ++ mbf->have_pushback = false; ++ return; ++ } ++ ++ /* Before using mbrtowc, we need at least one byte. */ ++ if (mbf->bufcount == 0) ++ { ++ int c = getc (mbf->fp); ++ if (c == EOF) ++ { ++ mbf->eof_seen = true; ++ goto eof; ++ } ++ mbf->buf[0] = (unsigned char) c; ++ mbf->bufcount++; ++ } ++ ++ /* Handle most ASCII characters quickly, without calling mbrtowc(). */ ++ if (mbf->bufcount == 1 && mbsinit (&mbf->state) && is_basic (mbf->buf[0])) ++ { ++ /* These characters are part of the basic character set. ISO C 99 ++ guarantees that their wide character code is identical to their ++ char code. */ ++ mbc->wc = mbc->buf[0] = mbf->buf[0]; ++ mbc->wc_valid = true; ++ mbc->ptr = &mbc->buf[0]; ++ mbc->bytes = 1; ++ mbf->bufcount = 0; ++ return; ++ } ++ ++ /* Use mbrtowc on an increasing number of bytes. Read only as many bytes ++ from mbf->fp as needed. This is needed to give reasonable interactive ++ behaviour when mbf->fp is connected to an interactive tty. */ ++ for (;;) ++ { ++ /* We don't know whether the 'mbrtowc' function updates the state when ++ it returns -2, - this is the ISO C 99 and glibc-2.2 behaviour - or ++ not - amended ANSI C, glibc-2.1 and Solaris 2.7 behaviour. We ++ don't have an autoconf test for this, yet. ++ The new behaviour would allow us to feed the bytes one by one into ++ mbrtowc. But the old behaviour forces us to feed all bytes since ++ the end of the last character into mbrtowc. Since we want to retry ++ with more bytes when mbrtowc returns -2, we must backup the state ++ before calling mbrtowc, because implementations with the new ++ behaviour will clobber it. */ ++ mbstate_t backup_state = mbf->state; ++ ++ bytes = mbrtowc (&mbc->wc, &mbf->buf[0], mbf->bufcount, &mbf->state); ++ ++ if (bytes == (size_t) -1) ++ { ++ /* An invalid multibyte sequence was encountered. */ ++ /* Return a single byte. */ ++ bytes = 1; ++ mbc->wc_valid = false; ++ break; ++ } ++ else if (bytes == (size_t) -2) ++ { ++ /* An incomplete multibyte character. */ ++ mbf->state = backup_state; ++ if (mbf->bufcount == MBCHAR_BUF_SIZE) ++ { ++ /* An overlong incomplete multibyte sequence was encountered. */ ++ /* Return a single byte. */ ++ bytes = 1; ++ mbc->wc_valid = false; ++ break; ++ } ++ else ++ { ++ /* Read one more byte and retry mbrtowc. */ ++ int c = getc (mbf->fp); ++ if (c == EOF) ++ { ++ /* An incomplete multibyte character at the end. */ ++ mbf->eof_seen = true; ++ bytes = mbf->bufcount; ++ mbc->wc_valid = false; ++ break; ++ } ++ mbf->buf[mbf->bufcount] = (unsigned char) c; ++ mbf->bufcount++; ++ } ++ } ++ else ++ { ++ if (bytes == 0) ++ { ++ /* A null wide character was encountered. */ ++ bytes = 1; ++ assert (mbf->buf[0] == '\0'); ++ assert (mbc->wc == 0); ++ } ++ mbc->wc_valid = true; ++ break; ++ } ++ } ++ ++ /* Return the multibyte sequence mbf->buf[0..bytes-1]. */ ++ mbc->ptr = &mbc->buf[0]; ++ memcpy (&mbc->buf[0], &mbf->buf[0], bytes); ++ mbc->bytes = bytes; ++ ++ mbf->bufcount -= bytes; ++ if (mbf->bufcount > 0) ++ { ++ /* It's not worth calling memmove() for so few bytes. */ ++ unsigned int count = mbf->bufcount; ++ char *p = &mbf->buf[0]; ++ ++ do ++ { ++ *p = *(p + bytes); ++ p++; ++ } ++ while (--count > 0); ++ } ++ return; ++ ++eof: ++ /* An mbchar_t with bytes == 0 is used to indicate EOF. */ ++ mbc->ptr = NULL; ++ mbc->bytes = 0; ++ mbc->wc_valid = false; ++ return; ++} ++ ++MBFILE_INLINE void ++mbfile_multi_ungetc (const struct mbchar *mbc, struct mbfile_multi *mbf) ++{ ++ mb_copy (&mbf->pushback, mbc); ++ mbf->have_pushback = true; ++} ++ ++typedef struct mbfile_multi mb_file_t; ++ ++typedef mbchar_t mbf_char_t; ++ ++#define mbf_init(mbf, stream) \ ++ ((mbf).fp = (stream), \ ++ (mbf).eof_seen = false, \ ++ (mbf).have_pushback = false, \ ++ memset (&(mbf).state, '\0', sizeof (mbstate_t)), \ ++ (mbf).bufcount = 0) ++ ++#define mbf_getc(mbc, mbf) mbfile_multi_getc (&(mbc), &(mbf)) ++ ++#define mbf_ungetc(mbc, mbf) mbfile_multi_ungetc (&(mbc), &(mbf)) ++ ++#define mb_iseof(mbc) ((mbc).bytes == 0) ++ ++#ifndef _GL_INLINE_HEADER_BEGIN ++ #error "Please include config.h first." ++#endif ++_GL_INLINE_HEADER_BEGIN ++ ++#endif /* _MBFILE_H */ +diff --git a/m4/mbfile.m4 b/m4/mbfile.m4 +new file mode 100644 +index 0000000..8589902 +--- /dev/null ++++ b/m4/mbfile.m4 +@@ -0,0 +1,14 @@ ++# mbfile.m4 serial 7 ++dnl Copyright (C) 2005, 2008-2015 Free Software Foundation, Inc. ++dnl This file is free software; the Free Software Foundation ++dnl gives unlimited permission to copy and/or distribute it, ++dnl with or without modifications, as long as this notice is preserved. ++ ++dnl autoconf tests required for use of mbfile.h ++dnl From Bruno Haible. ++ ++AC_DEFUN([gl_MBFILE], ++[ ++ AC_REQUIRE([AC_TYPE_MBSTATE_T]) ++ : ++]) +diff --git a/src/cut.c b/src/cut.c +index 6fd8978..faef877 100644 +--- a/src/cut.c ++++ b/src/cut.c +@@ -28,6 +28,11 @@ + #include + #include + #include ++ ++/* Get mbstate_t, mbrtowc(). */ ++#if HAVE_WCHAR_H ++# include ++#endif + #include "system.h" + + #include "error.h" +@@ -37,6 +42,18 @@ + + #include "set-fields.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 ++ + /* The official name of this program (e.g., no 'g' prefix). */ + #define PROGRAM_NAME "cut" + +@@ -53,6 +70,52 @@ + } \ + while (0) + ++/* Refill the buffer BUF to get a multibyte character. */ ++#define REFILL_BUFFER(BUF, BUFPOS, BUFLEN, STREAM) \ ++ do \ ++ { \ ++ if (BUFLEN < MB_LEN_MAX && !feof (STREAM) && !ferror (STREAM)) \ ++ { \ ++ memmove (BUF, BUFPOS, BUFLEN); \ ++ BUFLEN += fread (BUF + BUFLEN, sizeof(char), BUFSIZ, STREAM); \ ++ BUFPOS = BUF; \ ++ } \ ++ } \ ++ while (0) ++ ++/* Get wide character on BUFPOS. BUFPOS is not included after that. ++ If byte sequence is not valid as a character, CONVFAIL is true. Otherwise false. */ ++#define GET_NEXT_WC_FROM_BUFFER(WC, BUFPOS, BUFLEN, MBLENGTH, STATE, CONVFAIL) \ ++ do \ ++ { \ ++ mbstate_t state_bak; \ ++ \ ++ if (BUFLEN < 1) \ ++ { \ ++ WC = WEOF; \ ++ break; \ ++ } \ ++ \ ++ /* Get a wide character. */ \ ++ CONVFAIL = false; \ ++ state_bak = STATE; \ ++ MBLENGTH = mbrtowc ((wchar_t *)&WC, BUFPOS, BUFLEN, &STATE); \ ++ \ ++ switch (MBLENGTH) \ ++ { \ ++ case (size_t)-1: \ ++ case (size_t)-2: \ ++ CONVFAIL = true; \ ++ STATE = state_bak; \ ++ /* Fall througn. */ \ ++ \ ++ case 0: \ ++ MBLENGTH = 1; \ ++ break; \ ++ } \ ++ } \ ++ while (0) ++ + + /* Pointer inside RP. When checking if a byte or field is selected + by a finite range, we check if it is between CURRENT_RP.LO +@@ -60,6 +123,9 @@ + CURRENT_RP.HI then we make CURRENT_RP to point to the next range pair. */ + static struct field_range_pair *current_rp; + ++/* Length of the delimiter given as argument to -d. */ ++size_t delimlen; ++ + /* This buffer is used to support the semantics of the -s option + (or lack of same) when the specified field list includes (does + not include) the first field. In both of those cases, the entire +@@ -72,6 +138,29 @@ static char *field_1_buffer; + /* The number of bytes allocated for FIELD_1_BUFFER. */ + static size_t field_1_bufsize; + ++enum operating_mode ++ { ++ undefined_mode, ++ ++ /* Output bytes that are at the given positions. */ ++ byte_mode, ++ ++ /* Output characters that are at the given positions. */ ++ character_mode, ++ ++ /* Output the given delimiter-separated fields. */ ++ field_mode ++ }; ++ ++static enum operating_mode operating_mode; ++ ++/* If nonzero, when in byte mode, don't split multibyte characters. */ ++static int byte_mode_character_aware; ++ ++/* If nonzero, the function for single byte locale is work ++ if this program runs on multibyte locale. */ ++static int force_singlebyte_mode; ++ + /* If true do not output lines containing no delimiter characters. + Otherwise, all such lines are printed. This option is valid only + with field mode. */ +@@ -83,10 +172,16 @@ static bool complement; + + /* The delimiter character for field mode. */ + static unsigned char delim; ++#if HAVE_WCHAR_H ++static wchar_t wcdelim; ++#endif + + /* The delimiter for each line/record. */ + static unsigned char line_delim = '\n'; + ++/* True if the --output-delimiter=STRING option was specified. */ ++static bool output_delimiter_specified; ++ + /* The length of output_delimiter_string. */ + static size_t output_delimiter_length; + +@@ -94,9 +189,6 @@ static size_t output_delimiter_length; + string consisting of the input delimiter. */ + static char *output_delimiter_string; + +-/* The output delimiter string contents, if the default. */ +-static char output_delimiter_default[1]; +- + /* True if we have ever read standard input. */ + static bool have_read_stdin; + +@@ -150,7 +242,7 @@ Print selected parts of lines from each FILE to standard output.\n\ + -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\ +- -n (ignored)\n\ ++ -n with -b: don't split multibyte characters\n\ + "), stdout); + fputs (_("\ + --complement complement the set of selected bytes, characters\n\ +@@ -250,7 +342,7 @@ cut_bytes (FILE *stream) + next_item (&byte_idx); + if (print_kth (byte_idx)) + { +- if (output_delimiter_string != output_delimiter_default) ++ if (output_delimiter_specified) + { + if (print_delimiter && is_range_start_index (byte_idx)) + { +@@ -266,6 +358,82 @@ cut_bytes (FILE *stream) + } + } + ++#if HAVE_MBRTOWC ++/* This function is in use for the following case. ++ ++ 1. Read from the stream STREAM, printing to standard output any selected ++ characters. ++ ++ 2. Read from stream STREAM, printing to standard output any selected bytes, ++ without splitting multibyte characters. */ ++ ++static void ++cut_characters_or_cut_bytes_no_split (FILE *stream) ++{ ++ uintmax_t idx; /* number of bytes or characters in the line so far. */ ++ char buf[MB_LEN_MAX + BUFSIZ]; /* For spooling a read byte sequence. */ ++ char *bufpos; /* Next read position of BUF. */ ++ size_t buflen; /* The length of the byte sequence in buf. */ ++ wint_t wc; /* A gotten wide character. */ ++ size_t mblength; /* The byte size of a multibyte character which shows ++ as same character as WC. */ ++ mbstate_t state; /* State of the stream. */ ++ bool convfail = false; /* true, when conversion failed. Otherwise false. */ ++ /* Whether to begin printing delimiters between ranges for the current line. ++ Set after we've begun printing data corresponding to the first range. */ ++ bool print_delimiter = false; ++ ++ idx = 0; ++ buflen = 0; ++ bufpos = buf; ++ memset (&state, '\0', sizeof(mbstate_t)); ++ ++ current_rp = frp; ++ ++ while (1) ++ { ++ REFILL_BUFFER (buf, bufpos, buflen, stream); ++ ++ GET_NEXT_WC_FROM_BUFFER (wc, bufpos, buflen, mblength, state, convfail); ++ (void) convfail; /* ignore unused */ ++ ++ if (wc == WEOF) ++ { ++ if (idx > 0) ++ putchar (line_delim); ++ break; ++ } ++ else if (wc == line_delim) ++ { ++ putchar (line_delim); ++ idx = 0; ++ print_delimiter = false; ++ current_rp = frp; ++ } ++ else ++ { ++ next_item (&idx); ++ if (print_kth (idx)) ++ { ++ if (output_delimiter_specified) ++ { ++ if (print_delimiter && is_range_start_index (idx)) ++ { ++ fwrite (output_delimiter_string, sizeof (char), ++ output_delimiter_length, stdout); ++ } ++ print_delimiter = true; ++ } ++ fwrite (bufpos, mblength, sizeof(char), stdout); ++ } ++ } ++ ++ buflen -= mblength; ++ bufpos += mblength; ++ } ++} ++#endif ++ + /* Read from stream STREAM, printing to standard output any selected fields. */ + + static void +@@ -411,11 +579,218 @@ cut_fields (FILE *stream) + } + } + +-/* Process file FILE to standard output, using CUT_STREAM. ++#if HAVE_MBRTOWC ++static void ++cut_fields_mb (FILE *stream) ++{ ++ int c; ++ uintmax_t field_idx; ++ int found_any_selected_field; ++ int buffer_first_field; ++ int empty_input; ++ char buf[MB_LEN_MAX + BUFSIZ]; /* For spooling a read byte sequence. */ ++ char *bufpos; /* Next read position of BUF. */ ++ size_t buflen; /* The length of the byte sequence in buf. */ ++ wint_t wc = 0; /* A gotten wide character. */ ++ size_t mblength; /* The byte size of a multibyte character which shows ++ as same character as WC. */ ++ mbstate_t state; /* State of the stream. */ ++ bool convfail = false; /* true, when conversion failed. Otherwise false. */ ++ ++ current_rp = frp; ++ ++ found_any_selected_field = 0; ++ field_idx = 1; ++ bufpos = buf; ++ buflen = 0; ++ memset (&state, '\0', sizeof(mbstate_t)); ++ ++ c = getc (stream); ++ empty_input = (c == EOF); ++ if (c != EOF) ++ { ++ ungetc (c, stream); ++ wc = 0; ++ } ++ else ++ wc = WEOF; ++ ++ /* To support the semantics of the -s flag, we may have to buffer ++ all of the first field to determine whether it is `delimited.' ++ But that is unnecessary if all non-delimited lines must be printed ++ and the first field has been selected, or if non-delimited lines ++ must be suppressed and the first field has *not* been selected. ++ That is because a non-delimited line has exactly one field. */ ++ buffer_first_field = (suppress_non_delimited ^ !print_kth (1)); ++ ++ while (1) ++ { ++ if (field_idx == 1 && buffer_first_field) ++ { ++ int len = 0; ++ ++ while (1) ++ { ++ REFILL_BUFFER (buf, bufpos, buflen, stream); ++ ++ GET_NEXT_WC_FROM_BUFFER ++ (wc, bufpos, buflen, mblength, state, convfail); ++ ++ if (wc == WEOF) ++ break; ++ ++ field_1_buffer = xrealloc (field_1_buffer, len + mblength); ++ memcpy (field_1_buffer + len, bufpos, mblength); ++ len += mblength; ++ buflen -= mblength; ++ bufpos += mblength; ++ ++ if (!convfail && (wc == line_delim || wc == wcdelim)) ++ break; ++ } ++ ++ if (len <= 0 && wc == WEOF) ++ break; ++ ++ /* If the first field extends to the end of line (it is not ++ delimited) and we are printing all non-delimited lines, ++ print this one. */ ++ if (convfail || (!convfail && wc != wcdelim)) ++ { ++ if (suppress_non_delimited) ++ { ++ /* Empty. */ ++ } ++ else ++ { ++ fwrite (field_1_buffer, sizeof (char), len, stdout); ++ /* Make sure the output line is newline terminated. */ ++ if (convfail || (!convfail && wc != line_delim)) ++ putchar (line_delim); ++ } ++ continue; ++ } ++ ++ if (print_kth (1)) ++ { ++ /* Print the field, but not the trailing delimiter. */ ++ fwrite (field_1_buffer, sizeof (char), len - 1, stdout); ++ found_any_selected_field = 1; ++ } ++ next_item (&field_idx); ++ } ++ ++ if (wc != WEOF) ++ { ++ if (print_kth (field_idx)) ++ { ++ if (found_any_selected_field) ++ { ++ fwrite (output_delimiter_string, sizeof (char), ++ output_delimiter_length, stdout); ++ } ++ found_any_selected_field = 1; ++ } ++ ++ while (1) ++ { ++ REFILL_BUFFER (buf, bufpos, buflen, stream); ++ ++ GET_NEXT_WC_FROM_BUFFER ++ (wc, bufpos, buflen, mblength, state, convfail); ++ ++ if (wc == WEOF) ++ break; ++ else if (!convfail && (wc == wcdelim || wc == line_delim)) ++ { ++ buflen -= mblength; ++ bufpos += mblength; ++ break; ++ } ++ ++ if (print_kth (field_idx)) ++ fwrite (bufpos, mblength, sizeof(char), stdout); ++ ++ buflen -= mblength; ++ bufpos += mblength; ++ } ++ } ++ ++ if ((!convfail || wc == line_delim) && buflen < 1) ++ wc = WEOF; ++ ++ if (!convfail && wc == wcdelim) ++ next_item (&field_idx); ++ else if (wc == WEOF || (!convfail && wc == line_delim)) ++ { ++ if (found_any_selected_field ++ || (!empty_input && !(suppress_non_delimited && field_idx == 1))) ++ putchar (line_delim); ++ if (wc == WEOF) ++ break; ++ field_idx = 1; ++ current_rp = frp; ++ found_any_selected_field = 0; ++ } ++ } ++} ++#endif ++ ++static void ++cut_stream (FILE *stream) ++{ ++#if HAVE_MBRTOWC ++ if (MB_CUR_MAX > 1 && !force_singlebyte_mode) ++ { ++ switch (operating_mode) ++ { ++ case byte_mode: ++ if (byte_mode_character_aware) ++ cut_characters_or_cut_bytes_no_split (stream); ++ else ++ cut_bytes (stream); ++ break; ++ ++ case character_mode: ++ cut_characters_or_cut_bytes_no_split (stream); ++ break; ++ ++ case field_mode: ++ if (delimlen == 1) ++ { ++ /* 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: ++ abort (); ++ } ++ } ++ else ++#endif ++ { ++ if (operating_mode == field_mode) ++ cut_fields (stream); ++ else ++ cut_bytes (stream); ++ } ++} ++ ++/* Process file FILE to standard output. + Return true if successful. */ + + static bool +-cut_file (char const *file, void (*cut_stream) (FILE *)) ++cut_file (char const *file) + { + FILE *stream; + +@@ -459,8 +834,8 @@ main (int argc, char **argv) + int optc; + bool ok; + bool delim_specified = false; +- bool byte_mode = false; +- char *spec_list_string = NULL; ++ char *spec_list_string IF_LINT ( = NULL); ++ char mbdelim[MB_LEN_MAX + 1]; + + initialize_main (&argc, &argv); + set_program_name (argv[0]); +@@ -470,6 +845,8 @@ main (int argc, char **argv) + + atexit (close_stdout); + ++ operating_mode = undefined_mode; ++ + /* By default, all non-delimited lines are printed. */ + suppress_non_delimited = false; + +@@ -481,35 +858,77 @@ main (int argc, char **argv) + switch (optc) + { + case 'b': +- case 'c': + /* Build the byte list. */ +- byte_mode = true; +- FALLTHROUGH; ++ if (operating_mode != undefined_mode) ++ FATAL_ERROR (_("only one type of list may be specified")); ++ operating_mode = byte_mode; ++ spec_list_string = optarg; ++ break; ++ ++ case 'c': ++ /* Build the character list. */ ++ if (operating_mode != undefined_mode) ++ FATAL_ERROR (_("only one type of list may be specified")); ++ operating_mode = character_mode; ++ spec_list_string = optarg; ++ break; ++ + case 'f': + /* Build the field list. */ +- if (spec_list_string) +- FATAL_ERROR (_("only one list may be specified")); ++ if (operating_mode != undefined_mode) ++ FATAL_ERROR (_("only one type of list may be specified")); ++ operating_mode = field_mode; + spec_list_string = optarg; + break; + + case 'd': + /* New delimiter. */ + /* Interpret -d '' to mean 'use the NUL byte as the delimiter.' */ +- if (optarg[0] != '\0' && optarg[1] != '\0') +- FATAL_ERROR (_("the delimiter must be a single character")); +- delim = optarg[0]; +- delim_specified = true; ++ { ++#if HAVE_MBRTOWC ++ if(MB_CUR_MAX > 1) ++ { ++ mbstate_t state; ++ ++ memset (&state, '\0', sizeof(mbstate_t)); ++ delimlen = mbrtowc (&wcdelim, optarg, strnlen(optarg, MB_LEN_MAX), &state); ++ ++ if (delimlen == (size_t)-1 || delimlen == (size_t)-2) ++ ++force_singlebyte_mode; ++ else ++ { ++ delimlen = (delimlen < 1) ? 1 : delimlen; ++ if (wcdelim != L'\0' && *(optarg + delimlen) != '\0') ++ FATAL_ERROR (_("the delimiter must be a single character")); ++ memcpy (mbdelim, optarg, delimlen); ++ mbdelim[delimlen] = '\0'; ++ if (delimlen == 1) ++ delim = *optarg; ++ } ++ } ++ ++ if (MB_CUR_MAX <= 1 || force_singlebyte_mode) ++#endif ++ { ++ if (optarg[0] != '\0' && optarg[1] != '\0') ++ FATAL_ERROR (_("the delimiter must be a single character")); ++ delim = (unsigned char) optarg[0]; ++ } ++ delim_specified = true; ++ } + break; + + case OUTPUT_DELIMITER_OPTION: ++ output_delimiter_specified = true; + /* Interpret --output-delimiter='' to mean + 'use the NUL byte as the delimiter.' */ + output_delimiter_length = (optarg[0] == '\0' + ? 1 : strlen (optarg)); +- output_delimiter_string = optarg; ++ output_delimiter_string = xstrdup (optarg); + break; + + case 'n': ++ byte_mode_character_aware = 1; + break; + + case 's': +@@ -533,40 +952,57 @@ main (int argc, char **argv) + } + } + +- if (!spec_list_string) ++ if (operating_mode == undefined_mode) + FATAL_ERROR (_("you must specify a list of bytes, characters, or fields")); + +- if (byte_mode) +- { +- if (delim_specified) +- FATAL_ERROR (_("an input delimiter may be specified only\ ++ if (delim_specified && operating_mode != field_mode) ++ FATAL_ERROR (_("an input delimiter may be specified only\ + when operating on fields")); + +- if (suppress_non_delimited) +- FATAL_ERROR (_("suppressing non-delimited lines makes sense\n\ ++ if (suppress_non_delimited && operating_mode != field_mode) ++ FATAL_ERROR (_("suppressing non-delimited lines makes sense\n\ + \tonly when operating on fields")); +- } + + set_fields (spec_list_string, +- ((byte_mode ? SETFLD_ERRMSG_USE_POS : 0) +- | (complement ? SETFLD_COMPLEMENT : 0))); ++ ( (operating_mode == field_mode) ? 0 : SETFLD_ERRMSG_USE_POS) ++ | (complement ? SETFLD_COMPLEMENT : 0) ); + + if (!delim_specified) +- delim = '\t'; ++ { ++ delim = '\t'; ++#ifdef HAVE_MBRTOWC ++ wcdelim = L'\t'; ++ mbdelim[0] = '\t'; ++ mbdelim[1] = '\0'; ++ delimlen = 1; ++#endif ++ } + + if (output_delimiter_string == NULL) + { +- output_delimiter_default[0] = delim; +- output_delimiter_string = output_delimiter_default; +- output_delimiter_length = 1; ++#ifdef HAVE_MBRTOWC ++ if (MB_CUR_MAX > 1 && !force_singlebyte_mode) ++ { ++ output_delimiter_string = xstrdup(mbdelim); ++ output_delimiter_length = delimlen; ++ } ++ ++ if (MB_CUR_MAX <= 1 || force_singlebyte_mode) ++#endif ++ { ++ static char dummy[2]; ++ dummy[0] = delim; ++ dummy[1] = '\0'; ++ output_delimiter_string = dummy; ++ output_delimiter_length = 1; ++ } + } + +- void (*cut_stream) (FILE *) = byte_mode ? cut_bytes : cut_fields; + if (optind == argc) +- ok = cut_file ("-", cut_stream); ++ ok = cut_file ("-"); + else + for (ok = true; optind < argc; optind++) +- ok &= cut_file (argv[optind], cut_stream); ++ ok &= cut_file (argv[optind]); + + + if (have_read_stdin && fclose (stdin) == EOF) +diff --git a/src/expand-common.c b/src/expand-common.c +index deec1bd..b39f740 100644 +--- a/src/expand-common.c ++++ b/src/expand-common.c +@@ -19,6 +19,7 @@ + #include + #include + #include ++#include + #include "system.h" + #include "die.h" + #include "error.h" +@@ -125,6 +126,119 @@ set_increment_size (uintmax_t tabval) + return ok; + } + ++extern int ++set_utf_locale (void) ++{ ++ /*try using some predefined locale */ ++ const char* predef_locales[] = {"C.UTF8","en_US.UTF8","en_GB.UTF8"}; ++ ++ const int predef_locales_count=3; ++ for (int i=0;ibufcount=0; ++ if (c == 0xEF) ++ { ++ c=fgetc(fp); ++ } ++ else ++ { ++ if (c != EOF) ++ { ++ ungetc(c,fp); ++ } ++ return false; ++ } ++ ++ if (c == 0xBB) ++ { ++ c=fgetc(fp); ++ } ++ else ++ { ++ if ( c!= EOF ) ++ { ++ mbf->buf[0]=(unsigned char) 0xEF; ++ mbf->bufcount=1; ++ ungetc(c,fp); ++ return false; ++ } ++ else ++ { ++ ungetc(0xEF,fp); ++ return false; ++ } ++ } ++ if (c == 0xBF) ++ { ++ mbf->bufcount=0; ++ return true; ++ } ++ else ++ { ++ if (c != EOF) ++ { ++ mbf->buf[0]=(unsigned char) 0xEF; ++ mbf->buf[1]=(unsigned char) 0xBB; ++ mbf->bufcount=2; ++ ungetc(c,fp); ++ return false; ++ } ++ else ++ { ++ mbf->buf[0]=(unsigned char) 0xEF; ++ mbf->bufcount=1; ++ ungetc(0xBB,fp); ++ return false; ++ } ++ } ++ return false; ++} ++ ++extern void ++print_bom(void) ++{ ++ putc (0xEF, stdout); ++ putc (0xBB, stdout); ++ putc (0xBF, stdout); ++} ++ + /* Add the comma or blank separated list of tab stops STOPS + to the list of tab stops. */ + extern void +diff --git a/src/expand-common.h b/src/expand-common.h +index 5f59a0e..835b9d5 100644 +--- a/src/expand-common.h ++++ b/src/expand-common.h +@@ -25,6 +25,18 @@ extern size_t max_column_width; + /* The desired exit status. */ + extern int exit_status; + ++extern int ++set_utf_locale (void); ++ ++extern bool ++check_utf_locale(void); ++ ++extern bool ++check_bom(FILE* fp, mb_file_t *mbf); ++ ++extern void ++print_bom(void); ++ + /* Add tab stop TABVAL to the end of 'tab_list'. */ + extern void + add_tab_stop (uintmax_t tabval); +diff --git a/src/expand.c b/src/expand.c +index ed78ca8..a4cefa1 100644 +--- a/src/expand.c ++++ b/src/expand.c +@@ -37,6 +37,9 @@ + #include + #include + #include ++ ++#include ++ + #include "system.h" + #include "die.h" + +@@ -97,19 +100,41 @@ expand (void) + { + /* Input stream. */ + FILE *fp = next_file (NULL); ++ mb_file_t mbf; ++ mbf_char_t c; ++ /* True if the starting locale is utf8. */ ++ bool using_utf_locale; ++ ++ /* True if the first file contains BOM header. */ ++ bool found_bom; ++ using_utf_locale=check_utf_locale(); + + if (!fp) + return; ++ mbf_init (mbf, fp); ++ found_bom=check_bom(fp,&mbf); + +- while (true) ++ if (using_utf_locale == false && found_bom == true) ++ { ++ /*try using some predefined locale */ ++ ++ if (set_utf_locale () != 0) + { +- /* Input character, or EOF. */ +- int c; ++ error (EXIT_FAILURE, errno, _("cannot set UTF-8 locale")); ++ } ++ } ++ ++ ++ if (found_bom == true) ++ { ++ print_bom(); ++ } + ++ while (true) ++ { + /* If true, perform translations. */ + bool convert = true; + +- + /* The following variables have valid values only when CONVERT + is true: */ + +@@ -119,17 +144,48 @@ expand (void) + /* Index in TAB_LIST of next tab stop to examine. */ + size_t tab_index = 0; + +- + /* Convert a line of text. */ + + do + { +- while ((c = getc (fp)) < 0 && (fp = next_file (fp))) +- continue; ++ while (true) { ++ mbf_getc (c, mbf); ++ if ((mb_iseof (c)) && (fp = next_file (fp))) ++ { ++ mbf_init (mbf, fp); ++ if (fp!=NULL) ++ { ++ if (check_bom(fp,&mbf)==true) ++ { ++ /*Not the first file - check BOM header*/ ++ if (using_utf_locale==false && found_bom==false) ++ { ++ /*BOM header in subsequent file but not in the first one. */ ++ error (EXIT_FAILURE, errno, _("combination of files with and without BOM header")); ++ } ++ } ++ else ++ { ++ if(using_utf_locale==false && found_bom==true) ++ { ++ /*First file conatined BOM header - locale was switched to UTF ++ *all subsequent files should contain BOM. */ ++ error (EXIT_FAILURE, errno, _("combination of files with and without BOM header")); ++ } ++ } ++ } ++ continue; ++ } ++ else ++ { ++ break; ++ } ++ } ++ + + if (convert) + { +- if (c == '\t') ++ if (mb_iseq (c, '\t')) + { + /* Column the next input tab stop is on. */ + uintmax_t next_tab_column; +@@ -148,32 +204,34 @@ expand (void) + if (putchar (' ') < 0) + die (EXIT_FAILURE, errno, _("write error")); + +- c = ' '; ++ mb_setascii (&c, ' '); + } +- else if (c == '\b') ++ else if (mb_iseq (c, '\b')) + { + /* Go back one column, and force recalculation of the + next tab stop. */ + column -= !!column; + tab_index -= !!tab_index; + } +- else ++ /* A leading control character could make us trip over. */ ++ else if (!mb_iscntrl (c)) + { +- column++; ++ column += mb_width (c); + if (!column) + die (EXIT_FAILURE, 0, _("input line is too long")); + } + +- convert &= convert_entire_line || !! isblank (c); ++ convert &= convert_entire_line || mb_isblank (c); + } + +- if (c < 0) ++ if (mb_iseof (c)) + return; + +- if (putchar (c) < 0) ++ mb_putc (c, stdout); ++ if (ferror (stdout)) + die (EXIT_FAILURE, errno, _("write error")); + } +- while (c != '\n'); ++ while (!mb_iseq (c, '\n')); + } + } + +diff --git a/src/fold.c b/src/fold.c +index f07a90b..d32dbfd 100644 +--- a/src/fold.c ++++ b/src/fold.c +@@ -22,12 +22,34 @@ + #include + #include + ++/* 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 "die.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). */ +@@ -35,20 +57,41 @@ + + #define AUTHORS proper_name ("David MacKenzie") + ++#define FATAL_ERROR(Message) \ ++ do \ ++ { \ ++ error (0, 0, (Message)); \ ++ usage (2); \ ++ } \ ++ while (0) ++ ++enum operating_mode ++{ ++ /* Fold texts by columns that are at the given positions. */ ++ column_mode, ++ ++ /* Fold texts by bytes that are at the given positions. */ ++ byte_mode, ++ ++ /* Fold texts by characters that are at the given positions. */ ++ character_mode, ++}; ++ ++/* The argument shows current mode. (Default: column_mode) */ ++static enum operating_mode operating_mode; ++ + /* If nonzero, try to break on whitespace. */ + static bool break_spaces; + +-/* If nonzero, count bytes, not column positions. */ +-static bool count_bytes; +- + /* If nonzero, at least one of the files we read was standard input. */ + static bool have_read_stdin; + +-static char const shortopts[] = "bsw:0::1::2::3::4::5::6::7::8::9::"; ++static char const shortopts[] = "bcsw:0::1::2::3::4::5::6::7::8::9::"; + + static struct option const longopts[] = + { + {"bytes", no_argument, NULL, 'b'}, ++ {"characters", no_argument, NULL, 'c'}, + {"spaces", no_argument, NULL, 's'}, + {"width", required_argument, NULL, 'w'}, + {GETOPT_HELP_OPTION_DECL}, +@@ -76,6 +119,7 @@ Wrap input lines in each FILE, writing to standard output.\n\ + + fputs (_("\ + -b, --bytes count bytes rather than columns\n\ ++ -c, --characters count characters rather than columns\n\ + -s, --spaces break at spaces\n\ + -w, --width=WIDTH use WIDTH columns instead of 80\n\ + "), stdout); +@@ -93,7 +137,7 @@ Wrap input lines in each FILE, writing to standard output.\n\ + static size_t + adjust_column (size_t column, char c) + { +- if (!count_bytes) ++ if (operating_mode != byte_mode) + { + if (c == '\b') + { +@@ -116,30 +160,14 @@ adjust_column (size_t column, char c) + to stdout, with maximum line length WIDTH. + Return true if successful. */ + +-static bool +-fold_file (char const *filename, size_t width) ++static void ++fold_text (FILE *istream, size_t width, int *saved_errno) + { +- FILE *istream; + int c; + size_t column = 0; /* Screen column where next char will go. */ + size_t offset_out = 0; /* Index in 'line_out' for next char. */ + static char *line_out = NULL; + static size_t allocated_out = 0; +- int saved_errno; +- +- if (STREQ (filename, "-")) +- { +- istream = stdin; +- have_read_stdin = true; +- } +- else +- istream = fopen (filename, "r"); +- +- if (istream == NULL) +- { +- error (0, errno, "%s", quotef (filename)); +- return false; +- } + + fadvise (istream, FADVISE_SEQUENTIAL); + +@@ -169,6 +197,15 @@ fold_file (char const *filename, size_t width) + bool found_blank = false; + size_t logical_end = offset_out; + ++ /* If LINE_OUT has no wide character, ++ put a new wide character in LINE_OUT ++ if column is bigger than width. */ ++ if (offset_out == 0) ++ { ++ line_out[offset_out++] = c; ++ continue; ++ } ++ + /* Look for the last blank. */ + while (logical_end) + { +@@ -215,13 +252,225 @@ fold_file (char const *filename, size_t width) + line_out[offset_out++] = c; + } + +- saved_errno = errno; ++ *saved_errno = errno; + if (!ferror (istream)) +- saved_errno = 0; ++ *saved_errno = 0; + + if (offset_out) + fwrite (line_out, sizeof (char), (size_t) offset_out, stdout); + ++} ++ ++#if HAVE_MBRTOWC ++static void ++fold_multibyte_text (FILE *istream, size_t width, int *saved_errno) ++{ ++ char buf[MB_LEN_MAX + BUFSIZ]; /* For spooling a read byte sequence. */ ++ size_t buflen = 0; /* The length of the byte sequence in buf. */ ++ char *bufpos = buf; /* Next read position of BUF. */ ++ wint_t wc; /* A gotten wide character. */ ++ size_t mblength; /* The byte size of a multibyte character which shows ++ as same character as WC. */ ++ mbstate_t state, state_bak; /* State of the stream. */ ++ int convfail = 0; /* 1, when conversion is failed. Otherwise 0. */ ++ ++ static char *line_out = NULL; ++ size_t offset_out = 0; /* Index in `line_out' for next char. */ ++ static size_t allocated_out = 0; ++ ++ int increment; ++ size_t column = 0; ++ ++ size_t last_blank_pos; ++ size_t last_blank_column; ++ int is_blank_seen; ++ int last_blank_increment = 0; ++ int is_bs_following_last_blank; ++ size_t bs_following_last_blank_num; ++ int is_cr_after_last_blank; ++ ++#define CLEAR_FLAGS \ ++ do \ ++ { \ ++ last_blank_pos = 0; \ ++ last_blank_column = 0; \ ++ is_blank_seen = 0; \ ++ is_bs_following_last_blank = 0; \ ++ bs_following_last_blank_num = 0; \ ++ is_cr_after_last_blank = 0; \ ++ } \ ++ while (0) ++ ++#define START_NEW_LINE \ ++ do \ ++ { \ ++ putchar ('\n'); \ ++ column = 0; \ ++ offset_out = 0; \ ++ CLEAR_FLAGS; \ ++ } \ ++ while (0) ++ ++ CLEAR_FLAGS; ++ memset (&state, '\0', sizeof(mbstate_t)); ++ ++ for (;; bufpos += mblength, buflen -= mblength) ++ { ++ if (buflen < MB_LEN_MAX && !feof (istream) && !ferror (istream)) ++ { ++ memmove (buf, bufpos, buflen); ++ buflen += fread (buf + buflen, sizeof(char), BUFSIZ, istream); ++ bufpos = buf; ++ } ++ ++ if (buflen < 1) ++ break; ++ ++ /* Get a wide character. */ ++ state_bak = state; ++ mblength = mbrtowc ((wchar_t *)&wc, bufpos, buflen, &state); ++ ++ switch (mblength) ++ { ++ case (size_t)-1: ++ case (size_t)-2: ++ convfail++; ++ state = state_bak; ++ /* Fall through. */ ++ ++ case 0: ++ mblength = 1; ++ break; ++ } ++ ++rescan: ++ if (operating_mode == byte_mode) /* byte mode */ ++ increment = mblength; ++ else if (operating_mode == character_mode) /* character mode */ ++ increment = 1; ++ else /* column mode */ ++ { ++ if (convfail) ++ increment = 1; ++ else ++ { ++ switch (wc) ++ { ++ case L'\n': ++ fwrite (line_out, sizeof(char), offset_out, stdout); ++ START_NEW_LINE; ++ continue; ++ ++ case L'\b': ++ increment = (column > 0) ? -1 : 0; ++ break; ++ ++ case L'\r': ++ increment = -1 * column; ++ break; ++ ++ case L'\t': ++ increment = 8 - column % 8; ++ break; ++ ++ default: ++ increment = wcwidth (wc); ++ increment = (increment < 0) ? 0 : increment; ++ } ++ } ++ } ++ ++ if (column + increment > width && break_spaces && last_blank_pos) ++ { ++ fwrite (line_out, sizeof(char), last_blank_pos, stdout); ++ putchar ('\n'); ++ ++ offset_out = offset_out - last_blank_pos; ++ column = column - last_blank_column + ((is_cr_after_last_blank) ++ ? last_blank_increment : bs_following_last_blank_num); ++ memmove (line_out, line_out + last_blank_pos, offset_out); ++ CLEAR_FLAGS; ++ goto rescan; ++ } ++ ++ if (column + increment > width && column != 0) ++ { ++ fwrite (line_out, sizeof(char), offset_out, stdout); ++ START_NEW_LINE; ++ goto rescan; ++ } ++ ++ if (allocated_out < offset_out + mblength) ++ { ++ line_out = X2REALLOC (line_out, &allocated_out); ++ } ++ ++ memcpy (line_out + offset_out, bufpos, mblength); ++ offset_out += mblength; ++ column += increment; ++ ++ if (is_blank_seen && !convfail && wc == L'\r') ++ is_cr_after_last_blank = 1; ++ ++ if (is_bs_following_last_blank && !convfail && wc == L'\b') ++ ++bs_following_last_blank_num; ++ else ++ is_bs_following_last_blank = 0; ++ ++ if (break_spaces && !convfail && iswblank (wc)) ++ { ++ last_blank_pos = offset_out; ++ last_blank_column = column; ++ is_blank_seen = 1; ++ last_blank_increment = increment; ++ is_bs_following_last_blank = 1; ++ bs_following_last_blank_num = 0; ++ is_cr_after_last_blank = 0; ++ } ++ } ++ ++ *saved_errno = errno; ++ if (!ferror (istream)) ++ *saved_errno = 0; ++ ++ if (offset_out) ++ fwrite (line_out, sizeof (char), (size_t) offset_out, stdout); ++ ++} ++#endif ++ ++/* Fold file FILENAME, or standard input if FILENAME is "-", ++ to stdout, with maximum line length WIDTH. ++ Return 0 if successful, 1 if an error occurs. */ ++ ++static bool ++fold_file (char const *filename, size_t width) ++{ ++ FILE *istream; ++ int saved_errno; ++ ++ if (STREQ (filename, "-")) ++ { ++ istream = stdin; ++ have_read_stdin = 1; ++ } ++ else ++ istream = fopen (filename, "r"); ++ ++ if (istream == NULL) ++ { ++ error (0, errno, "%s", filename); ++ return 1; ++ } ++ ++ /* Define how ISTREAM is being folded. */ ++#if HAVE_MBRTOWC ++ if (MB_CUR_MAX > 1) ++ fold_multibyte_text (istream, width, &saved_errno); ++ else ++#endif ++ fold_text (istream, width, &saved_errno); ++ + if (STREQ (filename, "-")) + clearerr (istream); + else if (fclose (istream) != 0 && !saved_errno) +@@ -252,7 +501,8 @@ main (int argc, char **argv) + + atexit (close_stdout); + +- break_spaces = count_bytes = have_read_stdin = false; ++ operating_mode = column_mode; ++ break_spaces = have_read_stdin = false; + + while ((optc = getopt_long (argc, argv, shortopts, longopts, NULL)) != -1) + { +@@ -261,7 +511,15 @@ main (int argc, char **argv) + switch (optc) + { + case 'b': /* Count bytes rather than columns. */ +- count_bytes = true; ++ if (operating_mode != column_mode) ++ FATAL_ERROR (_("only one way of folding may be specified")); ++ operating_mode = byte_mode; ++ break; ++ ++ case 'c': ++ if (operating_mode != column_mode) ++ FATAL_ERROR (_("only one way of folding may be specified")); ++ operating_mode = character_mode; + break; + + case 's': /* Break at word boundaries. */ +diff --git a/src/join.c b/src/join.c +index f2fd172..6c7d1ed 100644 +--- a/src/join.c ++++ b/src/join.c +@@ -22,19 +22,33 @@ + #include + #include + ++/* Get mbstate_t, mbrtowc(), mbrtowc(), wcwidth(). */ ++#if HAVE_WCHAR_H ++# include ++#endif ++ ++/* Get iswblank(), towupper. */ ++#if HAVE_WCTYPE_H ++# include ++#endif ++ + #include "system.h" + #include "die.h" + #include "error.h" + #include "fadvise.h" + #include "hard-locale.h" + #include "linebuffer.h" +-#include "memcasecmp.h" + #include "quote.h" + #include "stdio--.h" + #include "xmemcoll.h" + #include "xstrtol.h" + #include "argmatch.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 ++ + /* The official name of this program (e.g., no 'g' prefix). */ + #define PROGRAM_NAME "join" + +@@ -136,10 +150,12 @@ static struct outlist outlist_head; + /* Last element in 'outlist', where a new element can be added. */ + static struct outlist *outlist_end = &outlist_head; + +-/* Tab character separating fields. If negative, fields are separated +- by any nonempty string of blanks, otherwise by exactly one +- tab character whose value (when cast to unsigned char) equals TAB. */ +-static int tab = -1; ++/* Tab character separating fields. If NULL, fields are separated ++ by any nonempty string of blanks. */ ++static char *tab = NULL; ++ ++/* The number of bytes used for tab. */ ++static size_t tablen = 0; + + /* If nonzero, check that the input is correctly ordered. */ + static enum +@@ -280,13 +296,14 @@ xfields (struct line *line) + if (ptr == lim) + return; + +- if (0 <= tab && tab != '\n') ++ if (tab != NULL) + { ++ unsigned char t = tab[0]; + char *sep; +- for (; (sep = memchr (ptr, tab, lim - ptr)) != NULL; ptr = sep + 1) ++ for (; (sep = memchr (ptr, t, lim - ptr)) != NULL; ptr = sep + 1) + extract_field (line, ptr, sep - ptr); + } +- else if (tab < 0) ++ else + { + /* Skip leading blanks before the first field. */ + while (field_sep (*ptr)) +@@ -310,6 +327,147 @@ xfields (struct line *line) + extract_field (line, ptr, lim - ptr); + } + ++#if HAVE_MBRTOWC ++static void ++xfields_multibyte (struct line *line) ++{ ++ char *ptr = line->buf.buffer; ++ char const *lim = ptr + line->buf.length - 1; ++ wchar_t wc = 0; ++ size_t mblength = 1; ++ mbstate_t state, state_bak; ++ ++ memset (&state, 0, sizeof (mbstate_t)); ++ ++ if (ptr >= lim) ++ return; ++ ++ if (tab != NULL) ++ { ++ char *sep = ptr; ++ for (; ptr < lim; ptr = sep + mblength) ++ { ++ sep = ptr; ++ while (sep < lim) ++ { ++ state_bak = state; ++ mblength = mbrtowc (&wc, sep, lim - sep + 1, &state); ++ ++ if (mblength == (size_t)-1 || mblength == (size_t)-2) ++ { ++ mblength = 1; ++ state = state_bak; ++ } ++ mblength = (mblength < 1) ? 1 : mblength; ++ ++ if (mblength == tablen && !memcmp (sep, tab, mblength)) ++ break; ++ else ++ { ++ sep += mblength; ++ continue; ++ } ++ } ++ ++ if (sep >= lim) ++ break; ++ ++ extract_field (line, ptr, sep - ptr); ++ } ++ } ++ else ++ { ++ /* Skip leading blanks before the first field. */ ++ while(ptr < lim) ++ { ++ state_bak = state; ++ mblength = mbrtowc (&wc, ptr, lim - ptr + 1, &state); ++ ++ if (mblength == (size_t)-1 || mblength == (size_t)-2) ++ { ++ mblength = 1; ++ state = state_bak; ++ break; ++ } ++ mblength = (mblength < 1) ? 1 : mblength; ++ ++ if (!iswblank(wc) && wc != '\n') ++ break; ++ ptr += mblength; ++ } ++ ++ do ++ { ++ char *sep; ++ state_bak = state; ++ mblength = mbrtowc (&wc, ptr, lim - ptr + 1, &state); ++ if (mblength == (size_t)-1 || mblength == (size_t)-2) ++ { ++ mblength = 1; ++ state = state_bak; ++ break; ++ } ++ mblength = (mblength < 1) ? 1 : mblength; ++ ++ sep = ptr + mblength; ++ while (sep < lim) ++ { ++ state_bak = state; ++ mblength = mbrtowc (&wc, sep, lim - sep + 1, &state); ++ if (mblength == (size_t)-1 || mblength == (size_t)-2) ++ { ++ mblength = 1; ++ state = state_bak; ++ break; ++ } ++ mblength = (mblength < 1) ? 1 : mblength; ++ ++ if (iswblank (wc) || wc == '\n') ++ break; ++ ++ sep += mblength; ++ } ++ ++ extract_field (line, ptr, sep - ptr); ++ if (sep >= lim) ++ return; ++ ++ state_bak = state; ++ mblength = mbrtowc (&wc, sep, lim - sep + 1, &state); ++ if (mblength == (size_t)-1 || mblength == (size_t)-2) ++ { ++ mblength = 1; ++ state = state_bak; ++ break; ++ } ++ mblength = (mblength < 1) ? 1 : mblength; ++ ++ ptr = sep + mblength; ++ while (ptr < lim) ++ { ++ state_bak = state; ++ mblength = mbrtowc (&wc, ptr, lim - ptr + 1, &state); ++ if (mblength == (size_t)-1 || mblength == (size_t)-2) ++ { ++ mblength = 1; ++ state = state_bak; ++ break; ++ } ++ mblength = (mblength < 1) ? 1 : mblength; ++ ++ if (!iswblank (wc) && wc != '\n') ++ break; ++ ++ ptr += mblength; ++ } ++ } ++ while (ptr < lim); ++ } ++ ++ extract_field (line, ptr, lim - ptr); ++} ++#endif ++ + static void + freeline (struct line *line) + { +@@ -331,56 +489,133 @@ keycmp (struct line const *line1, struct line const *line2, + size_t jf_1, size_t jf_2) + { + /* Start of field to compare in each file. */ +- char *beg1; +- char *beg2; +- +- size_t len1; +- size_t len2; /* Length of fields to compare. */ ++ char *beg[2]; ++ char *copy[2]; ++ size_t len[2]; /* Length of fields to compare. */ + int diff; ++ int i, j; ++ int mallocd = 0; + + if (jf_1 < line1->nfields) + { +- beg1 = line1->fields[jf_1].beg; +- len1 = line1->fields[jf_1].len; ++ beg[0] = line1->fields[jf_1].beg; ++ len[0] = line1->fields[jf_1].len; + } + else + { +- beg1 = NULL; +- len1 = 0; ++ beg[0] = NULL; ++ len[0] = 0; + } + + if (jf_2 < line2->nfields) + { +- beg2 = line2->fields[jf_2].beg; +- len2 = line2->fields[jf_2].len; ++ beg[1] = line2->fields[jf_2].beg; ++ len[1] = line2->fields[jf_2].len; + } + else + { +- beg2 = NULL; +- len2 = 0; ++ beg[1] = NULL; ++ len[1] = 0; + } + +- if (len1 == 0) +- return len2 == 0 ? 0 : -1; +- if (len2 == 0) ++ if (len[0] == 0) ++ return len[1] == 0 ? 0 : -1; ++ if (len[1] == 0) + return 1; + + if (ignore_case) + { +- /* FIXME: ignore_case does not work with NLS (in particular, +- with multibyte chars). */ +- diff = memcasecmp (beg1, beg2, MIN (len1, len2)); ++#ifdef HAVE_MBRTOWC ++ if (MB_CUR_MAX > 1) ++ { ++ size_t mblength; ++ wchar_t wc, uwc; ++ mbstate_t state, state_bak; ++ ++ memset (&state, '\0', sizeof (mbstate_t)); ++ ++ for (i = 0; i < 2; i++) ++ { ++ mallocd = 1; ++ copy[i] = xmalloc (len[i] + 1); ++ memset (copy[i], '\0',len[i] + 1); ++ ++ for (j = 0; j < MIN (len[0], len[1]);) ++ { ++ state_bak = state; ++ mblength = mbrtowc (&wc, beg[i] + j, len[i] - j, &state); ++ ++ switch (mblength) ++ { ++ case (size_t) -1: ++ case (size_t) -2: ++ state = state_bak; ++ /* Fall through */ ++ case 0: ++ mblength = 1; ++ break; ++ ++ default: ++ uwc = towupper (wc); ++ ++ if (uwc != wc) ++ { ++ mbstate_t state_wc; ++ size_t mblen; ++ ++ memset (&state_wc, '\0', sizeof (mbstate_t)); ++ mblen = wcrtomb (copy[i] + j, uwc, &state_wc); ++ assert (mblen != (size_t)-1); ++ } ++ else ++ memcpy (copy[i] + j, beg[i] + j, mblength); ++ } ++ j += mblength; ++ } ++ copy[i][j] = '\0'; ++ } ++ } ++ else ++#endif ++ { ++ for (i = 0; i < 2; i++) ++ { ++ mallocd = 1; ++ copy[i] = xmalloc (len[i] + 1); ++ ++ for (j = 0; j < MIN (len[0], len[1]); j++) ++ copy[i][j] = toupper (beg[i][j]); ++ ++ copy[i][j] = '\0'; ++ } ++ } + } + else + { +- if (hard_LC_COLLATE) +- return xmemcoll (beg1, len1, beg2, len2); +- diff = memcmp (beg1, beg2, MIN (len1, len2)); ++ copy[0] = beg[0]; ++ copy[1] = beg[1]; + } + ++ if (hard_LC_COLLATE) ++ { ++ diff = xmemcoll ((char *) copy[0], len[0], (char *) copy[1], len[1]); ++ ++ if (mallocd) ++ for (i = 0; i < 2; i++) ++ free (copy[i]); ++ ++ return diff; ++ } ++ diff = memcmp (copy[0], copy[1], MIN (len[0], len[1])); ++ ++ if (mallocd) ++ for (i = 0; i < 2; i++) ++ free (copy[i]); ++ ++ + if (diff) + return diff; +- return len1 < len2 ? -1 : len1 != len2; ++ return len[0] - len[1]; + } + + /* Check that successive input lines PREV and CURRENT from input file +@@ -472,6 +707,11 @@ get_line (FILE *fp, struct line **linep, int which) + } + ++line_no[which - 1]; + ++#if HAVE_MBRTOWC ++ if (MB_CUR_MAX > 1) ++ xfields_multibyte (line); ++ else ++#endif + xfields (line); + + if (prevline[which - 1]) +@@ -567,21 +807,28 @@ prfield (size_t n, struct line const *line) + + /* Output all the fields in line, other than the join field. */ + ++#define PUT_TAB_CHAR \ ++ do \ ++ { \ ++ (tab != NULL) ? \ ++ fwrite(tab, sizeof(char), tablen, stdout) : putchar (' '); \ ++ } \ ++ while (0) ++ + static void + prfields (struct line const *line, size_t join_field, size_t autocount) + { + size_t i; + size_t nfields = autoformat ? autocount : line->nfields; +- char output_separator = tab < 0 ? ' ' : tab; + + for (i = 0; i < join_field && i < nfields; ++i) + { +- putchar (output_separator); ++ PUT_TAB_CHAR; + prfield (i, line); + } + for (i = join_field + 1; i < nfields; ++i) + { +- putchar (output_separator); ++ PUT_TAB_CHAR; + prfield (i, line); + } + } +@@ -592,7 +839,6 @@ static void + prjoin (struct line const *line1, struct line const *line2) + { + const struct outlist *outlist; +- char output_separator = tab < 0 ? ' ' : tab; + size_t field; + struct line const *line; + +@@ -626,7 +872,7 @@ prjoin (struct line const *line1, struct line const *line2) + o = o->next; + if (o == NULL) + break; +- putchar (output_separator); ++ PUT_TAB_CHAR; + } + putchar (eolchar); + } +@@ -1102,20 +1348,43 @@ main (int argc, char **argv) + + case 't': + { +- unsigned char newtab = optarg[0]; ++ char *newtab = NULL; ++ size_t newtablen; ++ newtab = xstrdup (optarg); ++#if HAVE_MBRTOWC ++ if (MB_CUR_MAX > 1) ++ { ++ mbstate_t state; ++ ++ memset (&state, 0, sizeof (mbstate_t)); ++ newtablen = mbrtowc (NULL, newtab, ++ strnlen (newtab, MB_LEN_MAX), ++ &state); ++ if (newtablen == (size_t) 0 ++ || newtablen == (size_t) -1 ++ || newtablen == (size_t) -2) ++ newtablen = 1; ++ } ++ else ++#endif ++ newtablen = 1; + if (! newtab) +- newtab = '\n'; /* '' => process the whole line. */ ++ newtab = (char*)"\n"; /* '' => process the whole line. */ + else if (optarg[1]) + { +- if (STREQ (optarg, "\\0")) +- newtab = '\0'; +- else +- die (EXIT_FAILURE, 0, _("multi-character tab %s"), +- quote (optarg)); ++ if (newtablen == 1 && newtab[1]) ++ { ++ if (STREQ (newtab, "\\0")) ++ newtab[0] = '\0'; ++ } ++ } ++ if (tab != NULL && strcmp (tab, newtab)) ++ { ++ free (newtab); ++ die (EXIT_FAILURE, 0, _("incompatible tabs")); + } +- if (0 <= tab && tab != newtab) +- die (EXIT_FAILURE, 0, _("incompatible tabs")); + tab = newtab; ++ tablen = newtablen; + } + break; + +diff --git a/src/local.mk b/src/local.mk +index e1d15ce..1a5ffaa 100644 +--- a/src/local.mk ++++ b/src/local.mk +@@ -434,8 +434,8 @@ src_base32_CPPFLAGS = -DBASE_TYPE=32 $(AM_CPPFLAGS) + src_basenc_SOURCES = src/basenc.c + src_basenc_CPPFLAGS = -DBASE_TYPE=42 $(AM_CPPFLAGS) + +-src_expand_SOURCES = src/expand.c src/expand-common.c +-src_unexpand_SOURCES = src/unexpand.c src/expand-common.c ++src_expand_SOURCES = src/expand.c src/expand-common.c lib/mbfile.c ++src_unexpand_SOURCES = src/unexpand.c src/expand-common.c lib/mbfile.c + + src_wc_SOURCES = src/wc.c + if USE_AVX2_WC_LINECOUNT +diff --git a/src/pr.c b/src/pr.c +index 4c17c00..b4fab1c 100644 +--- a/src/pr.c ++++ b/src/pr.c +@@ -311,6 +311,24 @@ + + #include + #include ++ ++/* Get MB_LEN_MAX. */ ++#include ++/* 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 == 1 ++# define MB_LEN_MAX 16 ++#endif ++ ++/* Get MB_CUR_MAX. */ ++#include ++ ++/* Solaris 2.5 has a bug: must be included before . */ ++/* Get mbstate_t, mbrtowc(), wcwidth(). */ ++#if HAVE_WCHAR_H ++# include ++#endif ++ + #include "system.h" + #include "die.h" + #include "error.h" +@@ -325,6 +343,18 @@ + #include "xstrtol-error.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" + +@@ -417,7 +447,20 @@ struct COLUMN + + typedef struct COLUMN COLUMN; + +-static int char_to_clump (char c); ++/* Funtion pointers to switch functions for single byte locale or for ++ multibyte locale. If multibyte functions do not exist in your sysytem, ++ these pointers always point the function for single byte locale. */ ++static void (*print_char) (char c); ++static int (*char_to_clump) (char c); ++ ++/* Functions for single byte locale. */ ++static void print_char_single (char c); ++static int char_to_clump_single (char c); ++ ++/* Functions for multibyte locale. */ ++static void print_char_multi (char c); ++static int char_to_clump_multi (char c); ++ + static bool read_line (COLUMN *p); + static bool print_page (void); + static bool print_stored (COLUMN *p); +@@ -429,6 +472,7 @@ static void add_line_number (COLUMN *p); + static void getoptnum (char const *n_str, int min, int *num, + char const *errfmt); + 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); +@@ -442,7 +486,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); +-static void print_char (char c); + static void cleanup (void); + static void print_sep_string (void); + static void separator_string (char const *optarg_S); +@@ -454,7 +497,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]. */ +-static char *buff; ++static unsigned char *buff; + + /* Index of the position in buff where the next character + will be stored. */ +@@ -558,7 +601,7 @@ static int chars_per_column; + static bool untabify_input = false; + + /* (-e) The input tab character. */ +-static char input_tab_char = '\t'; ++static char input_tab_char[MB_LEN_MAX] = "\t"; + + /* (-e) Tabstops are at chars_per_tab, 2*chars_per_tab, 3*chars_per_tab, ... + where the leftmost column is 1. */ +@@ -568,7 +611,10 @@ static int chars_per_input_tab = 8; + static bool tabify_output = false; + + /* (-i) The output tab character. */ +-static char output_tab_char = '\t'; ++static char output_tab_char[MB_LEN_MAX] = "\t"; ++ ++/* (-i) The byte length of output tab character. */ ++static int output_tab_char_length = 1; + + /* (-i) The width of the output tab. */ + static int chars_per_output_tab = 8; +@@ -638,7 +684,13 @@ static int line_number; + static bool numbered_lines = false; + + /* (-n) Character which follows each line number. */ +-static char number_separator = '\t'; ++static char number_separator[MB_LEN_MAX] = "\t"; ++ ++/* (-n) The byte length of the character which follows each line number. */ ++static int number_separator_length = 1; ++ ++/* (-n) The character width of the character which follows each line number. */ ++static int number_separator_width = 0; + + /* (-n) line counting starts with 1st line of input file (not with 1st + line of 1st page printed). */ +@@ -691,6 +743,7 @@ static bool use_col_separator = false; + -a|COLUMN|-m is a 'space' and with the -J option a 'tab'. */ + static char const *col_sep_string = ""; + static int col_sep_length = 0; ++static int col_sep_width = 0; + static char *column_separator = (char *) " "; + static char *line_separator = (char *) "\t"; + +@@ -853,6 +906,13 @@ separator_string (char const *optarg_S) + integer_overflow (); + col_sep_length = len; + col_sep_string = optarg_S; ++ ++#if HAVE_MBRTOWC ++ if (MB_CUR_MAX > 1) ++ col_sep_width = mbswidth (col_sep_string, 0); ++ else ++#endif ++ col_sep_width = col_sep_length; + } + + int +@@ -877,6 +937,21 @@ main (int argc, char **argv) + + atexit (close_stdout); + ++/* Define which functions are used, the ones for single byte locale or the ones ++ for multibyte locale. */ ++#if HAVE_MBRTOWC ++ if (MB_CUR_MAX > 1) ++ { ++ print_char = print_char_multi; ++ char_to_clump = char_to_clump_multi; ++ } ++ else ++#endif ++ { ++ print_char = print_char_single; ++ char_to_clump = char_to_clump_single; ++ } ++ + n_files = 0; + file_names = (argc > 1 + ? xnmalloc (argc - 1, sizeof (char *)) +@@ -953,8 +1028,12 @@ main (int argc, char **argv) + break; + case 'e': + if (optarg) +- getoptarg (optarg, 'e', &input_tab_char, +- &chars_per_input_tab); ++ { ++ int dummy_length, dummy_width; ++ ++ getoptarg (optarg, 'e', input_tab_char, &dummy_length, ++ &dummy_width, &chars_per_input_tab); ++ } + /* Could check tab width > 0. */ + untabify_input = true; + break; +@@ -967,8 +1046,12 @@ main (int argc, char **argv) + break; + case 'i': + if (optarg) +- getoptarg (optarg, 'i', &output_tab_char, +- &chars_per_output_tab); ++ { ++ int dummy_width; ++ ++ getoptarg (optarg, 'i', output_tab_char, &output_tab_char_length, ++ &dummy_width, &chars_per_output_tab); ++ } + /* Could check tab width > 0. */ + tabify_output = true; + break; +@@ -986,8 +1069,8 @@ main (int argc, char **argv) + case 'n': + numbered_lines = true; + if (optarg) +- getoptarg (optarg, 'n', &number_separator, +- &chars_per_number); ++ getoptarg (optarg, 'n', number_separator, &number_separator_length, ++ &number_separator_width, &chars_per_number); + break; + case 'N': + skip_count = false; +@@ -1012,6 +1095,7 @@ main (int argc, char **argv) + /* Reset an additional input of -s, -S dominates -s */ + col_sep_string = ""; + col_sep_length = 0; ++ col_sep_width = 0; + use_col_separator = true; + if (optarg) + separator_string (optarg); +@@ -1166,10 +1250,45 @@ getoptnum (char const *n_str, int min, int *num, char const *err) + a number. */ + + static void +-getoptarg (char *arg, char switch_char, char *character, int *number) ++getoptarg (char *arg, char switch_char, char *character, int *character_length, ++ int *character_width, int *number) + { + if (!ISDIGIT (*arg)) +- *character = *arg++; ++ { ++#ifdef HAVE_MBRTOWC ++ if (MB_CUR_MAX > 1) /* for multibyte locale. */ ++ { ++ wchar_t wc; ++ size_t mblength; ++ int width; ++ mbstate_t state = {'\0'}; ++ ++ mblength = mbrtowc (&wc, arg, strnlen(arg, MB_LEN_MAX), &state); ++ ++ if (mblength == (size_t)-1 || mblength == (size_t)-2) ++ { ++ *character_length = 1; ++ *character_width = 1; ++ } ++ else ++ { ++ *character_length = (mblength < 1) ? 1 : mblength; ++ width = wcwidth (wc); ++ *character_width = (width < 0) ? 0 : width; ++ } ++ ++ strncpy (character, arg, *character_length); ++ arg += *character_length; ++ } ++ else /* for single byte locale. */ ++#endif ++ { ++ *character = *arg++; ++ *character_length = 1; ++ *character_width = 1; ++ } ++ } ++ + if (*arg) + { + long int tmp_long; +@@ -1191,6 +1310,11 @@ static void + init_parameters (int number_of_files) + { + int chars_used_by_number = 0; ++ int mb_len = 1; ++#if HAVE_MBRTOWC ++ if (MB_CUR_MAX > 1) ++ mb_len = MB_LEN_MAX; ++#endif + + lines_per_body = lines_per_page - lines_per_header - lines_per_footer; + if (lines_per_body <= 0) +@@ -1228,7 +1352,7 @@ init_parameters (int number_of_files) + else + col_sep_string = column_separator; + +- col_sep_length = 1; ++ col_sep_length = col_sep_width = 1; + use_col_separator = true; + } + /* It's rather pointless to define a TAB separator with column +@@ -1260,11 +1384,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. */ +- if (number_separator == '\t') ++ if (number_separator[0] == '\t') + number_width = (chars_per_number + + TAB_WIDTH (chars_per_default_tab, chars_per_number)); + else +- number_width = chars_per_number + 1; ++ number_width = chars_per_number + number_separator_width; + + /* The number is part of the column width unless we are + printing files in parallel. */ +@@ -1273,7 +1397,7 @@ init_parameters (int number_of_files) + } + + int sep_chars, useful_chars; +- if (INT_MULTIPLY_WRAPV (columns - 1, col_sep_length, &sep_chars)) ++ if (INT_MULTIPLY_WRAPV (columns - 1, col_sep_width, &sep_chars)) + sep_chars = INT_MAX; + if (INT_SUBTRACT_WRAPV (chars_per_line - chars_used_by_number, sep_chars, + &useful_chars)) +@@ -1296,7 +1420,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); +- clump_buff = xmalloc (MAX (8, chars_per_input_tab)); ++ clump_buff = xmalloc (mb_len * MAX (8, chars_per_input_tab)); + } + + /* Open the necessary files, +@@ -1402,7 +1526,7 @@ init_funcs (void) + + /* Enlarge p->start_position of first column to use the same form of + padding_not_printed with all columns. */ +- h = h + col_sep_length; ++ h = h + col_sep_width; + + /* This loop takes care of all but the rightmost column. */ + +@@ -1436,7 +1560,7 @@ init_funcs (void) + } + else + { +- h = h_next + col_sep_length; ++ h = h_next + col_sep_width; + h_next = h + chars_per_column; + } + } +@@ -1733,9 +1857,9 @@ static void + align_column (COLUMN *p) + { + padding_not_printed = p->start_position; +- if (col_sep_length < padding_not_printed) ++ if (col_sep_width < padding_not_printed) + { +- pad_across_to (padding_not_printed - col_sep_length); ++ pad_across_to (padding_not_printed - col_sep_width); + padding_not_printed = ANYWHERE; + } + +@@ -2010,13 +2134,13 @@ store_char (char c) + /* May be too generous. */ + buff = X2REALLOC (buff, &buff_allocated); + } +- buff[buff_current++] = c; ++ buff[buff_current++] = (unsigned char) c; + } + + static void + add_line_number (COLUMN *p) + { +- int i; ++ int i, j; + char *s; + int num_width; + +@@ -2033,22 +2157,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. */ +- if (number_separator == '\t') ++ if (number_separator[0] == '\t') + { + i = number_width - chars_per_number; + while (i-- > 0) + (p->char_func) (' '); + } + else +- (p->char_func) (number_separator); ++ for (j = 0; j < number_separator_length; j++) ++ (p->char_func) (number_separator[j]); + } + else + /* To comply with POSIX, we avoid any expansion of default TAB + separator with a single column output. No column_width requirement + has to be considered. */ + { +- (p->char_func) (number_separator); +- if (number_separator == '\t') ++ for (j = 0; j < number_separator_length; j++) ++ (p->char_func) (number_separator[j]); ++ if (number_separator[0] == '\t') + output_position = POS_AFTER_TAB (chars_per_output_tab, + output_position); + } +@@ -2207,7 +2333,7 @@ print_white_space (void) + while (goal - h_old > 1 + && (h_new = POS_AFTER_TAB (chars_per_output_tab, h_old)) <= goal) + { +- putchar (output_tab_char); ++ fwrite (output_tab_char, sizeof(char), output_tab_char_length, stdout); + h_old = h_new; + } + while (++h_old <= goal) +@@ -2227,6 +2353,7 @@ print_sep_string (void) + { + char const *s = col_sep_string; + int l = col_sep_length; ++ int not_space_flag; + + if (separators_not_printed <= 0) + { +@@ -2238,6 +2365,7 @@ print_sep_string (void) + { + for (; separators_not_printed > 0; --separators_not_printed) + { ++ not_space_flag = 0; + while (l-- > 0) + { + /* 3 types of sep_strings: spaces only, spaces and chars, +@@ -2251,12 +2379,15 @@ print_sep_string (void) + } + else + { ++ not_space_flag = 1; + if (spaces_not_printed > 0) + print_white_space (); + putchar (*s++); +- ++output_position; + } + } ++ if (not_space_flag) ++ output_position += col_sep_width; ++ + /* sep_string ends with some spaces */ + if (spaces_not_printed > 0) + print_white_space (); +@@ -2284,7 +2415,7 @@ print_clump (COLUMN *p, int n, char *clump) + required number of tabs and spaces. */ + + static void +-print_char (char c) ++print_char_single (char c) + { + if (tabify_output) + { +@@ -2308,6 +2439,74 @@ print_char (char c) + putchar (c); + } + ++#ifdef HAVE_MBRTOWC ++static void ++print_char_multi (char c) ++{ ++ static size_t mbc_pos = 0; ++ static char mbc[MB_LEN_MAX] = {'\0'}; ++ static mbstate_t state = {'\0'}; ++ mbstate_t state_bak; ++ wchar_t wc; ++ size_t mblength; ++ int width; ++ ++ if (tabify_output) ++ { ++ state_bak = state; ++ mbc[mbc_pos++] = c; ++ mblength = mbrtowc (&wc, mbc, mbc_pos, &state); ++ ++ while (mbc_pos > 0) ++ { ++ switch (mblength) ++ { ++ case (size_t)-2: ++ state = state_bak; ++ return; ++ ++ case (size_t)-1: ++ state = state_bak; ++ ++output_position; ++ putchar (mbc[0]); ++ memmove (mbc, mbc + 1, MB_CUR_MAX - 1); ++ --mbc_pos; ++ break; ++ ++ case 0: ++ mblength = 1; ++ ++ default: ++ if (wc == L' ') ++ { ++ memmove (mbc, mbc + mblength, MB_CUR_MAX - mblength); ++ --mbc_pos; ++ ++spaces_not_printed; ++ return; ++ } ++ else if (spaces_not_printed > 0) ++ print_white_space (); ++ ++ /* Nonprintables are assumed to have width 0, except L'\b'. */ ++ if ((width = wcwidth (wc)) < 1) ++ { ++ if (wc == L'\b') ++ --output_position; ++ } ++ else ++ output_position += width; ++ ++ fwrite (mbc, sizeof(char), mblength, stdout); ++ memmove (mbc, mbc + mblength, MB_CUR_MAX - mblength); ++ mbc_pos -= mblength; ++ } ++ } ++ return; ++ } ++ putchar (c); ++} ++#endif ++ + /* Skip to page PAGE before printing. + PAGE may be larger than total number of pages. */ + +@@ -2485,9 +2684,9 @@ read_line (COLUMN *p) + align_empty_cols = false; + } + +- if (col_sep_length < padding_not_printed) ++ if (col_sep_width < padding_not_printed) + { +- pad_across_to (padding_not_printed - col_sep_length); ++ pad_across_to (padding_not_printed - col_sep_width); + padding_not_printed = ANYWHERE; + } + +@@ -2556,7 +2755,7 @@ print_stored (COLUMN *p) + COLUMN *q; + + int line = p->current_line++; +- char *first = &buff[line_vector[line]]; ++ unsigned char *first = &buff[line_vector[line]]; + /* FIXME + UMR: Uninitialized memory read: + * This is occurring while in: +@@ -2568,7 +2767,7 @@ print_stored (COLUMN *p) + xmalloc [xmalloc.c:94] + init_store_cols [pr.c:1648] + */ +- char *last = &buff[line_vector[line + 1]]; ++ unsigned char *last = &buff[line_vector[line + 1]]; + + pad_vertically = true; + +@@ -2588,9 +2787,9 @@ print_stored (COLUMN *p) + } + } + +- if (col_sep_length < padding_not_printed) ++ if (col_sep_width < padding_not_printed) + { +- pad_across_to (padding_not_printed - col_sep_length); ++ pad_across_to (padding_not_printed - col_sep_width); + padding_not_printed = ANYWHERE; + } + +@@ -2603,8 +2802,8 @@ print_stored (COLUMN *p) + if (spaces_not_printed == 0) + { + output_position = p->start_position + end_vector[line]; +- if (p->start_position - col_sep_length == chars_per_margin) +- output_position -= col_sep_length; ++ if (p->start_position - col_sep_width == chars_per_margin) ++ output_position -= col_sep_width; + } + + return true; +@@ -2623,7 +2822,7 @@ print_stored (COLUMN *p) + number of characters is 1.) */ + + static int +-char_to_clump (char c) ++char_to_clump_single (char c) + { + unsigned char uc = c; + char *s = clump_buff; +@@ -2633,10 +2832,10 @@ char_to_clump (char c) + int chars; + int chars_per_c = 8; + +- if (c == input_tab_char) ++ if (c == input_tab_char[0]) + chars_per_c = chars_per_input_tab; + +- if (c == input_tab_char || c == '\t') ++ if (c == input_tab_char[0] || c == '\t') + { + width = TAB_WIDTH (chars_per_c, input_position); + +@@ -2717,6 +2916,164 @@ char_to_clump (char c) + return chars; + } + ++#ifdef HAVE_MBRTOWC ++static int ++char_to_clump_multi (char c) ++{ ++ static size_t mbc_pos = 0; ++ static char mbc[MB_LEN_MAX] = {'\0'}; ++ static mbstate_t state = {'\0'}; ++ mbstate_t state_bak; ++ wchar_t wc; ++ size_t mblength; ++ int wc_width; ++ register char *s = clump_buff; ++ register int i, j; ++ char esc_buff[4]; ++ int width; ++ int chars; ++ int chars_per_c = 8; ++ ++ state_bak = state; ++ mbc[mbc_pos++] = c; ++ mblength = mbrtowc (&wc, mbc, mbc_pos, &state); ++ ++ width = 0; ++ chars = 0; ++ while (mbc_pos > 0) ++ { ++ switch (mblength) ++ { ++ case (size_t)-2: ++ state = state_bak; ++ return 0; ++ ++ case (size_t)-1: ++ state = state_bak; ++ mblength = 1; ++ ++ if (use_esc_sequence || use_cntrl_prefix) ++ { ++ width = +4; ++ chars = +4; ++ *s++ = '\\'; ++ sprintf (esc_buff, "%03o", (unsigned char) mbc[0]); ++ for (i = 0; i <= 2; ++i) ++ *s++ = (int) esc_buff[i]; ++ } ++ else ++ { ++ width += 1; ++ chars += 1; ++ *s++ = mbc[0]; ++ } ++ break; ++ ++ case 0: ++ mblength = 1; ++ /* Fall through */ ++ ++ default: ++ if (memcmp (mbc, input_tab_char, mblength) == 0) ++ chars_per_c = chars_per_input_tab; ++ ++ if (memcmp (mbc, input_tab_char, mblength) == 0 || c == '\t') ++ { ++ int width_inc; ++ ++ width_inc = TAB_WIDTH (chars_per_c, input_position); ++ width += width_inc; ++ ++ if (untabify_input) ++ { ++ for (i = width_inc; i; --i) ++ *s++ = ' '; ++ chars += width_inc; ++ } ++ else ++ { ++ for (i = 0; i < mblength; i++) ++ *s++ = mbc[i]; ++ chars += mblength; ++ } ++ } ++ else if ((wc_width = wcwidth (wc)) < 1) ++ { ++ if (use_esc_sequence) ++ { ++ for (i = 0; i < mblength; i++) ++ { ++ width += 4; ++ chars += 4; ++ *s++ = '\\'; ++ sprintf (esc_buff, "%03o", (unsigned char) mbc[i]); ++ for (j = 0; j <= 2; ++j) ++ *s++ = (int) esc_buff[j]; ++ } ++ } ++ else if (use_cntrl_prefix) ++ { ++ if (wc < 0200) ++ { ++ width += 2; ++ chars += 2; ++ *s++ = '^'; ++ *s++ = wc ^ 0100; ++ } ++ else ++ { ++ for (i = 0; i < mblength; i++) ++ { ++ width += 4; ++ chars += 4; ++ *s++ = '\\'; ++ sprintf (esc_buff, "%03o", (unsigned char) mbc[i]); ++ for (j = 0; j <= 2; ++j) ++ *s++ = (int) esc_buff[j]; ++ } ++ } ++ } ++ else if (wc == L'\b') ++ { ++ width += -1; ++ chars += 1; ++ *s++ = c; ++ } ++ else ++ { ++ width += 0; ++ chars += mblength; ++ for (i = 0; i < mblength; i++) ++ *s++ = mbc[i]; ++ } ++ } ++ else ++ { ++ width += wc_width; ++ chars += mblength; ++ for (i = 0; i < mblength; i++) ++ *s++ = mbc[i]; ++ } ++ } ++ memmove (mbc, mbc + mblength, MB_CUR_MAX - mblength); ++ mbc_pos -= mblength; ++ } ++ ++ /* Too many backspaces must put us in position 0 -- never negative. */ ++ if (width < 0 && input_position == 0) ++ { ++ chars = 0; ++ input_position = 0; ++ } ++ else if (width < 0 && input_position <= -width) ++ input_position = 0; ++ else ++ input_position += width; ++ ++ return chars; ++} ++#endif ++ + /* 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 --git a/src/sort.c b/src/sort.c +index 3b775d6..a0ba243 100644 +--- a/src/sort.c ++++ b/src/sort.c +@@ -29,6 +29,14 @@ + #include + #include + #include ++#if HAVE_WCHAR_H ++# include ++#endif ++/* Get isw* functions. */ ++#if HAVE_WCTYPE_H ++# include ++#endif ++ + #include "system.h" + #include "argmatch.h" + #include "die.h" +@@ -159,14 +167,39 @@ static int thousands_sep; + /* We currently ignore multi-byte grouping chars. */ + static bool thousands_sep_ignored; + ++/* True if -f is specified. */ ++static bool folding; ++ + /* Nonzero if the corresponding locales are hard. */ + static bool hard_LC_COLLATE; +-#if HAVE_NL_LANGINFO ++#if HAVE_LANGINFO_CODESET + static bool hard_LC_TIME; + #endif + + #define NONZERO(x) ((x) != 0) + ++/* get a multibyte character's byte length. */ ++#define GET_BYTELEN_OF_CHAR(LIM, PTR, MBLENGTH, STATE) \ ++ do \ ++ { \ ++ wchar_t wc; \ ++ mbstate_t state_bak; \ ++ \ ++ state_bak = STATE; \ ++ mblength = mbrtowc (&wc, PTR, LIM - PTR, &STATE); \ ++ \ ++ switch (MBLENGTH) \ ++ { \ ++ case (size_t)-1: \ ++ case (size_t)-2: \ ++ STATE = state_bak; \ ++ /* Fall through. */ \ ++ case 0: \ ++ MBLENGTH = 1; \ ++ } \ ++ } \ ++ while (0) ++ + /* The kind of blanks for '-b' to skip in various options. */ + enum blanktype { bl_start, bl_end, bl_both }; + +@@ -343,13 +376,11 @@ static bool stable; + /* An int value outside char range. */ + enum { NON_CHAR = CHAR_MAX + 1 }; + +-/* 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; + + /* Flag to remove consecutive duplicate lines from the output. + Only the last of a sequence of equal lines will be output. */ +@@ -805,6 +836,46 @@ reap_all (void) + reap (-1); + } + ++/* Function pointers. */ ++static void ++(*inittables) (void); ++static char * ++(*begfield) (const struct line*, const struct keyfield *); ++static char * ++(*limfield) (const struct line*, const struct keyfield *); ++static void ++(*skipblanks) (char **ptr, char *lim); ++static int ++(*getmonth) (char const *, size_t, char **); ++static int ++(*keycompare) (const struct line *, const struct line *); ++static int ++(*numcompare) (const char *, const char *); ++ ++/* Test for white space multibyte character. ++ Set LENGTH the byte length of investigated multibyte character. */ ++#if HAVE_MBRTOWC ++static int ++ismbblank (const char *str, size_t len, size_t *length) ++{ ++ size_t mblength; ++ wchar_t wc; ++ mbstate_t state; ++ ++ memset (&state, '\0', sizeof(mbstate_t)); ++ mblength = mbrtowc (&wc, str, len, &state); ++ ++ if (mblength == (size_t)-1 || mblength == (size_t)-2) ++ { ++ *length = 1; ++ return 0; ++ } ++ ++ *length = (mblength < 1) ? 1 : mblength; ++ return iswblank (wc) || wc == '\n'; ++} ++#endif ++ + /* Clean up any remaining temporary files. */ + + static void +@@ -1272,7 +1343,7 @@ zaptemp (char const *name) + free (node); + } + +-#if HAVE_NL_LANGINFO ++#if HAVE_LANGINFO_CODESET + + static int + struct_month_cmp (void const *m1, void const *m2) +@@ -1287,7 +1358,7 @@ struct_month_cmp (void const *m1, void const *m2) + /* Initialize the character class tables. */ + + static void +-inittables (void) ++inittables_uni (void) + { + size_t i; + +@@ -1299,7 +1370,7 @@ inittables (void) + fold_toupper[i] = toupper (i); + } + +-#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) + { +@@ -1381,6 +1452,84 @@ specify_nmerge (int oi, char c, char const *s) + xstrtol_fatal (e, oi, c, long_options, s); + } + ++#if HAVE_MBRTOWC ++static void ++inittables_mb (void) ++{ ++ int i, j, k, l; ++ char *name, *s, *lc_time, *lc_ctype; ++ size_t s_len, mblength; ++ char mbc[MB_LEN_MAX]; ++ wchar_t wc, pwc; ++ mbstate_t state_mb, state_wc; ++ ++ lc_time = setlocale (LC_TIME, ""); ++ if (lc_time) ++ lc_time = xstrdup (lc_time); ++ ++ lc_ctype = setlocale (LC_CTYPE, ""); ++ if (lc_ctype) ++ lc_ctype = xstrdup (lc_ctype); ++ ++ if (lc_time && lc_ctype) ++ /* temporarily set LC_CTYPE to match LC_TIME, so that we can convert ++ * the names of months to upper case */ ++ setlocale (LC_CTYPE, lc_time); ++ ++ for (i = 0; i < MONTHS_PER_YEAR; i++) ++ { ++ s = (char *) nl_langinfo (ABMON_1 + i); ++ s_len = strlen (s); ++ monthtab[i].name = name = (char *) xmalloc (s_len + 1); ++ monthtab[i].val = i + 1; ++ ++ memset (&state_mb, '\0', sizeof (mbstate_t)); ++ memset (&state_wc, '\0', sizeof (mbstate_t)); ++ ++ for (j = 0; j < s_len;) ++ { ++ if (!ismbblank (s + j, s_len - j, &mblength)) ++ break; ++ j += mblength; ++ } ++ ++ for (k = 0; j < s_len;) ++ { ++ mblength = mbrtowc (&wc, (s + j), (s_len - j), &state_mb); ++ assert (mblength != (size_t)-1 && mblength != (size_t)-2); ++ if (mblength == 0) ++ break; ++ ++ pwc = towupper (wc); ++ if (pwc == wc) ++ { ++ memcpy (mbc, s + j, mblength); ++ j += mblength; ++ } ++ else ++ { ++ j += mblength; ++ mblength = wcrtomb (mbc, pwc, &state_wc); ++ assert (mblength != (size_t)0 && mblength != (size_t)-1); ++ } ++ ++ for (l = 0; l < mblength; l++) ++ name[k++] = mbc[l]; ++ } ++ name[k] = '\0'; ++ } ++ qsort ((void *) monthtab, MONTHS_PER_YEAR, ++ sizeof (struct month), struct_month_cmp); ++ ++ if (lc_time && lc_ctype) ++ /* restore the original locales */ ++ setlocale (LC_CTYPE, lc_ctype); ++ ++ free (lc_ctype); ++ free (lc_time); ++} ++#endif ++ + /* Specify the amount of main memory to use when sorting. */ + static void + specify_sort_size (int oi, char c, char const *s) +@@ -1612,7 +1761,7 @@ buffer_linelim (struct buffer const *buf) + by KEY in LINE. */ + + static char * +-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; +@@ -1621,10 +1770,10 @@ begfield (struct line const *line, struct keyfield const *key) + /* The leading field separator itself is included in a field when -t + is absent. */ + +- if (tab != TAB_DEFAULT) ++ if (tab_length) + while (ptr < lim && sword--) + { +- while (ptr < lim && *ptr != tab) ++ while (ptr < lim && *ptr != tab[0]) + ++ptr; + if (ptr < lim) + ++ptr; +@@ -1650,12 +1799,71 @@ begfield (struct line const *line, struct keyfield const *key) + return ptr; + } + ++#if HAVE_MBRTOWC ++static char * ++begfield_mb (const struct line *line, const struct keyfield *key) ++{ ++ int i; ++ char *ptr = line->text, *lim = ptr + line->length - 1; ++ size_t sword = key->sword; ++ size_t schar = key->schar; ++ size_t mblength; ++ mbstate_t state; ++ ++ memset (&state, '\0', sizeof(mbstate_t)); ++ ++ if (tab_length) ++ while (ptr < lim && sword--) ++ { ++ while (ptr < lim && memcmp (ptr, tab, tab_length) != 0) ++ { ++ GET_BYTELEN_OF_CHAR (lim, ptr, mblength, state); ++ ptr += mblength; ++ } ++ if (ptr < lim) ++ { ++ GET_BYTELEN_OF_CHAR (lim, ptr, mblength, state); ++ ptr += mblength; ++ } ++ } ++ else ++ while (ptr < lim && sword--) ++ { ++ while (ptr < lim && ismbblank (ptr, lim - ptr, &mblength)) ++ ptr += mblength; ++ if (ptr < lim) ++ { ++ GET_BYTELEN_OF_CHAR (lim, ptr, mblength, state); ++ ptr += mblength; ++ } ++ while (ptr < lim && !ismbblank (ptr, lim - ptr, &mblength)) ++ ptr += mblength; ++ } ++ ++ if (key->skipsblanks) ++ while (ptr < lim && ismbblank (ptr, lim - ptr, &mblength)) ++ ptr += mblength; ++ ++ for (i = 0; i < schar; i++) ++ { ++ GET_BYTELEN_OF_CHAR (lim, ptr, mblength, state); ++ ++ if (ptr + mblength > lim) ++ break; ++ else ++ ptr += mblength; ++ } ++ ++ return ptr; ++} ++#endif ++ + /* Return the limit of (a pointer to the first character after) the field + in LINE specified by KEY. */ + + ATTRIBUTE_PURE + static char * +-limfield (struct line const *line, struct keyfield const *key) ++limfield_uni (struct line const *line, struct keyfield const *key) + { + char *ptr = line->text, *lim = ptr + line->length - 1; + size_t eword = key->eword, echar = key->echar; +@@ -1670,10 +1878,10 @@ limfield (struct line const *line, struct keyfield const *key) + 'beginning' is the first character following the delimiting TAB. + Otherwise, leave PTR pointing at the first 'blank' character after + the preceding field. */ +- if (tab != TAB_DEFAULT) ++ if (tab_length) + while (ptr < lim && eword--) + { +- while (ptr < lim && *ptr != tab) ++ while (ptr < lim && *ptr != tab[0]) + ++ptr; + if (ptr < lim && (eword || echar)) + ++ptr; +@@ -1719,10 +1927,10 @@ limfield (struct line const *line, struct keyfield const *key) + */ + + /* Make LIM point to the end of (one byte past) the current field. */ +- if (tab != TAB_DEFAULT) ++ if (tab_length) + { + char *newlim; +- newlim = memchr (ptr, tab, lim - ptr); ++ newlim = memchr (ptr, tab[0], lim - ptr); + if (newlim) + lim = newlim; + } +@@ -1753,6 +1961,130 @@ limfield (struct line const *line, struct keyfield const *key) + return ptr; + } + ++#if HAVE_MBRTOWC ++static char * _GL_ATTRIBUTE_PURE ++limfield_mb (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; ++ int i; ++ size_t mblength; ++ mbstate_t state; ++ ++ if (echar == 0) ++ eword++; /* skip all of end field. */ ++ ++ memset (&state, '\0', sizeof(mbstate_t)); ++ ++ if (tab_length) ++ while (ptr < lim && eword--) ++ { ++ while (ptr < lim && memcmp (ptr, tab, tab_length) != 0) ++ { ++ GET_BYTELEN_OF_CHAR (lim, ptr, mblength, state); ++ ptr += mblength; ++ } ++ if (ptr < lim && (eword | echar)) ++ { ++ GET_BYTELEN_OF_CHAR (lim, ptr, mblength, state); ++ ptr += mblength; ++ } ++ } ++ else ++ while (ptr < lim && eword--) ++ { ++ while (ptr < lim && ismbblank (ptr, lim - ptr, &mblength)) ++ ptr += mblength; ++ if (ptr < lim) ++ { ++ GET_BYTELEN_OF_CHAR (lim, ptr, mblength, state); ++ ptr += mblength; ++ } ++ while (ptr < lim && !ismbblank (ptr, lim - ptr, &mblength)) ++ ptr += mblength; ++ } ++ ++ ++# ifdef POSIX_UNSPECIFIED ++ /* Make LIM point to the end of (one byte past) the current field. */ ++ if (tab_length) ++ { ++ char *newlim, *p; ++ ++ newlim = NULL; ++ for (p = ptr; p < lim;) ++ { ++ if (memcmp (p, tab, tab_length) == 0) ++ { ++ newlim = p; ++ break; ++ } ++ ++ GET_BYTELEN_OF_CHAR (lim, ptr, mblength, state); ++ p += mblength; ++ } ++ } ++ else ++ { ++ char *newlim; ++ newlim = ptr; ++ ++ while (newlim < lim && ismbblank (newlim, lim - newlim, &mblength)) ++ newlim += mblength; ++ if (ptr < lim) ++ { ++ GET_BYTELEN_OF_CHAR (lim, ptr, mblength, state); ++ ptr += mblength; ++ } ++ while (newlim < lim && !ismbblank (newlim, lim - newlim, &mblength)) ++ newlim += mblength; ++ lim = newlim; ++ } ++# endif ++ ++ if (echar != 0) ++ { ++ /* If we're skipping leading blanks, don't start counting characters ++ * until after skipping past any leading blanks. */ ++ if (key->skipeblanks) ++ while (ptr < lim && ismbblank (ptr, lim - ptr, &mblength)) ++ ptr += mblength; ++ ++ memset (&state, '\0', sizeof(mbstate_t)); ++ ++ /* Advance PTR by ECHAR (if possible), but no further than LIM. */ ++ for (i = 0; i < echar; i++) ++ { ++ GET_BYTELEN_OF_CHAR (lim, ptr, mblength, state); ++ ++ if (ptr + mblength > lim) ++ break; ++ else ++ ptr += mblength; ++ } ++ } ++ ++ return ptr; ++} ++#endif ++ ++static void ++skipblanks_uni (char **ptr, char *lim) ++{ ++ while (*ptr < lim && blanks[to_uchar (**ptr)]) ++ ++(*ptr); ++} ++ ++#if HAVE_MBRTOWC ++static void ++skipblanks_mb (char **ptr, char *lim) ++{ ++ size_t mblength; ++ while (*ptr < lim && ismbblank (*ptr, lim - *ptr, &mblength)) ++ (*ptr) += mblength; ++} ++#endif ++ + /* 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 +@@ -1839,8 +2171,22 @@ fillbuf (struct buffer *buf, FILE *fp, char const *file) + else + { + if (key->skipsblanks) +- while (blanks[to_uchar (*line_start)]) +- line_start++; ++ { ++#if HAVE_MBRTOWC ++ if (MB_CUR_MAX > 1) ++ { ++ size_t mblength; ++ while (line_start < line->keylim && ++ ismbblank (line_start, ++ line->keylim - line_start, ++ &mblength)) ++ line_start += mblength; ++ } ++ else ++#endif ++ while (blanks[to_uchar (*line_start)]) ++ line_start++; ++ } + line->keybeg = line_start; + } + } +@@ -1976,12 +2322,10 @@ find_unit_order (char const *number) + + ATTRIBUTE_PURE + static int +-human_numcompare (char const *a, char const *b) ++human_numcompare (char *a, char *b) + { +- while (blanks[to_uchar (*a)]) +- a++; +- while (blanks[to_uchar (*b)]) +- b++; ++ skipblanks(&a, a + strlen(a)); ++ skipblanks(&b, b + strlen(b)); + + int diff = find_unit_order (a) - find_unit_order (b); + return (diff ? diff : strnumcmp (a, b, decimal_point, thousands_sep)); +@@ -1993,7 +2337,7 @@ human_numcompare (char const *a, char const *b) + + ATTRIBUTE_PURE + static int +-numcompare (char const *a, char const *b) ++numcompare_uni (const char *a, const char *b) + { + while (blanks[to_uchar (*a)]) + a++; +@@ -2003,6 +2347,25 @@ numcompare (char const *a, char const *b) + return strnumcmp (a, b, decimal_point, thousands_sep); + } + ++#if HAVE_MBRTOWC ++static int ++numcompare_mb (const char *a, const char *b) ++{ ++ size_t mblength, len; ++ len = strlen (a); /* okay for UTF-8 */ ++ while (*a && ismbblank (a, len > MB_CUR_MAX ? MB_CUR_MAX : len, &mblength)) ++ { ++ a += mblength; ++ len -= mblength; ++ } ++ len = strlen (b); /* okay for UTF-8 */ ++ while (*b && ismbblank (b, len > MB_CUR_MAX ? MB_CUR_MAX : len, &mblength)) ++ b += mblength; ++ ++ return strnumcmp (a, b, decimal_point, thousands_sep); ++} ++#endif /* HAV_EMBRTOWC */ ++ + /* 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 if +@@ -2053,7 +2416,7 @@ general_numcompare (char const *sa, char const *sb) + Return 0 if the name in S is not recognized. */ + + static int +-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; +@@ -2329,15 +2692,14 @@ debug_key (struct line const *line, struct keyfield const *key) + char saved = *lim; + *lim = '\0'; + +- 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, &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) +@@ -2483,7 +2845,7 @@ key_warnings (struct keyfield const *gkey, bool gkey_only) + /* Warn about significant leading blanks. */ + bool implicit_skip = key_numeric (key) || key->month; + bool line_offset = key->eword == 0 && key->echar != 0; /* -k1.x,1.y */ +- if (!zero_width && !gkey_only && tab == TAB_DEFAULT && !line_offset ++ if (!zero_width && !gkey_only && !tab_length && !line_offset + && ((!key->skipsblanks && !implicit_skip) + || (!key->skipsblanks && key->schar) + || (!key->skipeblanks && key->echar))) +@@ -2531,9 +2893,9 @@ key_warnings (struct keyfield const *gkey, bool gkey_only) + bool number_locale_warned = false; + if (basic_numeric_field_span) + { +- if (tab == TAB_DEFAULT +- ? thousands_sep != NON_CHAR && (isblank (to_uchar (thousands_sep))) +- : tab == thousands_sep) ++ if (tab_length ++ ? tab[0] == thousands_sep ++ : thousands_sep != NON_CHAR && (isblank (to_uchar (thousands_sep)))) + { + error (0, 0, + _("field separator %s is treated as a " +@@ -2544,9 +2906,9 @@ key_warnings (struct keyfield const *gkey, bool gkey_only) + } + if (basic_numeric_field_span || general_numeric_field_span) + { +- if (tab == TAB_DEFAULT +- ? thousands_sep != NON_CHAR && (isblank (to_uchar (decimal_point))) +- : tab == decimal_point) ++ if (tab_length ++ ? tab[0] == decimal_point ++ : thousands_sep != NON_CHAR && (isblank (to_uchar (decimal_point)))) + { + error (0, 0, + _("field separator %s is treated as a " +@@ -2554,19 +2916,19 @@ key_warnings (struct keyfield const *gkey, bool gkey_only) + quote (((char []) {decimal_point, 0}))); + number_locale_warned = true; + } +- else if (tab == '-') ++ else if (tab_length && tab[0] == '-') + { + error (0, 0, + _("field separator %s is treated as a " + "minus sign in numbers"), +- quote (((char []) {tab, 0}))); ++ quote (((char []) {tab[0], 0}))); + } +- else if (general_numeric_field_span && tab == '+') ++ else if (general_numeric_field_span && tab_length && tab[0] == '+') + { + error (0, 0, + _("field separator %s is treated as a " + "plus sign in numbers"), +- quote (((char []) {tab, 0}))); ++ quote (((char []) {tab[0], 0}))); + } + } + +@@ -2577,7 +2939,7 @@ key_warnings (struct keyfield const *gkey, bool gkey_only) + { + error (0, 0, + _("%snumbers use %s as a decimal point in this locale"), +- tab == decimal_point ? "" : _("note "), ++ (tab_length && tab[0] == decimal_point) ? "" : _("note "), + quote (((char []) {decimal_point, 0}))); + + } +@@ -2610,11 +2972,87 @@ key_warnings (struct keyfield const *gkey, bool gkey_only) + error (0, 0, _("option '-r' only applies to last-resort comparison")); + } + ++#if HAVE_MBRTOWC ++static int ++getmonth_mb (const char *s, size_t len, char **ea) ++{ ++ char *month; ++ register size_t i; ++ register int lo = 0, hi = MONTHS_PER_YEAR, result; ++ char *tmp; ++ size_t wclength, mblength; ++ const char *pp; ++ const wchar_t *wpp; ++ wchar_t *month_wcs; ++ mbstate_t state; ++ ++ while (len > 0 && ismbblank (s, len, &mblength)) ++ { ++ s += mblength; ++ len -= mblength; ++ } ++ ++ if (len == 0) ++ return 0; ++ ++ if (SIZE_MAX - len < 1) ++ xalloc_die (); ++ ++ month = (char *) xnmalloc (len + 1, MB_CUR_MAX); ++ ++ pp = tmp = (char *) xnmalloc (len + 1, MB_CUR_MAX); ++ memcpy (tmp, s, len); ++ tmp[len] = '\0'; ++ wpp = month_wcs = (wchar_t *) xnmalloc (len + 1, sizeof (wchar_t)); ++ memset (&state, '\0', sizeof (mbstate_t)); ++ ++ wclength = mbsrtowcs (month_wcs, &pp, len + 1, &state); ++ if (wclength == (size_t)-1 || pp != NULL) ++ error (SORT_FAILURE, 0, _("Invalid multibyte input %s."), quote(s)); ++ ++ for (i = 0; i < wclength; i++) ++ { ++ month_wcs[i] = towupper(month_wcs[i]); ++ if (iswblank (month_wcs[i])) ++ { ++ month_wcs[i] = L'\0'; ++ break; ++ } ++ } ++ ++ mblength = wcsrtombs (month, &wpp, (len + 1) * MB_CUR_MAX, &state); ++ assert (mblength != (-1) && wpp == NULL); ++ ++ do ++ { ++ int ix = (lo + hi) / 2; ++ ++ if (strncmp (month, monthtab[ix].name, strlen (monthtab[ix].name)) < 0) ++ hi = ix; ++ else ++ lo = ix; ++ } ++ while (hi - lo > 1); ++ ++ result = (!strncmp (month, monthtab[lo].name, strlen (monthtab[lo].name)) ++ ? monthtab[lo].val : 0); ++ ++ if (ea && result) ++ *ea = (char*) s + strlen (monthtab[lo].name); ++ ++ free (month); ++ free (tmp); ++ free (month_wcs); ++ ++ return result; ++} ++#endif ++ + /* Compare two lines A and B trying every key in sequence until there + are no more keys or a difference is found. */ + + static int +-keycompare (struct line const *a, struct line const *b) ++keycompare_uni (const struct line *a, const struct line *b) + { + struct keyfield *key = keylist; + +@@ -2699,7 +3137,7 @@ keycompare (struct line const *a, struct line const *b) + else if (key->human_numeric) + diff = human_numcompare (ta, tb); + else if (key->month) +- 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) +@@ -2815,6 +3253,211 @@ keycompare (struct line const *a, struct line const *b) + return key->reverse ? -diff : diff; + } + ++#if HAVE_MBRTOWC ++static int ++keycompare_mb (const struct line *a, const struct line *b) ++{ ++ struct keyfield *key = keylist; ++ ++ /* For the first iteration only, the key positions have been ++ precomputed for us. */ ++ char *texta = a->keybeg; ++ char *textb = b->keybeg; ++ char *lima = a->keylim; ++ char *limb = b->keylim; ++ ++ size_t mblength_a, mblength_b; ++ wchar_t wc_a, wc_b; ++ mbstate_t state_a, state_b; ++ ++ int diff = 0; ++ ++ memset (&state_a, '\0', sizeof(mbstate_t)); ++ memset (&state_b, '\0', sizeof(mbstate_t)); ++ /* Ignore keys with start after end. */ ++ if (a->keybeg - a->keylim > 0) ++ return 0; ++ ++ ++ /* Ignore and/or translate chars before comparing. */ ++# define IGNORE_CHARS(NEW_LEN, LEN, TEXT, COPY, WC, MBLENGTH, STATE) \ ++ do \ ++ { \ ++ wchar_t uwc; \ ++ char mbc[MB_LEN_MAX]; \ ++ mbstate_t state_wc; \ ++ \ ++ for (NEW_LEN = i = 0; i < LEN;) \ ++ { \ ++ mbstate_t state_bak; \ ++ \ ++ state_bak = STATE; \ ++ MBLENGTH = mbrtowc (&WC, TEXT + i, LEN - i, &STATE); \ ++ \ ++ if (MBLENGTH == (size_t)-2 || MBLENGTH == (size_t)-1 \ ++ || MBLENGTH == 0) \ ++ { \ ++ if (MBLENGTH == (size_t)-2 || MBLENGTH == (size_t)-1) \ ++ STATE = state_bak; \ ++ if (!ignore) \ ++ COPY[NEW_LEN++] = TEXT[i]; \ ++ i++; \ ++ continue; \ ++ } \ ++ \ ++ if (ignore) \ ++ { \ ++ if ((ignore == nonprinting && !iswprint (WC)) \ ++ || (ignore == nondictionary \ ++ && !iswalnum (WC) && !iswblank (WC))) \ ++ { \ ++ i += MBLENGTH; \ ++ continue; \ ++ } \ ++ } \ ++ \ ++ if (translate) \ ++ { \ ++ \ ++ uwc = towupper(WC); \ ++ if (WC == uwc) \ ++ { \ ++ memcpy (mbc, TEXT + i, MBLENGTH); \ ++ i += MBLENGTH; \ ++ } \ ++ else \ ++ { \ ++ i += MBLENGTH; \ ++ WC = uwc; \ ++ memset (&state_wc, '\0', sizeof (mbstate_t)); \ ++ \ ++ MBLENGTH = wcrtomb (mbc, WC, &state_wc); \ ++ assert (MBLENGTH != (size_t)-1 && MBLENGTH != 0); \ ++ } \ ++ \ ++ for (j = 0; j < MBLENGTH; j++) \ ++ COPY[NEW_LEN++] = mbc[j]; \ ++ } \ ++ else \ ++ for (j = 0; j < MBLENGTH; j++) \ ++ COPY[NEW_LEN++] = TEXT[i++]; \ ++ } \ ++ COPY[NEW_LEN] = '\0'; \ ++ } \ ++ while (0) ++ ++ /* Actually compare the fields. */ ++ ++ for (;;) ++ { ++ /* Find the lengths. */ ++ 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; ++ ++ if (ignore || translate) ++ { ++ if (SIZE_MAX - lenb - 2 < lena) ++ xalloc_die (); ++ char *copy_a = (char *) xnmalloc (lena + lenb + 2, MB_CUR_MAX); ++ char *copy_b = copy_a + lena * MB_CUR_MAX + 1; ++ size_t new_len_a, new_len_b; ++ size_t i, j; ++ ++ IGNORE_CHARS (new_len_a, lena, texta, copy_a, ++ wc_a, mblength_a, state_a); ++ IGNORE_CHARS (new_len_b, lenb, textb, copy_b, ++ wc_b, mblength_b, state_b); ++ 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); ++ else if (key->numeric | key->general_numeric | key->human_numeric) ++ { ++ char savea = *lima, saveb = *limb; ++ ++ *lima = *limb = '\0'; ++ diff = (key->numeric ? numcompare (texta, textb) ++ : key->general_numeric ? general_numcompare (texta, textb) ++ : human_numcompare (texta, textb)); ++ *lima = savea, *limb = saveb; ++ } ++ else if (key->version) ++ diff = filevercmp (texta, textb); ++ else if (key->month) ++ diff = getmonth (texta, lena, NULL) - getmonth (textb, lenb, NULL); ++ else if (lena == 0) ++ diff = - NONZERO (lenb); ++ else if (lenb == 0) ++ diff = 1; ++ else if (hard_LC_COLLATE && !folding) ++ { ++ diff = xmemcoll0 (texta, lena + 1, textb, lenb + 1); ++ } ++ else ++ { ++ 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; ++ ++ key = key->next; ++ if (! key) ++ break; ++ ++ /* Find the beginning and limit of the next field. */ ++ if (key->eword != -1) ++ lima = limfield (a, key), limb = limfield (b, key); ++ else ++ lima = a->text + a->length - 1, limb = b->text + b->length - 1; ++ ++ if (key->sword != -1) ++ texta = begfield (a, key), textb = begfield (b, key); ++ else ++ { ++ texta = a->text, textb = b->text; ++ if (key->skipsblanks) ++ { ++ while (texta < lima && ismbblank (texta, lima - texta, &mblength_a)) ++ texta += mblength_a; ++ while (textb < limb && ismbblank (textb, limb - textb, &mblength_b)) ++ textb += mblength_b; ++ } ++ } ++ } ++ ++not_equal: ++ if (key && key->reverse) ++ return -diff; ++ else ++ return diff; ++} ++#endif ++ + /* Compare two lines A and B, returning negative, zero, or positive + depending on whether A compares less than, equal to, or greater than B. */ + +@@ -2842,7 +3485,7 @@ compare (struct line const *a, struct line const *b) + diff = - NONZERO (blen); + else if (blen == 0) + diff = 1; +- else if (hard_LC_COLLATE) ++ else if (hard_LC_COLLATE && !folding) + { + /* xmemcoll0 is a performance enhancement as + it will not unconditionally write '\0' after the +@@ -4226,6 +4869,7 @@ set_ordering (char const *s, struct keyfield *key, enum blanktype blanktype) + break; + case 'f': + key->translate = fold_toupper; ++ folding = true; + break; + case 'g': + key->general_numeric = true; +@@ -4305,7 +4949,7 @@ main (int argc, char **argv) + initialize_exit_failure (SORT_FAILURE); + + hard_LC_COLLATE = hard_locale (LC_COLLATE); +-#if HAVE_NL_LANGINFO ++#if HAVE_LANGINFO_CODESET + hard_LC_TIME = hard_locale (LC_TIME); + #endif + +@@ -4328,6 +4972,29 @@ main (int argc, char **argv) + thousands_sep = NON_CHAR; + } + ++#if HAVE_MBRTOWC ++ if (MB_CUR_MAX > 1) ++ { ++ inittables = inittables_mb; ++ begfield = begfield_mb; ++ limfield = limfield_mb; ++ skipblanks = skipblanks_mb; ++ getmonth = getmonth_mb; ++ keycompare = keycompare_mb; ++ numcompare = numcompare_mb; ++ } ++ else ++#endif ++ { ++ inittables = inittables_uni; ++ begfield = begfield_uni; ++ limfield = limfield_uni; ++ skipblanks = skipblanks_uni; ++ getmonth = getmonth_uni; ++ keycompare = keycompare_uni; ++ numcompare = numcompare_uni; ++ } ++ + have_read_stdin = false; + inittables (); + +@@ -4602,13 +5269,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]) + die (SORT_FAILURE, 0, _("empty tab")); +- if (optarg[1]) ++#if HAVE_MBRTOWC ++ if (MB_CUR_MAX > 1) ++ { ++ wchar_t wc; ++ mbstate_t state; ++ ++ memset (&state, '\0', sizeof (mbstate_t)); ++ newtab_length = mbrtowc (&wc, newtab, strnlen (newtab, ++ MB_LEN_MAX), ++ &state); ++ switch (newtab_length) ++ { ++ case (size_t) -1: ++ case (size_t) -2: ++ case 0: ++ newtab_length = 1; ++ } ++ } ++#endif ++ if (newtab_length == 1 && optarg[1]) + { + if (STREQ (optarg, "\\0")) +- newtab = '\0'; ++ newtab[0] = '\0'; + else + { + /* Provoke with 'sort -txx'. Complain about +@@ -4619,9 +5307,11 @@ 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)) + die (SORT_FAILURE, 0, _("incompatible tabs")); +- tab = newtab; ++ memcpy (tab, newtab, newtab_length); ++ tab_length = newtab_length; + } + break; + +diff --git a/src/unexpand.c b/src/unexpand.c +index 7d6100f..04cd646 100644 +--- a/src/unexpand.c ++++ b/src/unexpand.c +@@ -38,6 +38,9 @@ + #include + #include + #include ++ ++#include ++ + #include "system.h" + #include "die.h" + +@@ -106,24 +109,47 @@ unexpand (void) + { + /* Input stream. */ + FILE *fp = next_file (NULL); ++ mb_file_t mbf; + + /* The array of pending blanks. In non-POSIX locales, blanks can + include characters other than spaces, so the blanks must be + stored, not merely counted. */ +- char *pending_blank; ++ mbf_char_t *pending_blank; ++ /* True if the starting locale is utf8. */ ++ bool using_utf_locale; ++ ++ /* True if the first file contains BOM header. */ ++ bool found_bom; ++ using_utf_locale=check_utf_locale(); + + if (!fp) + return; ++ mbf_init (mbf, fp); ++ found_bom=check_bom(fp,&mbf); ++ ++ if (using_utf_locale == false && found_bom == true) ++ { ++ /*try using some predefined locale */ + ++ if (set_utf_locale () != 0) ++ { ++ error (EXIT_FAILURE, errno, _("cannot set UTF-8 locale")); ++ } ++ } + /* The worst case is a non-blank character, then one blank, then a + tab stop, then MAX_COLUMN_WIDTH - 1 blanks, then a non-blank; so + allocate MAX_COLUMN_WIDTH bytes to store the blanks. */ +- pending_blank = xmalloc (max_column_width); ++ pending_blank = xmalloc (max_column_width * sizeof (mbf_char_t)); ++ ++ if (found_bom == true) ++ { ++ print_bom(); ++ } + + while (true) + { + /* Input character, or EOF. */ +- int c; ++ mbf_char_t c; + + /* If true, perform translations. */ + bool convert = true; +@@ -157,12 +183,44 @@ unexpand (void) + + do + { +- while ((c = getc (fp)) < 0 && (fp = next_file (fp))) +- continue; ++ while (true) { ++ mbf_getc (c, mbf); ++ if ((mb_iseof (c)) && (fp = next_file (fp))) ++ { ++ mbf_init (mbf, fp); ++ if (fp!=NULL) ++ { ++ if (check_bom(fp,&mbf)==true) ++ { ++ /*Not the first file - check BOM header*/ ++ if (using_utf_locale==false && found_bom==false) ++ { ++ /*BOM header in subsequent file but not in the first one. */ ++ error (EXIT_FAILURE, errno, _("combination of files with and without BOM header")); ++ } ++ } ++ else ++ { ++ if(using_utf_locale==false && found_bom==true) ++ { ++ /*First file conatined BOM header - locale was switched to UTF ++ *all subsequent files should contain BOM. */ ++ error (EXIT_FAILURE, errno, _("combination of files with and without BOM header")); ++ } ++ } ++ } ++ continue; ++ } ++ else ++ { ++ break; ++ } ++ } ++ + + if (convert) + { +- bool blank = !! isblank (c); ++ bool blank = mb_isblank (c); + + if (blank) + { +@@ -179,16 +237,16 @@ unexpand (void) + if (next_tab_column < column) + die (EXIT_FAILURE, 0, _("input line is too long")); + +- if (c == '\t') ++ if (mb_iseq (c, '\t')) + { + column = next_tab_column; + + if (pending) +- pending_blank[0] = '\t'; ++ mb_setascii (&pending_blank[0], '\t'); + } + else + { +- column++; ++ column += mb_width (c); + + if (! (prev_blank && column == next_tab_column)) + { +@@ -196,13 +254,14 @@ unexpand (void) + will be replaced by tabs. */ + if (column == next_tab_column) + one_blank_before_tab_stop = true; +- pending_blank[pending++] = c; ++ mb_copy (&pending_blank[pending++], &c); + prev_blank = true; + continue; + } + + /* Replace the pending blanks by a tab or two. */ +- pending_blank[0] = c = '\t'; ++ mb_setascii (&c, '\t'); ++ mb_setascii (&pending_blank[0], '\t'); + } + + /* Discard pending blanks, unless it was a single +@@ -210,7 +269,7 @@ unexpand (void) + pending = one_blank_before_tab_stop; + } + } +- else if (c == '\b') ++ else if (mb_iseq (c, '\b')) + { + /* Go back one column, and force recalculation of the + next tab stop. */ +@@ -218,9 +277,11 @@ unexpand (void) + next_tab_column = column; + tab_index -= !!tab_index; + } +- else ++ else if (!mb_iseq (c, '\n')) + { +- column++; ++ /* mb_width() returns 0 for control characters */ ++ const int width = mb_width (c); ++ column += MAX(1, width); + if (!column) + die (EXIT_FAILURE, 0, _("input line is too long")); + } +@@ -228,8 +289,11 @@ unexpand (void) + if (pending) + { + if (pending > 1 && one_blank_before_tab_stop) +- pending_blank[0] = '\t'; +- if (fwrite (pending_blank, 1, pending, stdout) != pending) ++ mb_setascii (&pending_blank[0], '\t'); ++ ++ for (int n = 0; n < pending; ++n) ++ mb_putc (pending_blank[n], stdout); ++ if (ferror (stdout)) + die (EXIT_FAILURE, errno, _("write error")); + pending = 0; + one_blank_before_tab_stop = false; +@@ -239,16 +303,17 @@ unexpand (void) + convert &= convert_entire_line || blank; + } + +- if (c < 0) ++ if (mb_iseof (c)) + { + free (pending_blank); + return; + } + +- if (putchar (c) < 0) ++ mb_putc (c, stdout); ++ if (ferror (stdout)) + die (EXIT_FAILURE, errno, _("write error")); + } +- while (c != '\n'); ++ while (!mb_iseq (c, '\n')); + } + } + +diff --git a/src/uniq.c b/src/uniq.c +index e5996f0..871d47c 100644 +--- a/src/uniq.c ++++ b/src/uniq.c +@@ -21,6 +21,17 @@ + #include + #include + ++/* Get mbstate_t, mbrtowc(). */ ++#if HAVE_WCHAR_H ++# include ++#endif ++ ++/* Get isw* functions. */ ++#if HAVE_WCTYPE_H ++# include ++#endif ++#include ++ + #include "system.h" + #include "argmatch.h" + #include "linebuffer.h" +@@ -33,6 +44,18 @@ + #include "memcasecmp.h" + #include "quote.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 ++# 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 ++ ++ + /* The official name of this program (e.g., no 'g' prefix). */ + #define PROGRAM_NAME "uniq" + +@@ -139,6 +162,10 @@ enum + GROUP_OPTION = CHAR_MAX + 1 + }; + ++/* Function pointers. */ ++static char * ++(*find_field) (struct linebuffer *line); ++ + static struct option const longopts[] = + { + {"count", no_argument, NULL, 'c'}, +@@ -254,7 +281,7 @@ size_opt (char const *opt, char const *msgid) + + ATTRIBUTE_PURE + static char * +-find_field (struct linebuffer const *line) ++find_field_uni (struct linebuffer *line) + { + size_t count; + char const *lp = line->buffer; +@@ -274,6 +301,83 @@ find_field (struct linebuffer const *line) + return line->buffer + i; + } + ++#if HAVE_MBRTOWC ++ ++# define MBCHAR_TO_WCHAR(WC, MBLENGTH, LP, POS, SIZE, STATEP, CONVFAIL) \ ++ do \ ++ { \ ++ mbstate_t state_bak; \ ++ \ ++ CONVFAIL = 0; \ ++ state_bak = *STATEP; \ ++ \ ++ MBLENGTH = mbrtowc (&WC, LP + POS, SIZE - POS, STATEP); \ ++ \ ++ switch (MBLENGTH) \ ++ { \ ++ case (size_t)-2: \ ++ case (size_t)-1: \ ++ *STATEP = state_bak; \ ++ CONVFAIL++; \ ++ /* Fall through */ \ ++ case 0: \ ++ MBLENGTH = 1; \ ++ } \ ++ } \ ++ while (0) ++ ++static char * ++find_field_multi (struct linebuffer *line) ++{ ++ size_t count; ++ char *lp = line->buffer; ++ size_t size = line->length - 1; ++ size_t pos; ++ size_t mblength; ++ wchar_t wc; ++ mbstate_t *statep; ++ int convfail = 0; ++ ++ pos = 0; ++ statep = &(line->state); ++ ++ /* skip fields. */ ++ for (count = 0; count < skip_fields && pos < size; count++) ++ { ++ while (pos < size) ++ { ++ MBCHAR_TO_WCHAR (wc, mblength, lp, pos, size, statep, convfail); ++ ++ if (convfail || !(iswblank (wc) || wc == '\n')) ++ { ++ pos += mblength; ++ break; ++ } ++ pos += mblength; ++ } ++ ++ while (pos < size) ++ { ++ MBCHAR_TO_WCHAR (wc, mblength, lp, pos, size, statep, convfail); ++ ++ if (!convfail && (iswblank (wc) || wc == '\n')) ++ break; ++ ++ pos += mblength; ++ } ++ } ++ ++ /* skip fields. */ ++ for (count = 0; count < skip_chars && pos < size; count++) ++ { ++ MBCHAR_TO_WCHAR (wc, mblength, lp, pos, size, statep, convfail); ++ pos += mblength; ++ } ++ ++ return lp + pos; ++} ++#endif ++ + /* 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. +@@ -494,6 +598,19 @@ main (int argc, char **argv) + + atexit (close_stdout); + ++#if HAVE_MBRTOWC ++ if (MB_CUR_MAX > 1) ++ { ++ find_field = find_field_multi; ++ } ++ else ++#endif ++ { ++ find_field = find_field_uni; ++ } ++ ++ ++ + skip_chars = 0; + skip_fields = 0; + check_chars = SIZE_MAX; +diff --git a/tests/Coreutils.pm b/tests/Coreutils.pm +index fad7ab9..c9021a6 100644 +--- a/tests/Coreutils.pm ++++ b/tests/Coreutils.pm +@@ -269,6 +269,9 @@ sub run_tests ($$$$$) + # Yes, this is an arbitrary limit. If it causes trouble, + # consider removing it. + my $max = 30; ++ # The downstream i18n multi-byte tests have a "-mb" suffix. ++ # Therefore add 3 to the maximum test name length. ++ $max += 3; + if ($max < length $test_name) + { + warn "$program_name: $test_name: test name is too long (> $max)\n"; +diff --git a/tests/expand/mb.sh b/tests/expand/mb.sh +new file mode 100755 +index 0000000..dd6007c +--- /dev/null ++++ b/tests/expand/mb.sh +@@ -0,0 +1,183 @@ ++#!/bin/sh ++ ++# Copyright (C) 2012-2015 Free Software Foundation, Inc. ++ ++# This program is free software: you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation, either version 3 of the License, or ++# (at your option) any later version. ++ ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++ ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src ++print_ver_ expand ++ ++export LC_ALL=en_US.UTF-8 ++ ++#input containing multibyte characters ++cat <<\EOF > in || framework_failure_ ++1234567812345678123456781 ++. . . . ++a b c d ++. . . . ++ä ö ü ß ++. . . . ++EOF ++env printf ' äöü\t. öüä. \tä xx\n' >> in || framework_failure_ ++ ++cat <<\EOF > exp || framework_failure_ ++1234567812345678123456781 ++. . . . ++a b c d ++. . . . ++ä ö ü ß ++. . . . ++ äöü . öüä. ä xx ++EOF ++ ++expand < in > out || fail=1 ++compare exp out > /dev/null 2>&1 || fail=1 ++ ++#multiple files as an input ++cat <<\EOF >> exp || framework_failure_ ++1234567812345678123456781 ++. . . . ++a b c d ++. . . . ++ä ö ü ß ++. . . . ++ äöü . öüä. ä xx ++EOF ++ ++expand ./in ./in > out || fail=1 ++compare exp out > /dev/null 2>&1 || fail=1 ++ ++#test characters with display widths != 1 ++env printf '12345678 ++e\t|ascii(1) ++\u00E9\t|composed(1) ++e\u0301\t|decomposed(1) ++\u3000\t|ideo-space(2) ++\uFF0D\t|full-hypen(2) ++' > in || framework_failure_ ++ ++env printf '12345678 ++e |ascii(1) ++\u00E9 |composed(1) ++e\u0301 |decomposed(1) ++\u3000 |ideo-space(2) ++\uFF0D |full-hypen(2) ++' > exp || framework_failure_ ++ ++expand < in > out || fail=1 ++compare exp out > /dev/null 2>&1 || fail=1 ++ ++#shouldn't fail with "input line too long" ++#when a line starts with a control character ++env printf '\n' > in || framework_failure_ ++ ++expand < in > out || fail=1 ++compare in out > /dev/null 2>&1 || fail=1 ++ ++#non-Unicode characters interspersed between Unicode ones ++env printf '12345678 ++\t\xFF| ++\xFF\t| ++\t\xFFä| ++ä\xFF\t| ++\tä\xFF| ++\xFF\tä| ++äbcdef\xFF\t| ++' > in || framework_failure_ ++ ++env printf '12345678 ++ \xFF| ++\xFF | ++ \xFFä| ++ä\xFF | ++ ä\xFF| ++\xFF ä| ++äbcdef\xFF | ++' > exp || framework_failure_ ++ ++expand < in > out || fail=1 ++compare exp out > /dev/null 2>&1 || fail=1 ++ ++ ++ ++#BOM header test 1 ++printf "\xEF\xBB\xBF" > in; cat <<\EOF >> in || framework_failure_ ++1234567812345678123456781 ++. . . . ++a b c d ++. . . . ++ä ö ü ß ++. . . . ++EOF ++env printf ' äöü\t. öüä. \tä xx\n' >> in || framework_failure_ ++ ++printf "\xEF\xBB\xBF" > exp; cat <<\EOF >> exp || framework_failure_ ++1234567812345678123456781 ++. . . . ++a b c d ++. . . . ++ä ö ü ß ++. . . . ++ äöü . öüä. ä xx ++EOF ++ ++ ++expand < in > out || fail=1 ++compare exp out > /dev/null 2>&1 || fail=1 ++ ++LANG=C expand < in > out || fail=1 ++compare exp out > /dev/null 2>&1 || fail=1 ++ ++LC_ALL=C expand < in > out || fail=1 ++compare exp out > /dev/null 2>&1 || fail=1 ++ ++ ++printf '\xEF\xBB\xBF' > in1; cat <<\EOF >> in1 || framework_failure_ ++1234567812345678123456781 ++. . . . ++a b c d ++. . . . ++ä ö ü ß ++. . . . ++EOF ++env printf ' äöü\t. öüä. \tä xx\n' >> in1 || framework_failure_ ++ ++ ++printf '\xEF\xBB\xBF' > exp; cat <<\EOF >> exp || framework_failure_ ++1234567812345678123456781 ++. . . . ++a b c d ++. . . . ++ä ö ü ß ++. . . . ++ äöü . öüä. ä xx ++1234567812345678123456781 ++. . . . ++a b c d ++. . . . ++ä ö ü ß ++. . . . ++ äöü . öüä. ä xx ++EOF ++ ++expand in1 in1 > out || fail=1 ++compare exp out > /dev/null 2>&1 || fail=1 ++ ++LANG=C expand in1 in1 > out || fail=1 ++compare exp out > /dev/null 2>&1 || fail=1 ++ ++LC_ALL=C expand in1 in1 > out || fail=1 ++compare exp out > /dev/null 2>&1 || fail=1 ++ ++exit $fail +diff --git a/tests/i18n/sort.sh b/tests/i18n/sort.sh +new file mode 100755 +index 0000000..26c95de +--- /dev/null ++++ b/tests/i18n/sort.sh +@@ -0,0 +1,29 @@ ++#!/bin/sh ++# Verify sort's multi-byte support. ++ ++. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src ++print_ver_ sort ++ ++export LC_ALL=en_US.UTF-8 ++locale -k LC_CTYPE | grep -q "charmap.*UTF-8" \ ++ || skip_ "No UTF-8 locale available" ++ ++# Enable heap consistency checkng on older systems ++export MALLOC_CHECK_=2 ++ ++ ++# check buffer overflow issue due to ++# expanding multi-byte representation due to case conversion ++# https://bugzilla.suse.com/show_bug.cgi?id=928749 ++cat < exp ++. ++ɑ ++EOF ++cat < out || fail=1 ++. ++ɑ ++EOF ++compare exp out || { fail=1; cat out; } ++ ++ ++Exit $fail +diff --git a/tests/local.mk b/tests/local.mk +index 0f77786..dbe1843 100644 +--- a/tests/local.mk ++++ b/tests/local.mk +@@ -377,6 +377,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-h-thousands-sep.sh \ + tests/misc/sort-merge.pl \ + tests/misc/sort-merge-fdlimit.sh \ +@@ -576,6 +578,7 @@ all_tests = \ + tests/du/threshold.sh \ + tests/du/trailing-slash.sh \ + tests/du/two-args.sh \ ++ tests/expand/mb.sh \ + tests/id/gnu-zero-uids.sh \ + tests/id/no-context.sh \ + tests/id/context.sh \ +@@ -727,6 +730,7 @@ all_tests = \ + tests/touch/read-only.sh \ + tests/touch/relative.sh \ + tests/touch/trailing-slash.sh \ ++ tests/unexpand/mb.sh \ + $(all_root_tests) + + # See tests/factor/create-test.sh. +diff --git a/tests/misc/expand.pl b/tests/misc/expand.pl +index 7a77e6f..27f6652 100755 +--- a/tests/misc/expand.pl ++++ b/tests/misc/expand.pl +@@ -27,6 +27,15 @@ my $prog = 'expand'; + # Turn off localization of executable's output. + @ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3; + ++#comment out next line to disable multibyte tests ++my $mb_locale = $ENV{LOCALE_FR_UTF8}; ++! defined $mb_locale || $mb_locale eq 'none' ++ and $mb_locale = 'C'; ++ ++my $prog = 'expand'; ++my $try = "Try \`$prog --help' for more information.\n"; ++my $inval = "$prog: invalid byte, character or field list\n$try"; ++ + my @Tests = + ( + ['t1', '--tabs=3', {IN=>"a\tb"}, {OUT=>"a b"}], +@@ -168,6 +177,8 @@ my @Tests = + + + # Test errors ++ # FIXME: The following tests contain ‘quoting’ specific to LC_MESSAGES ++ # So we force LC_MESSAGES=C to make them pass. + ['e1', '--tabs="a"', {IN=>''}, {OUT=>''}, {EXIT=>1}, + {ERR => "$prog: tab size contains invalid character(s): 'a'\n"}], + ['e2', "-t $UINTMAX_OFLOW", {IN=>''}, {OUT=>''}, {EXIT=>1}, +@@ -184,6 +195,37 @@ my @Tests = + {ERR => "$prog: '/' specifier not at start of number: '/'\n"}], + ); + ++if ($mb_locale ne 'C') ++ { ++ # Duplicate each test vector, appending "-mb" to the test name and ++ # inserting {ENV => "LC_ALL=$mb_locale"} in the copy, so that we ++ # provide coverage for the distro-added multi-byte code paths. ++ my @new; ++ foreach my $t (@Tests) ++ { ++ my @new_t = @$t; ++ my $test_name = shift @new_t; ++ ++ # Depending on whether expand is multi-byte-patched, ++ # it emits different diagnostics: ++ # non-MB: invalid byte or field list ++ # MB: invalid byte, character or field list ++ # Adjust the expected error output accordingly. ++ if (grep {ref $_ eq 'HASH' && exists $_->{ERR} && $_->{ERR} eq $inval} ++ (@new_t)) ++ { ++ my $sub = {ERR_SUBST => 's/, character//'}; ++ push @new_t, $sub; ++ push @$t, $sub; ++ } ++ push @new, ["$test_name-mb", @new_t, {ENV => "LANG=$mb_locale LC_MESSAGES=C"}]; ++ } ++ push @Tests, @new; ++ } ++ ++ ++@Tests = triple_test \@Tests; ++ + my $save_temps = $ENV{DEBUG}; + my $verbose = $ENV{VERBOSE}; + +diff --git a/tests/misc/fold.pl b/tests/misc/fold.pl +index 2834f92..bc1616a 100755 +--- a/tests/misc/fold.pl ++++ b/tests/misc/fold.pl +@@ -20,9 +20,18 @@ use strict; + + (my $program_name = $0) =~ s|.*/||; + ++my $prog = 'fold'; ++my $try = "Try \`$prog --help' for more information.\n"; ++my $inval = "$prog: invalid byte, character or field list\n$try"; ++ + # Turn off localization of executable's output. + @ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3; + ++# uncommented to enable multibyte paths ++my $mb_locale = $ENV{LOCALE_FR_UTF8}; ++! defined $mb_locale || $mb_locale eq 'none' ++ and $mb_locale = 'C'; ++ + my @Tests = + ( + ['s1', '-w2 -s', {IN=>"a\t"}, {OUT=>"a\n\t"}], +@@ -31,9 +40,48 @@ my @Tests = + ['s4', '-w4 -s', {IN=>"abc ef\n"}, {OUT=>"abc \nef\n"}], + ); + ++# Add _POSIX2_VERSION=199209 to the environment of each test ++# that uses an old-style option like +1. ++if ($mb_locale ne 'C') ++ { ++ # Duplicate each test vector, appending "-mb" to the test name and ++ # inserting {ENV => "LC_ALL=$mb_locale"} in the copy, so that we ++ # provide coverage for the distro-added multi-byte code paths. ++ my @new; ++ foreach my $t (@Tests) ++ { ++ my @new_t = @$t; ++ my $test_name = shift @new_t; ++ ++ # Depending on whether fold is multi-byte-patched, ++ # it emits different diagnostics: ++ # non-MB: invalid byte or field list ++ # MB: invalid byte, character or field list ++ # Adjust the expected error output accordingly. ++ if (grep {ref $_ eq 'HASH' && exists $_->{ERR} && $_->{ERR} eq $inval} ++ (@new_t)) ++ { ++ my $sub = {ERR_SUBST => 's/, character//'}; ++ push @new_t, $sub; ++ push @$t, $sub; ++ } ++ push @new, ["$test_name-mb", @new_t, {ENV => "LC_ALL=$mb_locale"}]; ++ } ++ push @Tests, @new; ++ } ++ ++@Tests = triple_test \@Tests; ++ ++# 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 ++# due to a race condition about 1 in 20 times. ++# 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; ++ + my $save_temps = $ENV{DEBUG}; + my $verbose = $ENV{VERBOSE}; + +-my $prog = 'fold'; + my $fail = run_tests ($program_name, $prog, \@Tests, $save_temps, $verbose); + exit $fail; +diff --git a/tests/misc/join.pl b/tests/misc/join.pl +index 06ad777..be40204 100755 +--- a/tests/misc/join.pl ++++ b/tests/misc/join.pl +@@ -25,6 +25,15 @@ my $limits = getlimits (); + + my $prog = 'join'; + ++my $try = "Try \`$prog --help' for more information.\n"; ++my $inval = "$prog: invalid byte, character or field list\n$try"; ++ ++my $mb_locale; ++#Comment out next line to disable multibyte tests ++$mb_locale = $ENV{LOCALE_FR_UTF8}; ++! defined $mb_locale || $mb_locale eq 'none' ++ and $mb_locale = 'C'; ++ + my $delim = chr 0247; + sub t_subst ($) + { +@@ -333,8 +342,49 @@ foreach my $t (@tv) + push @Tests, $new_ent; + } + ++# Add _POSIX2_VERSION=199209 to the environment of each test ++# that uses an old-style option like +1. ++if ($mb_locale ne 'C') ++ { ++ # Duplicate each test vector, appending "-mb" to the test name and ++ # inserting {ENV => "LC_ALL=$mb_locale"} in the copy, so that we ++ # provide coverage for the distro-added multi-byte code paths. ++ my @new; ++ foreach my $t (@Tests) ++ { ++ my @new_t = @$t; ++ my $test_name = shift @new_t; ++ ++ # Depending on whether join is multi-byte-patched, ++ # it emits different diagnostics: ++ # non-MB: invalid byte or field list ++ # MB: invalid byte, character or field list ++ # Adjust the expected error output accordingly. ++ if (grep {ref $_ eq 'HASH' && exists $_->{ERR} && $_->{ERR} eq $inval} ++ (@new_t)) ++ { ++ my $sub = {ERR_SUBST => 's/, character//'}; ++ push @new_t, $sub; ++ push @$t, $sub; ++ } ++ #Adjust the output some error messages including test_name for mb ++ if (grep {ref $_ eq 'HASH' && exists $_->{ERR}} ++ (@new_t)) ++ { ++ my $sub2 = {ERR_SUBST => "s/$test_name-mb/$test_name/"}; ++ push @new_t, $sub2; ++ push @$t, $sub2; ++ } ++ push @new, ["$test_name-mb", @new_t, {ENV => "LC_ALL=$mb_locale"}]; ++ } ++ push @Tests, @new; ++ } ++ + @Tests = triple_test \@Tests; + ++#skip invalid-j-mb test, it is failing because of the format ++@Tests = grep {$_->[0] ne 'invalid-j-mb'} @Tests; ++ + my $save_temps = $ENV{DEBUG}; + my $verbose = $ENV{VERBOSE}; + +diff --git a/tests/misc/sort-mb-tests.sh b/tests/misc/sort-mb-tests.sh +new file mode 100755 +index 0000000..11836ba +--- /dev/null ++++ b/tests/misc/sort-mb-tests.sh +@@ -0,0 +1,45 @@ ++#!/bin/sh ++# Verify sort's multi-byte support. ++ ++. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src ++print_ver_ sort ++ ++export LC_ALL=en_US.UTF-8 ++locale -k LC_CTYPE | grep -q "charmap.*UTF-8" \ ++ || skip_ "No UTF-8 locale available" ++ ++ ++cat < exp ++Banana@5 ++Apple@10 ++Citrus@20 ++Cherry@30 ++EOF ++ ++cat < out || fail=1 ++Apple@10 ++Banana@5 ++Citrus@20 ++Cherry@30 ++EOF ++ ++compare exp out || { fail=1; cat out; } ++ ++ ++cat < exp ++Citrus@AA20@@5 ++Cherry@AA30@@10 ++Apple@AA10@@20 ++Banana@AA5@@30 ++EOF ++ ++cat < out || fail=1 ++Apple@AA10@@20 ++Banana@AA5@@30 ++Citrus@AA20@@5 ++Cherry@AA30@@10 ++EOF ++ ++compare exp out || { fail=1; cat out; } ++ ++Exit $fail +diff --git a/tests/misc/sort-merge.pl b/tests/misc/sort-merge.pl +index 7eb4574..eda884c 100755 +--- a/tests/misc/sort-merge.pl ++++ b/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; + ++my $mb_locale; ++# uncommented according to upstream commit enabling multibyte paths ++$mb_locale = $ENV{LOCALE_FR_UTF8}; ++! defined $mb_locale || $mb_locale eq 'none' ++ and $mb_locale = 'C'; ++ ++my $try = "Try \`$prog --help' for more information.\n"; ++my $inval = "$prog: invalid byte, character or field list\n$try"; ++ + # three empty files and one that says 'foo' + my @inputs = (+(map{{IN=> {"empty$_"=> ''}}}1..3), {IN=> {foo=> "foo\n"}}); + +@@ -77,6 +86,39 @@ my @Tests = + {OUT=>$big_input}], + ); + ++# Add _POSIX2_VERSION=199209 to the environment of each test ++# that uses an old-style option like +1. ++if ($mb_locale ne 'C') ++ { ++ # Duplicate each test vector, appending "-mb" to the test name and ++ # inserting {ENV => "LC_ALL=$mb_locale"} in the copy, so that we ++ # provide coverage for the distro-added multi-byte code paths. ++ my @new; ++ foreach my $t (@Tests) ++ { ++ my @new_t = @$t; ++ my $test_name = shift @new_t; ++ ++ # Depending on whether sort is multi-byte-patched, ++ # it emits different diagnostics: ++ # non-MB: invalid byte or field list ++ # MB: invalid byte, character or field list ++ # Adjust the expected error output accordingly. ++ if (grep {ref $_ eq 'HASH' && exists $_->{ERR} && $_->{ERR} eq $inval} ++ (@new_t)) ++ { ++ my $sub = {ERR_SUBST => 's/, character//'}; ++ push @new_t, $sub; ++ push @$t, $sub; ++ } ++ next if ($test_name =~ "nmerge-."); ++ push @new, ["$test_name-mb", @new_t, {ENV => "LC_ALL=$mb_locale"}]; ++ } ++ push @Tests, @new; ++ } ++ ++@Tests = triple_test \@Tests; ++ + my $save_temps = $ENV{DEBUG}; + my $verbose = $ENV{VERBOSE}; + +diff --git a/tests/misc/sort.pl b/tests/misc/sort.pl +index 0b0adca..fd27821 100755 +--- a/tests/misc/sort.pl ++++ b/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; + +-my $mb_locale = $ENV{LOCALE_FR_UTF8}; ++my $mb_locale; ++#Comment out next line to disable multibyte tests ++$mb_locale = $ENV{LOCALE_FR_UTF8}; + ! defined $mb_locale || $mb_locale eq 'none' + and $mb_locale = 'C'; + ++my $try = "Try \`$prog --help' for more information.\n"; ++my $inval = "$prog: invalid byte, character or field list\n$try"; ++ + # 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 '-'. +@@ -423,6 +428,38 @@ foreach my $t (@Tests) + } + } + ++if ($mb_locale ne 'C') ++ { ++ # Duplicate each test vector, appending "-mb" to the test name and ++ # inserting {ENV => "LC_ALL=$mb_locale"} in the copy, so that we ++ # provide coverage for the distro-added multi-byte code paths. ++ my @new; ++ foreach my $t (@Tests) ++ { ++ my @new_t = @$t; ++ my $test_name = shift @new_t; ++ ++ # Depending on whether sort is multi-byte-patched, ++ # it emits different diagnostics: ++ # non-MB: invalid byte or field list ++ # MB: invalid byte, character or field list ++ # Adjust the expected error output accordingly. ++ if (grep {ref $_ eq 'HASH' && exists $_->{ERR} && $_->{ERR} eq $inval} ++ (@new_t)) ++ { ++ my $sub = {ERR_SUBST => 's/, character//'}; ++ push @new_t, $sub; ++ push @$t, $sub; ++ } ++ #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; ++ } ++ + @Tests = triple_test \@Tests; + + # Remember that triple_test creates from each test with exactly one "IN" +@@ -432,6 +469,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; ++@Tests = grep {$_->[0] ne 'output-is-input-mb.p'} @Tests; + + my $save_temps = $ENV{DEBUG}; + my $verbose = $ENV{VERBOSE}; +diff --git a/tests/misc/unexpand.pl b/tests/misc/unexpand.pl +index 2e1906f..fe66012 100755 +--- a/tests/misc/unexpand.pl ++++ b/tests/misc/unexpand.pl +@@ -27,6 +27,14 @@ my $limits = getlimits (); + + my $prog = 'unexpand'; + ++# comment out next line to disable multibyte tests ++my $mb_locale = $ENV{LOCALE_FR_UTF8}; ++! defined $mb_locale || $mb_locale eq 'none' ++ and $mb_locale = 'C'; ++ ++my $try = "Try \`$prog --help' for more information.\n"; ++my $inval = "$prog: invalid byte, character or field list\n$try"; ++ + my @Tests = + ( + ['a1', {IN=> ' 'x 1 ."y\n"}, {OUT=> ' 'x 1 ."y\n"}], +@@ -128,6 +136,37 @@ my @Tests = + ['ts2', '-t5,8', {IN=>"x\t \t y\n"}, {OUT=>"x\t\t y\n"}], + ); + ++if ($mb_locale ne 'C') ++ { ++ # Duplicate each test vector, appending "-mb" to the test name and ++ # inserting {ENV => "LC_ALL=$mb_locale"} in the copy, so that we ++ # provide coverage for the distro-added multi-byte code paths. ++ my @new; ++ foreach my $t (@Tests) ++ { ++ my @new_t = @$t; ++ my $test_name = shift @new_t; ++ ++ # Depending on whether unexpand is multi-byte-patched, ++ # it emits different diagnostics: ++ # non-MB: invalid byte or field list ++ # MB: invalid byte, character or field list ++ # Adjust the expected error output accordingly. ++ if (grep {ref $_ eq 'HASH' && exists $_->{ERR} && $_->{ERR} eq $inval} ++ (@new_t)) ++ { ++ my $sub = {ERR_SUBST => 's/, character//'}; ++ push @new_t, $sub; ++ push @$t, $sub; ++ } ++ next if ($test_name =~ 'b-1'); ++ push @new, ["$test_name-mb", @new_t, {ENV => "LC_ALL=$mb_locale"}]; ++ } ++ push @Tests, @new; ++ } ++ ++@Tests = triple_test \@Tests; ++ + my $save_temps = $ENV{DEBUG}; + my $verbose = $ENV{VERBOSE}; + +diff --git a/tests/misc/uniq.pl b/tests/misc/uniq.pl +index aa163cd..91d617d 100755 +--- a/tests/misc/uniq.pl ++++ b/tests/misc/uniq.pl +@@ -23,9 +23,17 @@ my $limits = getlimits (); + my $prog = 'uniq'; + my $try = "Try '$prog --help' for more information.\n"; + ++my $inval = "$prog: invalid byte, character or field list\n$try"; ++ + # Turn off localization of executable's output. + @ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3; + ++my $mb_locale; ++#Comment out next line to disable multibyte tests ++$mb_locale = $ENV{LOCALE_FR_UTF8}; ++! defined $mb_locale || $mb_locale eq 'none' ++ and $mb_locale = 'C'; ++ + # When possible, create a "-z"-testing variant of each test. + sub add_z_variants($) + { +@@ -262,6 +270,53 @@ 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 ++ # inserting {ENV => "LC_ALL=$mb_locale"} in the copy, so that we ++ # provide coverage for the distro-added multi-byte code paths. ++ my @new; ++ foreach my $t (@Tests) ++ { ++ my @new_t = @$t; ++ my $test_name = shift @new_t; ++ ++ # Depending on whether uniq is multi-byte-patched, ++ # it emits different diagnostics: ++ # non-MB: invalid byte or field list ++ # MB: invalid byte, character or field list ++ # Adjust the expected error output accordingly. ++ if (grep {ref $_ eq 'HASH' && exists $_->{ERR} && $_->{ERR} eq $inval} ++ (@new_t)) ++ { ++ my $sub = {ERR_SUBST => 's/, character//'}; ++ push @new_t, $sub; ++ push @$t, $sub; ++ } ++ # In test #145, replace the each ‘...’ by '...'. ++ if ($test_name =~ "145") ++ { ++ my $sub = { ERR_SUBST => "s/‘([^’]+)’/'\$1'/g"}; ++ push @new_t, $sub; ++ push @$t, $sub; ++ } ++ next if ( $test_name =~ "schar" ++ or $test_name =~ "^obs-plus" ++ or $test_name =~ "119"); ++ 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 ++# due to a race condition about 1 in 20 times. ++# 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; ++ + @Tests = add_z_variants \@Tests; + @Tests = triple_test \@Tests; + +diff --git a/tests/pr/pr-tests.pl b/tests/pr/pr-tests.pl +index 7ac6d4c..ae6cc35 100755 +--- a/tests/pr/pr-tests.pl ++++ b/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}; ++! defined $mb_locale || $mb_locale eq 'none' ++ and $mb_locale = 'C'; ++ ++my $try = "Try \`$prog --help' for more information.\n"; ++my $inval = "$prog: invalid byte, character or field list\n$try"; ++ + my @tv = ( + + # -b option is no longer an official option. But it's still working to +@@ -512,8 +521,48 @@ push @Tests, + {IN=>"x\tx\tx\tx\tx\nx\tx\tx\tx\tx\n"}, + {OUT=>"x\tx\tx\tx\tx\tx\tx\tx\tx\tx\n"} ]; + ++# Add _POSIX2_VERSION=199209 to the environment of each test ++# that uses an old-style option like +1. ++if ($mb_locale ne 'C') ++ { ++ # Duplicate each test vector, appending "-mb" to the test name and ++ # inserting {ENV => "LC_ALL=$mb_locale"} in the copy, so that we ++ # provide coverage for the distro-added multi-byte code paths. ++ my @new; ++ foreach my $t (@Tests) ++ { ++ my @new_t = @$t; ++ my $test_name = shift @new_t; ++ ++ # Depending on whether pr is multi-byte-patched, ++ # it emits different diagnostics: ++ # non-MB: invalid byte or field list ++ # MB: invalid byte, character or field list ++ # Adjust the expected error output accordingly. ++ if (grep {ref $_ eq 'HASH' && exists $_->{ERR} && $_->{ERR} eq $inval} ++ (@new_t)) ++ { ++ my $sub = {ERR_SUBST => 's/, character//'}; ++ push @new_t, $sub; ++ push @$t, $sub; ++ } ++ #temporarily skip some failing tests ++ next if ($test_name =~ "col-0" or $test_name =~ "col-inval" or $test_name =~ "asan1"); ++ push @new, ["$test_name-mb", @new_t, {ENV => "LC_ALL=$mb_locale"}]; ++ } ++ push @Tests, @new; ++ } ++ + @Tests = triple_test \@Tests; + ++# 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 ++# due to a race condition about 1 in 20 times. ++# 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; ++ + my $save_temps = $ENV{DEBUG}; + my $verbose = $ENV{VERBOSE}; + +diff --git a/tests/unexpand/mb.sh b/tests/unexpand/mb.sh +new file mode 100755 +index 0000000..8a82d74 +--- /dev/null ++++ b/tests/unexpand/mb.sh +@@ -0,0 +1,172 @@ ++#!/bin/sh ++ ++# Copyright (C) 2012-2015 Free Software Foundation, Inc. ++ ++# This program is free software: you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation, either version 3 of the License, or ++# (at your option) any later version. ++ ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++ ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++. "${srcdir=.}/tests/init.sh"; path_prepend_ ./src ++print_ver_ unexpand ++ ++export LC_ALL=en_US.UTF-8 ++ ++#input containing multibyte characters ++cat > in <<\EOF ++1234567812345678123456781 ++. . . . ++a b c d ++. . . . ++ä ö ü ß ++. . . . ++ äöü . öüä. ä xx ++EOF ++ ++cat > exp <<\EOF ++1234567812345678123456781 ++. . . . ++a b c d ++. . . . ++ä ö ü ß ++. . . . ++ äöü . öüä. ä xx ++EOF ++ ++unexpand -a < in > out || fail=1 ++compare exp out > /dev/null 2>&1 || fail=1 ++ ++ ++#multiple files as an input ++cat >> exp <<\EOF ++1234567812345678123456781 ++. . . . ++a b c d ++. . . . ++ä ö ü ß ++. . . . ++ äöü . öüä. ä xx ++EOF ++ ++ ++unexpand -a ./in ./in > out || fail=1 ++compare exp out > /dev/null 2>&1 || fail=1 ++ ++#test characters with a display width larger than 1 ++ ++env printf '12345678 ++e |ascii(1) ++\u00E9 |composed(1) ++e\u0301 |decomposed(1) ++\u3000 |ideo-space(2) ++\uFF0D |full-hypen(2) ++' > in || framework_failure_ ++ ++env printf '12345678 ++e\t|ascii(1) ++\u00E9\t|composed(1) ++e\u0301\t|decomposed(1) ++\u3000\t|ideo-space(2) ++\uFF0D\t|full-hypen(2) ++' > exp || framework_failure_ ++ ++unexpand -a < in > out || fail=1 ++compare exp out > /dev/null 2>&1 || fail=1 ++ ++#test input where a blank of width > 1 is not being substituted ++in="$(LC_ALL=en_US.UTF-8 printf ' \u3000 ö ü ß')" ++exp='   ö ü ß' ++ ++unexpand -a < in > out || fail=1 ++compare exp out > /dev/null 2>&1 || fail=1 ++ ++#non-Unicode characters interspersed between Unicode ones ++env printf '12345678 ++ \xFF| ++\xFF | ++ \xFFä| ++ä\xFF | ++ ä\xFF| ++\xFF ä| ++äbcdef\xFF | ++' > in || framework_failure_ ++ ++env printf '12345678 ++\t\xFF| ++\xFF\t| ++\t\xFFä| ++ä\xFF\t| ++\tä\xFF| ++\xFF\tä| ++äbcdef\xFF\t| ++' > exp || framework_failure_ ++ ++unexpand -a < in > out || fail=1 ++compare exp out > /dev/null 2>&1 || fail=1 ++ ++#BOM header test 1 ++printf "\xEF\xBB\xBF" > in; cat <<\EOF >> in || framework_failure_ ++1234567812345678123456781 ++. . . . ++a b c d ++. . . . ++ä ö ü ß ++. . . . ++ äöü . öüä. ä xx ++EOF ++env printf ' äöü\t. öüä. \tä xx\n' >> in || framework_failure_ ++ ++printf "\xEF\xBB\xBF" > exp; cat <<\EOF >> exp || framework_failure_ ++1234567812345678123456781 ++. . . . ++a b c d ++. . . . ++ä ö ü ß ++. . . . ++ äöü . öüä. ä xx ++EOF ++ ++unexpand < in > out || fail=1 ++compare exp out > /dev/null 2>&1 || fail=1 ++ ++LANG=C unexpand < in > out || fail=1 ++compare exp out > /dev/null 2>&1 || fail=1 ++ ++LC_ALL=C unexpand < in > out || fail=1 ++compare exp out > /dev/null 2>&1 || fail=1 ++ ++ ++printf "\xEF\xBB\xBF" > exp; cat <<\EOF >> exp || framework_failure_ ++1234567812345678123456781 ++. . . . ++a b c d ++. . . . ++ä ö ü ß ++. . . . ++ äöü . öüä. ä xx ++1234567812345678123456781 ++. . . . ++a b c d ++. . . . ++ä ö ü ß ++. . . . ++ äöü . öüä. ä xx ++EOF ++ ++ ++unexpand in in > out || fail=1 ++compare exp out > /dev/null 2>&1 || fail=1 ++ ++LANG=C unexpand in in > out || fail=1 ++compare exp out > /dev/null 2>&1 || fail=1 ++ ++LC_ALL=C unexpand in in > out || fail=1 ++compare exp out > /dev/null 2>&1 || fail=1 +-- +2.34.1 + diff --git a/system/base/coreutils/files/remove_am_silent_rules.patch b/system/base/coreutils/files/remove_am_silent_rules.patch index dff4c5e4..c789565a 100644 --- a/system/base/coreutils/files/remove_am_silent_rules.patch +++ b/system/base/coreutils/files/remove_am_silent_rules.patch @@ -1,11 +1,11 @@ --- configure.ac.OSmanOS 2013-01-31 02:46:24.000000000 +0200 +++ configure.ac 2013-02-16 22:32:00.764755892 +0200 -@@ -34,7 +34,7 @@ - - AM_INIT_AUTOMAKE([1.11.2 no-dist-gzip dist-xz color-tests parallel-tests - subdir-objects]) +@@ -36,7 +36,7 @@ + AC_CONFIG_HEADERS([lib/config.h:lib/config.hin]) + + AM_INIT_AUTOMAKE([1.11.2 dist-xz color-tests parallel-tests subdir-objects]) -AM_SILENT_RULES([yes]) # make --enable-silent-rules the default. +#~ AM_SILENT_RULES([yes]) # make --enable-silent-rules the default. - + dnl POSIXCHECK is worthwhile for maintainers, but adds several seconds dnl (more than 10% execution time) to ./configure, with no benefit for diff --git a/system/base/coreutils/pspec.xml b/system/base/coreutils/pspec.xml index 6849722d..c444dbd4 100644 --- a/system/base/coreutils/pspec.xml +++ b/system/base/coreutils/pspec.xml @@ -12,7 +12,7 @@ app:console

A set of basic GNU tools commonly used in shell scripts Standard GNU file utilities (chmod, cp, dd, dir, ls...), text utilities (sort, tr, head, wc..), and shell utilities (whoami, who,...) - http://ftp.gnu.org/gnu/coreutils/coreutils-8.31.tar.xz + http://ftp.gnu.org/gnu/coreutils/coreutils-9.1.tar.xz acl-devel attr-devel @@ -25,14 +25,14 @@ texinfo - coreutils-8.31-i18n-1.patch + coreutils-8.32-i18n-1.patch remove_am_silent_rules.patch coreutils-8.26-test-lock.patch - coreutils-8.31-improve-test-cp-proc-short-read.patch - coreutils-8.31-root-tests.patch + + @@ -58,6 +58,13 @@ + + 2022-08-03 + 9.1 + Version bump. + Mustafa Cinasal + muscnsl@gmail.com + 2021-01-20 8.31