From mboxrd@z Thu Jan 1 00:00:00 1970 From: Marcel Lorenz To: development@lists.ipfire.org Subject: Re: [PATCH] coreutils: update to 8.25 Date: Sat, 09 Apr 2016 10:45:15 +0200 Message-ID: <5526a758d98925cb8e242c70b6311d07@mail01.ipfire.org> In-Reply-To: <1460130976.30749.403.camel@ipfire.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1533347033086643886==" List-Id: --===============1533347033086643886== Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Hi Michael, the toolchain builds in i586 are successful and i make a new patch with=20 with rootfiles and uptime. POSIX requires that programs from Coreutils recognize character=20 boundaries correctly even in multibyte locales The i18n patch fixes this non-compliance and other=20 internationalization-related bugs. If this not needed for IPFire i can remove the patch. I myself can not=20 tell... I orient myself on the Linux from scratch website. Please support me. The testsuite had a Problem with perl 5.22.0, now this is not more=20 needed.. removed in the v2 patch. Thx for reviewing... Best, Marcel Am 2016-04-08 17:56, schrieb Michael Tremer: > Hi, >=20 > we have to focus more on quality over quantity here: >=20 > 1) The rootfile has changed but is not included in this patch. >=20 > 2) Why is uptime not built any more (this alone will trigger a rootfile=20 > change)? >=20 > 3) Include comments about why you think adding the i18n patch is=20 > required >=20 > 4) Why are the sorting tests being disabled but no testsuite is=20 > executed at all? >=20 > 5) This package is part of the toolchain. Can you confirm that the=20 > toolchain > still builds (on at least both x86 architectures)? >=20 > Best, > -Michael >=20 > On Thu, 2016-04-07 at 12:37 +0200, Marcel Lorenz wrote: >> Signed-off-by: Marcel Lorenz >>=20 >> --- >> =C2=A0lfs/coreutils=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0|=C2=A0=C2=A0=C2=A011 +- >> =C2=A0src/patches/coreutils-8.25-i18n-2.patch | 4790 >> +++++++++++++++++++++++++++++++ >> =C2=A02 files changed, 4796 insertions(+), 5 deletions(-) >> =C2=A0create mode 100644 src/patches/coreutils-8.25-i18n-2.patch >>=20 >> diff --git a/lfs/coreutils b/lfs/coreutils >> index ede0493..a79a508 100644 >> --- a/lfs/coreutils >> +++ b/lfs/coreutils >> @@ -24,7 +24,7 @@ >> =C2=A0 >> =C2=A0include Config >> =C2=A0 >> -VER=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=3D 8.24 >> +VER=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=3D 8.25 >> =C2=A0 >> =C2=A0THISAPP=C2=A0=C2=A0=C2=A0=C2=A0=3D coreutils-$(VER) >> =C2=A0DL_FILE=C2=A0=C2=A0=C2=A0=C2=A0=3D $(THISAPP).tar.xz >> @@ -42,11 +42,10 @@ else >> =C2=A0endif >> =C2=A0 >> =C2=A0CONFIGURE_OPTIONS +=3D \ >> - --disable-selinux \ >> =C2=A0 --enable-largefile \ >> =C2=A0 --disable-rpath \ >> =C2=A0 --enable-install-program=3Darch \ >> - --enable-no-install-program=3Dhostname,kill \ >> + --enable-no-install-program=3Dhostname,kill,uptime \ >> =C2=A0 --with-tty-group \ >> =C2=A0 gl_cv_func_mknod_works=3Dyes >> =C2=A0 >> @@ -60,7 +59,7 @@ objects =3D$(DL_FILE) >> =C2=A0 >> =C2=A0$(DL_FILE)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =3D $(DL_FROM)/$(DL_FILE) >> =C2=A0 >> -$(DL_FILE)_MD5=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=3D 40efdbce865d2458d8da0a= 9dcee7c16c >> +$(DL_FILE)_MD5=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=3D 070e43ba7f618d747414ef= 56ab248a48 >> =C2=A0 >> =C2=A0install : $(TARGET) >> =C2=A0 >> @@ -90,7 +89,9 @@ $(subst %,%_MD5,$(objects)) : >> =C2=A0$(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects)) >> =C2=A0 @$(PREBUILD) >> =C2=A0 @rm -rf $(DIR_APP) && cd $(DIR_SRC) && tar axf $(DIR_DL)/$(DL_FILE) >> - cd $(DIR_APP) && ./configure $(CONFIGURE_OPTIONS) >> + cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/coreutils-8.25- >> i18n-2.patch >> + cd $(DIR_APP) && sed -i '/tests\/misc\/sort.pl/ d' Makefile.in >> + cd $(DIR_APP) && FORCE_UNSAFE_CONFIGURE=3D1 && ./configure >> $(CONFIGURE_OPTIONS) >> =C2=A0 cd $(DIR_APP) && make $(MAKETUNING) >> =C2=A0 cd $(DIR_APP) && make install >> =C2=A0 >> diff --git a/src/patches/coreutils-8.25-i18n-2.patch=20 >> b/src/patches/coreutils- >> 8.25-i18n-2.patch >> new file mode 100644 >> index 0000000..ad984ec >> --- /dev/null >> +++ b/src/patches/coreutils-8.25-i18n-2.patch >> @@ -0,0 +1,4790 @@ >> +Submitted by:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0DJ Lucas (dj_AT_linuxfromscratch_DOT_org) >> +Date:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A02016-02-09 >> +Initial Package Version: 8.25 >> +Upstream Status:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0Rej= ected >> +Origin:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0Based on Suse's i18n patches at=20 >> https://build.opensu >> se.org/package/view_file/Base:System/coreutils/coreutils-i18n.patch >> +Description:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0Fixes several i18n issues with various=20 >> Coreutils >> programs >> + >> +diff -Naurp coreutils-8.25-orig/lib/linebuffer.h coreutils- >> 8.25/lib/linebuffer.h >> +--- coreutils-8.25-orig/lib/linebuffer.h 2016-01-01=20 >> 07:45:55.000000000 >> -0600 >> ++++ coreutils-8.25/lib/linebuffer.h 2016-02-08 19:07:10.298944609 >> -0600 >> +@@ -21,6 +21,11 @@ >> +=C2=A0 >> + # include >> +=C2=A0 >> ++/* Get mbstate_t.=C2=A0=C2=A0*/ >> ++# if HAVE_WCHAR_H >> ++#=C2=A0=C2=A0include >> ++# endif >> ++ >> + /* A 'struct linebuffer' holds a line of text. */ >> +=C2=A0 >> + struct linebuffer >> +@@ -28,6 +33,9 @@ struct linebuffer >> +=C2=A0=C2=A0=C2=A0size_t size;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Allocate= d. */ >> +=C2=A0=C2=A0=C2=A0size_t length;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Used. */ >> +=C2=A0=C2=A0=C2=A0char *buffer; >> ++# if HAVE_WCHAR_H >> ++=C2=A0=C2=A0mbstate_t state; >> ++# endif >> + }; >> +=C2=A0 >> + /* Initialize linebuffer LINEBUFFER for use. */ >> +diff -Naurp coreutils-8.25-orig/src/cut.c coreutils-8.25/src/cut.c >> +--- coreutils-8.25-orig/src/cut.c 2016-01-13 05:08:59.000000000 -0600 >> ++++ coreutils-8.25/src/cut.c 2016-02-08 19:07:10.300944616 -0600 >> +@@ -28,6 +28,11 @@ >> + #include >> + #include >> + #include >> ++ >> ++/* Get mbstate_t, mbrtowc().=C2=A0=C2=A0*/ >> ++#if HAVE_WCHAR_H >> ++# include >> ++#endif >> + #include "system.h" >> +=C2=A0 >> + #include "error.h" >> +@@ -38,6 +43,18 @@ >> +=C2=A0 >> + #include "set-fields.h" >> +=C2=A0 >> ++/* MB_LEN_MAX is incorrectly defined to be 1 in at least one GCC >> ++=C2=A0=C2=A0=C2=A0installation; work around this configuration error.=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*/ >> ++#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=20 >> mbstate_t.=C2=A0=C2=A0*/ >> ++#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).=C2=A0=C2=A0*/ >> + #define PROGRAM_NAME "cut" >> +=C2=A0 >> +@@ -54,6 +71,52 @@ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> \ >> +=C2=A0=C2=A0=C2=A0while (0) >> +=C2=A0 >> ++/* Refill the buffer BUF to get a multibyte character. */ >> ++#define REFILL_BUFFER(BUF, BUFPOS, BUFLEN,=20 >> STREAM)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0\ >> ++=C2=A0=C2=A0do=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 >> \ >> ++=C2=A0=C2=A0=C2=A0=C2=A0{=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 >> =C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (BUFLEN < MB_LEN_MAX && !feof (ST= REAM) && !ferror >> (STREAM))=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0memmove (BUF= , BUFPOS,=20 >> BUFLEN);=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0BUFLEN +=3D = fread (BUF + BUFLEN, sizeof(char), BUFSIZ,=20 >> STREAM); \ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0BUFPOS =3D >> BUF;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0}=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0}=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 >> =C2=A0\ >> ++=C2=A0=C2=A0while (0) >> ++ >> ++/* Get wide character on BUFPOS. BUFPOS is not included after that. >> ++=C2=A0=C2=A0=C2=A0If byte sequence is not valid as a character, CONVFAIL= is true.=20 >> Otherwise >> false. */ >> ++#define GET_NEXT_WC_FROM_BUFFER(WC, BUFPOS, BUFLEN, MBLENGTH, STATE, >> CONVFAIL) \ >> ++=C2=A0=C2=A0do=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 >> \ >> ++=C2=A0=C2=A0=C2=A0=C2=A0{=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 >> =C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mbstate_t=20 >> state_bak;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (BUFLEN < >> 1)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0WC =3D >> WEOF;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break;=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0}=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Get a wide character.=20 >> */=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0CONVFAIL =3D >> false;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0state_bak =3D=20 >> STATE;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0MBLENGTH =3D mbrtowc ((wchar_t *)&WC= , BUFPOS, BUFLEN,=20 >> &STATE);=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0switch >> (MBLENGTH)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case=20 >> (size_t)-1:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case=20 >> (size_t)-2:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0CONVFAIL =3D >> true;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0STATE =3D >> state_bak;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Fall thro= ugn. >> */=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case >> 0:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0MBLENGTH =3D >> 1;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break;=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0}=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0}=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 >> =C2=A0\ >> ++=C2=A0=C2=A0while (0) >> ++ >> +=C2=A0 >> + /* Pointer inside RP.=C2=A0=C2=A0When checking if a byte or field is sel= ected >> +=C2=A0=C2=A0=C2=A0=C2=A0by a finite range, we check if it is between CURR= ENT_RP.LO >> +@@ -61,6 +124,9 @@ >> +=C2=A0=C2=A0=C2=A0=C2=A0CURRENT_RP.HI then we make CURRENT_RP to point to= the next range=20 >> pair. */ >> + static struct field_range_pair *current_rp; >> +=C2=A0 >> ++/* Length of the delimiter given as argument to -d.=C2=A0=C2=A0*/ >> ++size_t delimlen; >> ++ >> + /* This buffer is used to support the semantics of the -s option >> +=C2=A0=C2=A0=C2=A0=C2=A0(or lack of same) when the specified field list i= ncludes (does >> +=C2=A0=C2=A0=C2=A0=C2=A0not include) the first field.=C2=A0=C2=A0In both = of those cases, the entire >> +@@ -77,15 +143,25 @@ enum operating_mode >> +=C2=A0=C2=A0=C2=A0{ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0undefined_mode, >> +=C2=A0 >> +-=C2=A0=C2=A0=C2=A0=C2=A0/* Output characters that are in the given bytes= . */ >> ++=C2=A0=C2=A0=C2=A0=C2=A0/* Output bytes that are at the given positions.= */ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0byte_mode, >> +=C2=A0 >> ++=C2=A0=C2=A0=C2=A0=C2=A0/* Output characters that are at the given posit= ions. */ >> ++=C2=A0=C2=A0=C2=A0=C2=A0character_mode, >> ++ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Output the given delimiter-separated fie= lds. */ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0field_mode >> +=C2=A0=C2=A0=C2=A0}; >> +=C2=A0 >> + static enum operating_mode operating_mode; >> +=C2=A0 >> ++/* If nonzero, when in byte mode, don't split multibyte=20 >> characters.=C2=A0=C2=A0*/ >> ++static int byte_mode_character_aware; >> ++ >> ++/* If nonzero, the function for single byte locale is work >> ++=C2=A0=C2=A0=C2=A0if this program runs on multibyte locale. */ >> ++static int force_singlebyte_mode; >> ++ >> + /* If true do not output lines containing no delimiter characters. >> +=C2=A0=C2=A0=C2=A0=C2=A0Otherwise, all such lines are printed.=C2=A0=C2= =A0This option is valid only >> +=C2=A0=C2=A0=C2=A0=C2=A0with field mode.=C2=A0=C2=A0*/ >> +@@ -97,6 +173,9 @@ static bool complement; >> +=C2=A0 >> + /* The delimiter character for field mode. */ >> + static unsigned char delim; >> ++#if HAVE_WCHAR_H >> ++static wchar_t wcdelim; >> ++#endif >> +=C2=A0 >> + /* The delimiter for each line/record. */ >> + static unsigned char line_delim =3D '\n'; >> +@@ -164,7 +243,7 @@ Print selected parts of lines from each >> +=C2=A0=C2=A0=C2=A0-f, --fields=3DLIST=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0select only these fields;=C2=A0=C2=A0also print any=20 >> line\n\ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0that contains no delimiter character,=20 >> unless\n\ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0the -s option is specified\n\ >> +-=C2=A0=C2=A0-n=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0(i= gnored)\n\ >> ++=C2=A0=C2=A0-n=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0wi= th -b: don't split multibyte=20 >> characters\n\ >> + "), stdout); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0fputs (_("\ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0--complement=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0complement the set of selected bytes, >> characters\n\ >> +@@ -280,6 +359,82 @@ cut_bytes (FILE *stream) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> + } >> +=C2=A0 >> ++#if HAVE_MBRTOWC >> ++/* This function is in use for the following case. >> ++ >> ++=C2=A0=C2=A0=C2=A01. Read from the stream STREAM, printing to standard o= utput any=20 >> selected >> ++=C2=A0=C2=A0=C2=A0characters. >> ++ >> ++=C2=A0=C2=A0=C2=A02. Read from stream STREAM, printing to standard outpu= t any=20 >> selected >> bytes, >> ++=C2=A0=C2=A0=C2=A0without splitting multibyte characters.=C2=A0=C2=A0*/ >> ++ >> ++static void >> ++cut_characters_or_cut_bytes_no_split (FILE *stream) >> ++{ >> ++=C2=A0=C2=A0size_t idx;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* number of bytes or charact= ers in the=20 >> line so >> far. */ >> ++=C2=A0=C2=A0char buf[MB_LEN_MAX + BUFSIZ];=C2=A0=C2=A0/* For spooling a = read byte=20 >> sequence. */ >> ++=C2=A0=C2=A0char *bufpos;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Next read position of B= UF. */ >> ++=C2=A0=C2=A0size_t buflen;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0/* The length of the byte sequence in buf.=20 >> */ >> ++=C2=A0=C2=A0wint_t wc;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* A gotten wide character. */ >> ++=C2=A0=C2=A0size_t mblength;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0/* The byte size of a multibyte character=20 >> which >> shows >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0as same character as WC. */ >> ++=C2=A0=C2=A0mbstate_t state;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0/* State of the stream. */ >> ++=C2=A0=C2=A0bool convfail =3D false;=C2=A0=C2=A0/* true, when conversion= failed. Otherwise=20 >> false. >> */ >> ++=C2=A0=C2=A0/* Whether to begin printing delimiters between ranges for t= he=20 >> current >> line. >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0Set after we've begun printing data corres= ponding to the first >> range.=C2=A0=C2=A0*/ >> ++=C2=A0=C2=A0bool print_delimiter =3D false; >> ++ >> ++=C2=A0=C2=A0idx =3D 0; >> ++=C2=A0=C2=A0buflen =3D 0; >> ++=C2=A0=C2=A0bufpos =3D buf; >> ++=C2=A0=C2=A0memset (&state, '\0', sizeof(mbstate_t)); >> ++ >> ++=C2=A0=C2=A0current_rp =3D frp; >> ++ >> ++=C2=A0=C2=A0while (1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0REFILL_BUFFER (buf, bufpos, buflen, = stream); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0GET_NEXT_WC_FROM_BUFFER (wc, bufpos,= buflen, mblength, state, >> convfail); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0(void) convfail;=C2=A0=C2=A0/* ignor= e unused */ >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (wc =3D=3D WEOF) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (idx > 0) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= putchar (line_delim); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else if (wc =3D=3D line_delim) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0putchar (lin= e_delim); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0idx =3D 0; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0print_delimi= ter =3D false; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0current_rp = =3D frp; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0next_item (&= idx); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (print_kt= h (idx)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0if (output_delimiter_specified) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (print_delimiter && is_range_start_ind= ex (idx)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0fwrite (output_de= limiter_string, sizeof=20 >> (char), >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0output_delimiter_length, stdout); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0print_delimiter =3D true; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0fwrite (bufpos, mblength, sizeof(char), stdout); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0buflen -=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0bufpos +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++} >> ++#endif >> ++ >> + /* Read from stream STREAM, printing to standard output any selected >> fields.=C2=A0=C2=A0*/ >> +=C2=A0 >> + static void >> +@@ -425,13 +580,211 @@ cut_fields (FILE *stream) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> + } >> +=C2=A0 >> ++#if HAVE_MBRTOWC >> ++static void >> ++cut_fields_mb (FILE *stream) >> ++{ >> ++=C2=A0=C2=A0int c; >> ++=C2=A0=C2=A0size_t field_idx; >> ++=C2=A0=C2=A0int found_any_selected_field; >> ++=C2=A0=C2=A0int buffer_first_field; >> ++=C2=A0=C2=A0int empty_input; >> ++=C2=A0=C2=A0char buf[MB_LEN_MAX + BUFSIZ];=C2=A0=C2=A0/* For spooling a = read byte=20 >> sequence. */ >> ++=C2=A0=C2=A0char *bufpos;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Next read position of B= UF. */ >> ++=C2=A0=C2=A0size_t buflen;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0/* The length of the byte sequence in buf.=20 >> */ >> ++=C2=A0=C2=A0wint_t wc =3D 0;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0/* A gotten wide character. */ >> ++=C2=A0=C2=A0size_t mblength;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0/* The byte size of a multibyte character=20 >> which >> shows >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0as same character as WC. */ >> ++=C2=A0=C2=A0mbstate_t state;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0/* State of the stream. */ >> ++=C2=A0=C2=A0bool convfail =3D false;=C2=A0=C2=A0/* true, when conversion= failed. Otherwise=20 >> false. >> */ >> ++ >> ++=C2=A0=C2=A0current_rp =3D frp; >> ++ >> ++=C2=A0=C2=A0found_any_selected_field =3D 0; >> ++=C2=A0=C2=A0field_idx =3D 1; >> ++=C2=A0=C2=A0bufpos =3D buf; >> ++=C2=A0=C2=A0buflen =3D 0; >> ++=C2=A0=C2=A0memset (&state, '\0', sizeof(mbstate_t)); >> ++ >> ++=C2=A0=C2=A0c =3D getc (stream); >> ++=C2=A0=C2=A0empty_input =3D (c =3D=3D EOF); >> ++=C2=A0=C2=A0if (c !=3D EOF) >> ++=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0ungetc (c, stream); >> ++=C2=A0=C2=A0=C2=A0=C2=A0wc =3D 0; >> ++=C2=A0=C2=A0} >> ++=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0wc =3D WEOF; >> ++ >> ++=C2=A0=C2=A0/* To support the semantics of the -s flag, we may have to b= uffer >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0all of the first field to determine whethe= r it is `delimited.' >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0But that is unnecessary if all non-delimit= ed lines must be=20 >> printed >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0and the first field has been selected, or = if non-delimited=20 >> lines >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0must be suppressed and the first field has= *not* been selected. >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0That is because a non-delimited line has e= xactly one field.=C2=A0=C2=A0*/ >> ++=C2=A0=C2=A0buffer_first_field =3D (suppress_non_delimited ^ !print_kth = (1)); >> ++ >> ++=C2=A0=C2=A0while (1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (field_idx =3D=3D 1 && buffer_fir= st_field) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0int len =3D = 0; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0REFILL_BUFFER (buf, bufpos, buflen, stream); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0GET_NEXT_WC_FROM_BUFFER >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0(wc, bufpos, buflen, mblength, state, convfail); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0if (wc =3D=3D WEOF) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0break; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0field_1_buffer =3D xrealloc (field_1_buffer, len +=20 >> mblength); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0memcpy (field_1_buffer + len, bufpos, mblength); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0len +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0buflen -=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0bufpos +=3D mblength; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0if (!convfail && (wc =3D=3D line_delim || wc =3D=3D wcdelim)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0break; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (len <=3D= 0 && wc =3D=3D WEOF) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= break; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* If the fi= rst field extends to the end of line (it is=20 >> not >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0delimited) and we are printing all non-delimited lines, >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0print this one.=C2=A0=C2=A0*/ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (convfail= || (!convfail && wc !=3D wcdelim)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0if (suppress_non_delimited) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Empty.=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0*/ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0fwrite (field_1_buffer, sizeof (char), le= n,=20 >> stdout); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Make sure the output line is newline=20 >> terminated.=C2=A0=C2=A0*/ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (convfail || (!convfail && wc !=3D lin= e_delim)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0putchar (line_delim); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0continue; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (print_kt= h (1)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0/* Print the field, but not the trailing=20 >> delimiter.=C2=A0=C2=A0*/ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0fwrite (field_1_buffer, sizeof (char), len - 1,=20 >> stdout); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0found_any_selected_field =3D 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0next_item (&= field_idx); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (wc !=3D WEOF) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (print_kt= h (field_idx)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0if (found_any_selected_field) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0fwrite (output_delimiter_string, sizeof (= char), >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0output_delimiter_length, stdout); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0found_any_selected_field =3D 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0REFILL_BUFFER (buf, bufpos, buflen, stream); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0GET_NEXT_WC_FROM_BUFFER >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0(wc, bufpos, buflen, mblength, state, convfail); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0if (wc =3D=3D WEOF) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0break; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0else if (!convfail && (wc =3D=3D wcdelim || wc =3D=3D=20 >> line_delim)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0buflen -=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0bufpos +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0if (print_kth (field_idx)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0fwrite (bufpos, mblength, sizeof(char), stdout); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0buflen -=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0bufpos +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if ((!convfail || wc =3D=3D line_del= im) && buflen < 1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0wc =3D WEOF; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (!convfail && wc =3D=3D wcdelim) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0next_item (&field_idx); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else if (wc =3D=3D WEOF || (!convfai= l && wc =3D=3D line_delim)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (found_an= y_selected_field >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0|| (!empty_input && !(suppress_non_delimited &&=20 >> field_idx =3D=3D >> 1))) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= putchar (line_delim); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (wc =3D= =3D WEOF) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= break; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0field_idx = =3D 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0current_rp = =3D frp; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0found_any_se= lected_field =3D 0; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++} >> ++#endif >> ++ >> + static void >> + cut_stream (FILE *stream) >> + { >> +-=C2=A0=C2=A0if (operating_mode =3D=3D byte_mode) >> +-=C2=A0=C2=A0=C2=A0=C2=A0cut_bytes (stream); >> ++#if HAVE_MBRTOWC >> ++=C2=A0=C2=A0if (MB_CUR_MAX > 1 && !force_singlebyte_mode) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0switch (operating_mode) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case byte_mode: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (byte_mod= e_character_aware) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= cut_characters_or_cut_bytes_no_split (stream); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= cut_bytes (stream); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case character_mode: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0cut_characte= rs_or_cut_bytes_no_split (stream); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case field_mode: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (delimlen= =3D=3D 1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0/* Check if we have utf8 multibyte locale, so we can=20 >> use this >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0optimization because of uniqueness of character= s,=20 >> which is >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0not true for e.g. SJIS */ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0char * loc =3D setlocale(LC_CTYPE, NULL); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0if (loc && (strstr (loc, "UTF-8") || strstr (loc,=20 >> "utf-8") || >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0strstr (loc, "UTF8") || strstr (loc, "utf= 8"))) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0cut_fields (stream); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0cut_fields_m= b (stream); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0default: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0abort (); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0else >> +-=C2=A0=C2=A0=C2=A0=C2=A0cut_fields (stream); >> ++#endif >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (operating_mode =3D=3D field_mode) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0cut_fields (stream); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0cut_bytes (stream); >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> + } >> +=C2=A0 >> + /* Process file FILE to standard output. >> +@@ -483,6 +836,7 @@ main (int argc, char **argv) >> +=C2=A0=C2=A0=C2=A0bool ok; >> +=C2=A0=C2=A0=C2=A0bool delim_specified =3D false; >> +=C2=A0=C2=A0=C2=A0char *spec_list_string IF_LINT ( =3D NULL); >> ++=C2=A0=C2=A0char mbdelim[MB_LEN_MAX + 1]; >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0initialize_main (&argc, &argv); >> +=C2=A0=C2=A0=C2=A0set_program_name (argv[0]); >> +@@ -505,7 +859,6 @@ main (int argc, char **argv) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0switch (optc) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case 'b': >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case 'c': >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Buil= d the byte list. */ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (ope= rating_mode !=3D undefined_mode) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0FATAL_ERROR (_("only one type of list may be=20 >> specified")); >> +@@ -513,6 +866,14 @@ main (int argc, char **argv) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0spec_li= st_string =3D optarg; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> +=C2=A0 >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case 'c': >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Build the= character list. */ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (operatin= g_mode !=3D undefined_mode) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= FATAL_ERROR (_("only one type of list may be=20 >> specified")); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0operating_mo= de =3D character_mode; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0spec_list_st= ring =3D optarg; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> ++ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case 'f': >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Buil= d the field list. */ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (ope= rating_mode !=3D undefined_mode) >> +@@ -524,10 +885,38 @@ main (int argc, char **argv) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case 'd': >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* New = delimiter. */ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Inte= rpret -d '' to mean 'use the NUL byte as the >> delimiter.'=C2=A0=C2=A0*/ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (optarg[0= ] !=3D '\0' && optarg[1] !=3D '\0') >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= FATAL_ERROR (_("the delimiter must be a single=20 >> character")); >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0delim =3D op= targ[0]; >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0delim_specif= ied =3D true; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++#if HAVE_MBRTOWC >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0if(MB_CUR_MAX > 1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mbstate_t state; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0memset (&state, '\0', sizeof(mbstate_t)); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0delimlen =3D mbrtowc (&wcdelim, optarg,=20 >> strnlen(optarg, >> MB_LEN_MAX), &state); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (delimlen =3D=3D (size_t)-1 || delimle= n =3D=3D=20 >> (size_t)-2) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0++force_singlebyte_mode; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0delimlen =3D (del= imlen < 1) ? 1 : delimlen; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (wcdelim !=3D = L'\0' && *(optarg + delimlen)=20 >> !=3D '\0') >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0FATAL= _ERROR (_("the delimiter must be a=20 >> single >> character")); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0memcpy (mbdelim, = optarg, delimlen); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mbdelim[delimlen]= =3D '\0'; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (delimlen =3D= =3D 1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0delim= =3D *optarg; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0if (MB_CUR_MAX <=3D 1 || force_singlebyte_mode) >> ++#endif >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (optarg[0] !=3D '\0' && optarg[1] !=3D= '\0') >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0FATAL_ERROR (_("the delimiter= must be a single >> character")); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0delim =3D (unsigned char) optarg[0]; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= delim_specified =3D true; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case OUTPUT_DELIMIT= ER_OPTION: >> +@@ -540,6 +929,7 @@ main (int argc, char **argv) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case 'n': >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0byte_mode_ch= aracter_aware =3D 1; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case 's': >> +@@ -579,15 +969,34 @@ main (int argc, char **argv) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0| (complement ? SETFLD_COMPLEMENT : 0) ); >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0if (!delim_specified) >> +-=C2=A0=C2=A0=C2=A0=C2=A0delim =3D '\t'; >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0delim =3D '\t'; >> ++#ifdef HAVE_MBRTOWC >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0wcdelim =3D L'\t'; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mbdelim[0] =3D '\t'; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mbdelim[1] =3D '\0'; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0delimlen =3D 1; >> ++#endif >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0if (output_delimiter_string =3D=3D NULL) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0static char dummy[2]; >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0dummy[0] =3D delim; >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0dummy[1] =3D '\0'; >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0output_delimiter_string =3D dummy; >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0output_delimiter_length =3D 1; >> ++#ifdef HAVE_MBRTOWC >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (MB_CUR_MAX > 1 && !force_singleb= yte_mode) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0output_delim= iter_string =3D xstrdup(mbdelim); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0output_delim= iter_length =3D delimlen; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (MB_CUR_MAX <=3D 1 || force_singl= ebyte_mode) >> ++#endif >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0static char = dummy[2]; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0dummy[0] =3D= delim; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0dummy[1] =3D= '\0'; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0output_delim= iter_string =3D dummy; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0output_delim= iter_length =3D 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0if (optind =3D=3D argc) >> +diff -Naurp coreutils-8.25-orig/src/expand.c=20 >> coreutils-8.25/src/expand.c >> +--- coreutils-8.25-orig/src/expand.c 2016-01-01 07:48:50.000000000 >> -0600 >> ++++ coreutils-8.25/src/expand.c 2016-02-08 19:07:10.301944619 -0600 >> +@@ -37,12 +37,34 @@ >> + #include >> + #include >> + #include >> ++ >> ++/* Get mbstate_t, mbrtowc(), wcwidth(). */ >> ++#if HAVE_WCHAR_H >> ++# include >> ++#endif >> ++ >> ++/* Get iswblank(). */ >> ++#if HAVE_WCTYPE_H >> ++# include >> ++#endif >> ++ >> + #include "system.h" >> + #include "error.h" >> + #include "fadvise.h" >> + #include "quote.h" >> + #include "xstrndup.h" >> +=C2=A0 >> ++/* MB_LEN_MAX is incorrectly defined to be 1 in at least one GCC >> ++=C2=A0=C2=A0=C2=A0installation; work around this configuration error.=C2= =A0=C2=A0*/ >> ++#if !defined MB_LEN_MAX || MB_LEN_MAX < 2 >> ++# define MB_LEN_MAX 16 >> ++#endif >> ++ >> ++/* Some systems, like BeOS, have multibyte encodings but lack=20 >> mbstate_t.=C2=A0=C2=A0*/ >> ++#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).=C2=A0=C2=A0*/ >> + #define PROGRAM_NAME "expand" >> +=C2=A0 >> +@@ -357,6 +379,142 @@ expand (void) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> + } >> +=C2=A0 >> ++#if HAVE_MBRTOWC >> ++static void >> ++expand_multibyte (void) >> ++{ >> ++=C2=A0=C2=A0FILE *fp; /* Input strem. */ >> ++=C2=A0=C2=A0mbstate_t i_state; /* Current shift state of the input >> stream. */ >> ++=C2=A0=C2=A0mbstate_t i_state_bak; /* Back up the I_STATE. */ >> ++=C2=A0=C2=A0mbstate_t o_state; /* Current shift state of the output >> stream. */ >> ++=C2=A0=C2=A0char buf[MB_LEN_MAX + BUFSIZ];=C2=A0=C2=A0/* For spooling a = read byte=20 >> sequence. */ >> ++=C2=A0=C2=A0char *bufpos =3D buf; /* Next read position of BUF. >> */ >> ++=C2=A0=C2=A0size_t buflen =3D 0; /* The length of the byte sequence in >> buf. */ >> ++=C2=A0=C2=A0wchar_t wc; /* A gotten wide character. */ >> ++=C2=A0=C2=A0size_t mblength; /* The byte size of a multibyte character >> ++ =C2=A0=C2=A0=C2=A0which shows as same character as WC. */ >> ++=C2=A0=C2=A0int tab_index =3D 0; /* Index in `tab_list' of next tabstop. >> */ >> ++=C2=A0=C2=A0int column =3D 0; /* Column on screen of the next char. */ >> ++=C2=A0=C2=A0int next_tab_column; /* Column the next tab stop is on. */ >> ++=C2=A0=C2=A0int convert =3D 1; /* If nonzero, perform translations. */ >> ++ >> ++=C2=A0=C2=A0fp =3D next_file ((FILE *) NULL); >> ++=C2=A0=C2=A0if (fp =3D=3D NULL) >> ++=C2=A0=C2=A0=C2=A0=C2=A0return; >> ++ >> ++=C2=A0=C2=A0memset (&o_state, '\0', sizeof(mbstate_t)); >> ++=C2=A0=C2=A0memset (&i_state, '\0', sizeof(mbstate_t)); >> ++ >> ++=C2=A0=C2=A0for (;;) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Refill the buffer BUF. */ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (buflen < MB_LEN_MAX && !feof(fp)= && !ferror(fp)) >> ++ { >> ++ =C2=A0=C2=A0memmove (buf, bufpos, buflen); >> ++ =C2=A0=C2=A0buflen +=3D fread (buf + buflen, sizeof(char), BUFSIZ, fp); >> ++ =C2=A0=C2=A0bufpos =3D buf; >> ++ } >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* No character is left in BUF. */ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (buflen < 1) >> ++ { >> ++ =C2=A0=C2=A0fp =3D next_file (fp); >> ++ >> ++ =C2=A0=C2=A0if (fp =3D=3D NULL) >> ++ =C2=A0=C2=A0=C2=A0=C2=A0break; /* No more files. */ >> ++ =C2=A0=C2=A0else >> ++ =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0memset (&i_state, '\0', sizeof(mbst= ate_t)); >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0continue; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0} >> ++ } >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Get a wide character. */ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0i_state_bak =3D i_state; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mblength =3D mbrtowc (&wc, bufpos, b= uflen, &i_state); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0switch (mblength) >> ++ { >> ++ case (size_t)-1: /* illegal byte sequence. */ >> ++ case (size_t)-2: >> ++ =C2=A0=C2=A0mblength =3D 1; >> ++ =C2=A0=C2=A0i_state =3D i_state_bak; >> ++ =C2=A0=C2=A0if (convert) >> ++ =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0++column; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (convert_entire_line =3D=3D 0 &&= !isblank(*bufpos)) >> ++ convert =3D 0; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0} >> ++ =C2=A0=C2=A0putchar (*bufpos); >> ++ =C2=A0=C2=A0break; >> ++ >> ++ case 0: /* null. */ >> ++ =C2=A0=C2=A0mblength =3D 1; >> ++ =C2=A0=C2=A0if (convert && convert_entire_line =3D=3D 0) >> ++ =C2=A0=C2=A0=C2=A0=C2=A0convert =3D 0; >> ++ =C2=A0=C2=A0putchar ('\0'); >> ++ =C2=A0=C2=A0break; >> ++ >> ++ default: >> ++ =C2=A0=C2=A0if (wc =3D=3D L'\n')=C2=A0=C2=A0=C2=A0/* LF. */ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0tab_index =3D 0; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0column =3D 0; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0convert =3D 1; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0putchar ('\n'); >> ++ =C2=A0=C2=A0=C2=A0=C2=A0} >> ++ =C2=A0=C2=A0else if (wc =3D=3D L'\t' && convert) /* Tab. */ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (tab_size =3D=3D 0) >> ++ { >> ++ =C2=A0=C2=A0/* Do not let tab_index =3D=3D first_free_tab; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0stop when it is 1 less. */ >> ++ =C2=A0=C2=A0while (tab_index < first_free_tab - 1 >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0&& column >=3D tab_list[tab_index]) >> ++ =C2=A0=C2=A0=C2=A0=C2=A0tab_index++; >> ++ =C2=A0=C2=A0next_tab_column =3D tab_list[tab_index]; >> ++ =C2=A0=C2=A0if (tab_index < first_free_tab - 1) >> ++ =C2=A0=C2=A0=C2=A0=C2=A0tab_index++; >> ++ =C2=A0=C2=A0if (column >=3D next_tab_column) >> ++ =C2=A0=C2=A0=C2=A0=C2=A0next_tab_column =3D column + 1; >> ++ } >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++ next_tab_column =3D column + tab_size - column % tab_size; >> ++ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (column < next_tab_column) >> ++ { >> ++ =C2=A0=C2=A0putchar (' '); >> ++ =C2=A0=C2=A0++column; >> ++ } >> ++ =C2=A0=C2=A0=C2=A0=C2=A0} >> ++ =C2=A0=C2=A0else=C2=A0=C2=A0/* Others. */ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (convert) >> ++ { >> ++ =C2=A0=C2=A0if (wc =3D=3D L'\b') >> ++ =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (column > 0) >> ++ --column; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0} >> ++ =C2=A0=C2=A0else >> ++ =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0int width; /* The width of WC. */ >> ++ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0width =3D wcwidth (wc); >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0column +=3D (width > 0) ? width : = 0; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (convert_entire_line =3D=3D 0 &= & !iswblank(wc)) >> ++ convert =3D 0; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0} >> ++ } >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0fwrite (bufpos, sizeof(char), mblen= gth, stdout); >> ++ =C2=A0=C2=A0=C2=A0=C2=A0} >> ++ } >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0buflen -=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0bufpos +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++} >> ++#endif >> ++ >> + int >> + main (int argc, char **argv) >> + { >> +@@ -421,7 +579,12 @@ main (int argc, char **argv) >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0file_list =3D (optind < argc ? &argv[optind] : stdin_ar= gv); >> +=C2=A0 >> +-=C2=A0=C2=A0expand (); >> ++#if HAVE_MBRTOWC >> ++=C2=A0=C2=A0if (MB_CUR_MAX > 1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0expand_multibyte (); >> ++=C2=A0=C2=A0else >> ++#endif >> ++=C2=A0=C2=A0=C2=A0=C2=A0expand (); >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0if (have_read_stdin && fclose (stdin) !=3D 0) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0error (EXIT_FAILURE, errno, "-"); >> +diff -Naurp coreutils-8.25-orig/src/fold.c coreutils-8.25/src/fold.c >> +--- coreutils-8.25-orig/src/fold.c 2016-01-01 07:48:50.000000000=20 >> -0600 >> ++++ coreutils-8.25/src/fold.c 2016-02-08 19:07:10.302944622 -0600 >> +@@ -22,11 +22,33 @@ >> + #include >> + #include >> +=C2=A0 >> ++/* Get mbstate_t, mbrtowc(), wcwidth().=C2=A0=C2=A0*/ >> ++#if HAVE_WCHAR_H >> ++# include >> ++#endif >> ++ >> ++/* Get iswprint(), iswblank(), wcwidth().=C2=A0=C2=A0*/ >> ++#if HAVE_WCTYPE_H >> ++# include >> ++#endif >> ++ >> + #include "system.h" >> + #include "error.h" >> + #include "fadvise.h" >> + #include "xdectoint.h" >> +=C2=A0 >> ++/* MB_LEN_MAX is incorrectly defined to be 1 in at least one GCC >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0installation; work around this confi= guration error.=C2=A0=C2=A0*/ >> ++#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=20 >> mbstate_t.=C2=A0=C2=A0*/ >> ++#if HAVE_MBRTOWC && defined mbstate_t >> ++# define mbrtowc(pwc, s, n, ps) (mbrtowc) (pwc, s, n, 0) >> ++#endif >> ++ >> + #define TAB_WIDTH 8 >> +=C2=A0 >> + /* The official name of this program (e.g., no 'g' prefix).=C2=A0=C2=A0*/ >> +@@ -34,20 +56,41 @@ >> +=C2=A0 >> + #define AUTHORS proper_name ("David MacKenzie") >> +=C2=A0 >> ++#define=20 >> FATAL_ERROR(Message)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0do=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0{=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0error (0, 0,=20 >> (Message));=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0usage=20 >> (2);=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0}=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0while (0) >> ++ >> ++enum operating_mode >> ++{ >> ++=C2=A0=C2=A0/* Fold texts by columns that are at the given positions. */ >> ++=C2=A0=C2=A0column_mode, >> ++ >> ++=C2=A0=C2=A0/* Fold texts by bytes that are at the given positions. */ >> ++=C2=A0=C2=A0byte_mode, >> ++ >> ++=C2=A0=C2=A0/* Fold texts by characters that are at the given positions.= */ >> ++=C2=A0=C2=A0character_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; >> +=C2=A0 >> +-/* If nonzero, count bytes, not column positions. */ >> +-static bool count_bytes; >> +- >> + /* If nonzero, at least one of the files we read was standard input.=20 >> */ >> + static bool have_read_stdin; >> +=C2=A0 >> +-static char const shortopts[] =3D=20 >> "bsw:0::1::2::3::4::5::6::7::8::9::"; >> ++static char const shortopts[] =3D=20 >> "bcsw:0::1::2::3::4::5::6::7::8::9::"; >> +=C2=A0 >> + static struct option const longopts[] =3D >> + { >> +=C2=A0=C2=A0=C2=A0{"bytes", no_argument, NULL, 'b'}, >> ++=C2=A0=C2=A0{"characters", no_argument, NULL, 'c'}, >> +=C2=A0=C2=A0=C2=A0{"spaces", no_argument, NULL, 's'}, >> +=C2=A0=C2=A0=C2=A0{"width", required_argument, NULL, 'w'}, >> +=C2=A0=C2=A0=C2=A0{GETOPT_HELP_OPTION_DECL}, >> +@@ -75,6 +118,7 @@ Wrap input lines in each FILE, writing t >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0fputs (_("\ >> +=C2=A0=C2=A0=C2=A0-b, --bytes=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0count bytes rather than columns\n\ >> ++=C2=A0=C2=A0-c, --characters=C2=A0=C2=A0=C2=A0=C2=A0count characters rat= her than columns\n\ >> +=C2=A0=C2=A0=C2=A0-s, --spaces=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0break at spaces\n\ >> +=C2=A0=C2=A0=C2=A0-w, --width=3DWIDTH=C2=A0=C2=A0=C2=A0use WIDTH columns = instead of 80\n\ >> + "), stdout); >> +@@ -92,7 +136,7 @@ Wrap input lines in each FILE, writing t >> + static size_t >> + adjust_column (size_t column, char c) >> + { >> +-=C2=A0=C2=A0if (!count_bytes) >> ++=C2=A0=C2=A0if (operating_mode !=3D byte_mode) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (c =3D=3D '\b') >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +@@ -115,30 +159,14 @@ adjust_column (size_t column, char c) >> +=C2=A0=C2=A0=C2=A0=C2=A0to stdout, with maximum line length WIDTH. >> +=C2=A0=C2=A0=C2=A0=C2=A0Return true if successful.=C2=A0=C2=A0*/ >> +=C2=A0 >> +-static bool >> +-fold_file (char const *filename, size_t width) >> ++static void >> ++fold_text (FILE *istream, size_t width, int *saved_errno) >> + { >> +-=C2=A0=C2=A0FILE *istream; >> +=C2=A0=C2=A0=C2=A0int c; >> +=C2=A0=C2=A0=C2=A0size_t column =3D 0; /* Screen column where next char = will >> go. */ >> +=C2=A0=C2=A0=C2=A0size_t offset_out =3D 0; /* Index in 'line_out' for nex= t char. */ >> +=C2=A0=C2=A0=C2=A0static char *line_out =3D NULL; >> +=C2=A0=C2=A0=C2=A0static size_t allocated_out =3D 0; >> +-=C2=A0=C2=A0int saved_errno; >> +- >> +-=C2=A0=C2=A0if (STREQ (filename, "-")) >> +-=C2=A0=C2=A0=C2=A0=C2=A0{ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0istream =3D stdin; >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0have_read_stdin =3D true; >> +-=C2=A0=C2=A0=C2=A0=C2=A0} >> +-=C2=A0=C2=A0else >> +-=C2=A0=C2=A0=C2=A0=C2=A0istream =3D fopen (filename, "r"); >> +- >> +-=C2=A0=C2=A0if (istream =3D=3D NULL) >> +-=C2=A0=C2=A0=C2=A0=C2=A0{ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0error (0, errno, "%s", quotef (filen= ame)); >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return false; >> +-=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0fadvise (istream, FADVISE_SEQUENTIAL); >> +=C2=A0 >> +@@ -168,6 +196,15 @@ fold_file (char const *filename, size_t >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0bool found_blank =3D false; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0size_t logical_end =3D offset_out; >> +=C2=A0 >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0/* If LINE_OUT has no wide character, >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0put a new wide character in LINE_OUT >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if column is bigger than width. */ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0if (offset_out =3D=3D 0) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0line_out[offset_out++] =3D c; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0continue; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0/* Look for the last blank. */ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0while (logical_end) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +@@ -214,11 +251,221 @@ fold_file (char const *filename, size_t >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0line_out[offset_out++] =3D c; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0 >> +-=C2=A0=C2=A0saved_errno =3D errno; >> ++=C2=A0=C2=A0*saved_errno =3D errno; >> ++ >> ++=C2=A0=C2=A0if (offset_out) >> ++=C2=A0=C2=A0=C2=A0=C2=A0fwrite (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) >> ++{ >> ++=C2=A0=C2=A0char buf[MB_LEN_MAX + BUFSIZ];=C2=A0=C2=A0/* For spooling a = read byte=20 >> sequence. */ >> ++=C2=A0=C2=A0size_t buflen =3D 0;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0/* The length of the byte sequence in=20 >> buf. */ >> ++=C2=A0=C2=A0char *bufpos =3D buf;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0/* Next read position of BUF. */ >> ++=C2=A0=C2=A0wint_t wc;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* A gotten wide character. */ >> ++=C2=A0=C2=A0size_t mblength;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0/* The byte size of a multibyte character=20 >> which >> shows >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0as same character as WC. */ >> ++=C2=A0=C2=A0mbstate_t state, state_bak;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0/* State of the stream. */ >> ++=C2=A0=C2=A0int convfail =3D 0;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* 1, when conversio= n is failed. >> Otherwise 0. */ >> ++ >> ++=C2=A0=C2=A0static char *line_out =3D NULL; >> ++=C2=A0=C2=A0size_t offset_out =3D 0;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0/* Index in `line_out' for next=20 >> char. */ >> ++=C2=A0=C2=A0static size_t allocated_out =3D 0; >> ++ >> ++=C2=A0=C2=A0int increment; >> ++=C2=A0=C2=A0size_t column =3D 0; >> ++ >> ++=C2=A0=C2=A0size_t last_blank_pos; >> ++=C2=A0=C2=A0size_t last_blank_column; >> ++=C2=A0=C2=A0int is_blank_seen; >> ++=C2=A0=C2=A0int last_blank_increment =3D 0; >> ++=C2=A0=C2=A0int is_bs_following_last_blank; >> ++=C2=A0=C2=A0size_t bs_following_last_blank_num; >> ++=C2=A0=C2=A0int is_cr_after_last_blank; >> ++ >> ++#define CLEAR_FLAGS=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0do=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0last_blank_pos =3D 0;=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0last_blank_column =3D 0;= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0is_blank_seen =3D 0;=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0is_bs_following_last_bla= nk =3D 0;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0bs_following_last_blank_= num =3D 0;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0is_cr_after_last_blank = =3D 0;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0}=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0while (0) >> ++ >> ++#define START_NEW_LINE=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0do=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0putchar ('\n');=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0column =3D 0;=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0offset_out =3D 0;=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0CLEAR_FLAGS;=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0}=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0while (0) >> ++ >> ++=C2=A0=C2=A0CLEAR_FLAGS; >> ++=C2=A0=C2=A0memset (&state, '\0', sizeof(mbstate_t)); >> ++ >> ++=C2=A0=C2=A0for (;; bufpos +=3D mblength, buflen -=3D mblength) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (buflen < MB_LEN_MAX && !feof (is= tream) && !ferror=20 >> (istream)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0memmove (buf= , bufpos, buflen); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0buflen +=3D = fread (buf + buflen, sizeof(char), BUFSIZ,=20 >> istream); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0bufpos =3D b= uf; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (buflen < 1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Get a wide character. */ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0state_bak =3D state; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mblength =3D mbrtowc ((wchar_t *)&wc= , bufpos, buflen, &state); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0switch (mblength) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case (size_t)-1: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case (size_t)-2: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0convfail++; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0state =3D st= ate_bak; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Fall thro= ugh. */ >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case 0: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mblength =3D= 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++rescan: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (operating_mode =3D=3D byte_mode)= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/*=20 >> byte mode >> */ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0increment =3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else if (operating_mode =3D=3D chara= cter_mode)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* character=20 >> mode */ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0increment =3D 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* column=20 >> mode */ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (convfail) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= increment =3D 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0switch (wc) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0case L'\n': >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0fwrite (line_out, sizeof(char), offset_ou= t,=20 >> stdout); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0START_NEW_LINE; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0continue; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0case L'\b': >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0increment =3D (column > 0) ? -1 : 0; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0case L'\r': >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0increment =3D -1 * column; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0case L'\t': >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0increment =3D 8 - column % 8; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0default: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0increment =3D wcwidth (wc); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0increment =3D (increment < 0) ? 0 : incre= ment; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (column + increment > width && br= eak_spaces &&=20 >> last_blank_pos) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0fwrite (line= _out, sizeof(char), last_blank_pos, stdout); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0putchar ('\n= '); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0offset_out = =3D offset_out - last_blank_pos; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0column =3D c= olumn - last_blank_column +=20 >> ((is_cr_after_last_blank) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0? last_blank_increment : bs_following_last_blank_num); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0memmove (lin= e_out, line_out + last_blank_pos, offset_out); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0CLEAR_FLAGS; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0goto rescan; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (column + increment > width && co= lumn !=3D 0) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0fwrite (line= _out, sizeof(char), offset_out, stdout); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0START_NEW_LI= NE; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0goto rescan; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (allocated_out < offset_out + mbl= ength) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0line_out =3D= X2REALLOC (line_out, &allocated_out); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0memcpy (line_out + offset_out, bufpo= s, mblength); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0offset_out +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0column +=3D increment; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (is_blank_seen && !convfail && wc= =3D=3D L'\r') >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0is_cr_after_last_blank = =3D 1; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (is_bs_following_last_blank && !c= onvfail && wc =3D=3D L'\b') >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0++bs_following_last_blan= k_num; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0is_bs_following_last_bla= nk =3D 0; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (break_spaces && !convfail && isw= blank (wc)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0last_blank_p= os =3D offset_out; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0last_blank_c= olumn =3D column; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0is_blank_see= n =3D 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0last_blank_i= ncrement =3D increment; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0is_bs_follow= ing_last_blank =3D 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0bs_following= _last_blank_num =3D 0; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0is_cr_after_= last_blank =3D 0; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0*saved_errno =3D errno; >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0if (offset_out) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0fwrite (line_out, sizeof (char), (size_t) o= ffset_out, stdout); >> +=C2=A0 >> ++} >> ++#endif >> ++ >> ++/* Fold file FILENAME, or standard input if FILENAME is "-", >> ++=C2=A0=C2=A0=C2=A0to stdout, with maximum line length WIDTH. >> ++=C2=A0=C2=A0=C2=A0Return 0 if successful, 1 if an error occurs. */ >> ++ >> ++static bool >> ++fold_file (char const *filename, size_t width) >> ++{ >> ++=C2=A0=C2=A0FILE *istream; >> ++=C2=A0=C2=A0int saved_errno; >> ++ >> ++=C2=A0=C2=A0if (STREQ (filename, "-")) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0istream =3D stdin; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0have_read_stdin =3D 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0istream =3D fopen (filename, "r"); >> ++ >> ++=C2=A0=C2=A0if (istream =3D=3D NULL) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0error (0, errno, "%s", quotef (filen= ame)); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0/* Define how ISTREAM is being folded. */ >> ++#if HAVE_MBRTOWC >> ++=C2=A0=C2=A0if (MB_CUR_MAX > 1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0fold_multibyte_text (istream, width, &saved_errn= o); >> ++=C2=A0=C2=A0else >> ++#endif >> ++=C2=A0=C2=A0=C2=A0=C2=A0fold_text (istream, width, &saved_errno); >> ++ >> +=C2=A0=C2=A0=C2=A0if (ferror (istream)) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0error (0, saved_errno, "%s", qu= otef (filename)); >> +@@ -251,7 +498,8 @@ main (int argc, char **argv) >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0atexit (close_stdout); >> +=C2=A0 >> +-=C2=A0=C2=A0break_spaces =3D count_bytes =3D have_read_stdin =3D false; >> ++=C2=A0=C2=A0operating_mode =3D column_mode; >> ++=C2=A0=C2=A0break_spaces =3D have_read_stdin =3D false; >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0while ((optc =3D getopt_long (argc, argv, shortopts, lo= ngopts,=20 >> NULL)) !=3D -1) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +@@ -260,7 +508,15 @@ main (int argc, char **argv) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0switch (optc) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case 'b': /* Count= bytes rather than columns. */ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0count_bytes = =3D true; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (operatin= g_mode !=3D column_mode) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= FATAL_ERROR (_("only one way of folding may be=20 >> specified")); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0operating_mo= de =3D byte_mode; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case 'c': >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (operatin= g_mode !=3D column_mode) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= FATAL_ERROR (_("only one way of folding may be=20 >> specified")); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0operating_mo= de =3D character_mode; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case 's': /* Break= at word boundaries. */ >> +diff -Naurp coreutils-8.25-orig/src/join.c coreutils-8.25/src/join.c >> +--- coreutils-8.25-orig/src/join.c 2016-01-13 05:08:59.000000000=20 >> -0600 >> ++++ coreutils-8.25/src/join.c 2016-02-08 19:07:10.303944625 -0600 >> +@@ -22,18 +22,32 @@ >> + #include >> + #include >> +=C2=A0 >> ++/* Get mbstate_t, mbrtowc(), mbrtowc(), wcwidth().=C2=A0=C2=A0*/ >> ++#if HAVE_WCHAR_H >> ++# include >> ++#endif >> ++ >> ++/* Get iswblank(), towupper.=C2=A0=C2=A0*/ >> ++#if HAVE_WCTYPE_H >> ++# include >> ++#endif >> ++ >> + #include "system.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" >> +=C2=A0 >> ++/* Some systems, like BeOS, have multibyte encodings but lack=20 >> mbstate_t.=C2=A0=C2=A0*/ >> ++#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).=C2=A0=C2=A0*/ >> + #define PROGRAM_NAME "join" >> +=C2=A0 >> +@@ -135,10 +149,12 @@ static struct outlist outlist_head; >> + /* Last element in 'outlist', where a new element can be added.=C2=A0=C2= =A0*/ >> + static struct outlist *outlist_end =3D &outlist_head; >> +=C2=A0 >> +-/* Tab character separating fields.=C2=A0=C2=A0If negative, fields are=20 >> separated >> +-=C2=A0=C2=A0=C2=A0by any nonempty string of blanks, otherwise by exactly= one >> +-=C2=A0=C2=A0=C2=A0tab character whose value (when cast to unsigned char)= equals=20 >> TAB.=C2=A0=C2=A0*/ >> +-static int tab =3D -1; >> ++/* Tab character separating fields.=C2=A0=C2=A0If NULL, fields are separ= ated >> ++=C2=A0=C2=A0=C2=A0by any nonempty string of blanks.=C2=A0=C2=A0*/ >> ++static char *tab =3D NULL; >> ++ >> ++/* The number of bytes used for tab. */ >> ++static size_t tablen =3D 0; >> +=C2=A0 >> + /* If nonzero, check that the input is correctly ordered. */ >> + static enum >> +@@ -275,13 +291,14 @@ xfields (struct line *line) >> +=C2=A0=C2=A0=C2=A0if (ptr =3D=3D lim) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return; >> +=C2=A0 >> +-=C2=A0=C2=A0if (0 <=3D tab && tab !=3D '\n') >> ++=C2=A0=C2=A0if (tab !=3D NULL) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0unsigned char t =3D tab[0]; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0char *sep; >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0for (; (sep =3D memchr (ptr, tab, li= m - ptr)) !=3D NULL; ptr =3D sep=20 >> + 1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0for (; (sep =3D memchr (ptr, t, lim = - ptr)) !=3D NULL; ptr =3D sep +=20 >> 1) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0extract_field (line= , ptr, sep - ptr); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +-=C2=A0=C2=A0else if (tab < 0) >> ++=C2=A0=C2=A0=C2=A0else >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Skip leading blanks before t= he first field.=C2=A0=C2=A0*/ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (field_sep (*ptr)) >> +@@ -305,6 +322,147 @@ xfields (struct line *line) >> +=C2=A0=C2=A0=C2=A0extract_field (line, ptr, lim - ptr); >> + } >> +=C2=A0 >> ++#if HAVE_MBRTOWC >> ++static void >> ++xfields_multibyte (struct line *line) >> ++{ >> ++=C2=A0=C2=A0char *ptr =3D line->buf.buffer; >> ++=C2=A0=C2=A0char const *lim =3D ptr + line->buf.length - 1; >> ++=C2=A0=C2=A0wchar_t wc =3D 0; >> ++=C2=A0=C2=A0size_t mblength =3D 1; >> ++=C2=A0=C2=A0mbstate_t state, state_bak; >> ++ >> ++=C2=A0=C2=A0memset (&state, 0, sizeof (mbstate_t)); >> ++ >> ++=C2=A0=C2=A0if (ptr >=3D lim) >> ++=C2=A0=C2=A0=C2=A0=C2=A0return; >> ++ >> ++=C2=A0=C2=A0if (tab !=3D NULL) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0char *sep =3D ptr; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0for (; ptr < lim; ptr =3D sep + mble= ngth) >> ++ { >> ++ =C2=A0=C2=A0sep =3D ptr; >> ++ =C2=A0=C2=A0while (sep < lim) >> ++ =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0state_bak =3D state; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mblength =3D mbrtowc (&wc, sep, lim= - sep + 1, &state); >> ++ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (mblength =3D=3D (size_t)-1 || m= blength =3D=3D (size_t)-2) >> ++ { >> ++ =C2=A0=C2=A0mblength =3D 1; >> ++ =C2=A0=C2=A0state =3D state_bak; >> ++ } >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mblength =3D (mblength < 1) ? 1 : m= blength; >> ++ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (mblength =3D=3D tablen && !memc= mp (sep, tab, mblength)) >> ++ break; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++ { >> ++ =C2=A0=C2=A0sep +=3D mblength; >> ++ =C2=A0=C2=A0continue; >> ++ } >> ++ =C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++ =C2=A0=C2=A0if (sep >=3D lim) >> ++ =C2=A0=C2=A0=C2=A0=C2=A0break; >> ++ >> ++ =C2=A0=C2=A0extract_field (line, ptr, sep - ptr); >> ++ } >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Skip leading blanks before the fi= rst field.=C2=A0=C2=A0*/ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while(ptr < lim) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0state_bak =3D state; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mblength =3D mbrtowc (&w= c, ptr, lim - ptr + 1, &state); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (mblength =3D=3D (siz= e_t)-1 || mblength =3D=3D (size_t)-2) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= mblength =3D 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= state =3D state_bak; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= break; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mblength =3D (mblength <= 1) ? 1 : mblength; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (!iswblank(wc) && wc = !=3D '\n') >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0ptr +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0do >> ++ { >> ++ =C2=A0=C2=A0char *sep; >> ++ =C2=A0=C2=A0state_bak =3D state; >> ++ =C2=A0=C2=A0mblength =3D mbrtowc (&wc, ptr, lim - ptr + 1, &state); >> ++ =C2=A0=C2=A0if (mblength =3D=3D (size_t)-1 || mblength =3D=3D (size_t)-= 2) >> ++ =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mblength =3D 1; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0state =3D state_bak; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0} >> ++ =C2=A0=C2=A0mblength =3D (mblength < 1) ? 1 : mblength; >> ++ >> ++ =C2=A0=C2=A0sep =3D ptr + mblength; >> ++ =C2=A0=C2=A0while (sep < lim) >> ++ =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0state_bak =3D state; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mblength =3D mbrtowc (&wc, sep, lim= - sep + 1, &state); >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (mblength =3D=3D (size_t)-1 || m= blength =3D=3D (size_t)-2) >> ++ { >> ++ =C2=A0=C2=A0mblength =3D 1; >> ++ =C2=A0=C2=A0state =3D state_bak; >> ++ =C2=A0=C2=A0break; >> ++ } >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mblength =3D (mblength < 1) ? 1 : m= blength; >> ++ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (iswblank (wc) || wc =3D=3D '\n') >> ++ break; >> ++ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0sep +=3D mblength; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++ =C2=A0=C2=A0extract_field (line, ptr, sep - ptr); >> ++ =C2=A0=C2=A0if (sep >=3D lim) >> ++ =C2=A0=C2=A0=C2=A0=C2=A0return; >> ++ >> ++ =C2=A0=C2=A0state_bak =3D state; >> ++ =C2=A0=C2=A0mblength =3D mbrtowc (&wc, sep, lim - sep + 1, &state); >> ++ =C2=A0=C2=A0if (mblength =3D=3D (size_t)-1 || mblength =3D=3D (size_t)-= 2) >> ++ =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mblength =3D 1; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0state =3D state_bak; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0} >> ++ =C2=A0=C2=A0mblength =3D (mblength < 1) ? 1 : mblength; >> ++ >> ++ =C2=A0=C2=A0ptr =3D sep + mblength; >> ++ =C2=A0=C2=A0while (ptr < lim) >> ++ =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0state_bak =3D state; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mblength =3D mbrtowc (&wc, ptr, lim= - ptr + 1, &state); >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (mblength =3D=3D (size_t)-1 || m= blength =3D=3D (size_t)-2) >> ++ { >> ++ =C2=A0=C2=A0mblength =3D 1; >> ++ =C2=A0=C2=A0state =3D state_bak; >> ++ =C2=A0=C2=A0break; >> ++ } >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mblength =3D (mblength < 1) ? 1 : m= blength; >> ++ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (!iswblank (wc) && wc !=3D '\n') >> ++ break; >> ++ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0ptr +=3D mblength; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0} >> ++ } >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (ptr < lim); >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0extract_field (line, ptr, lim - ptr); >> ++} >> ++#endif >> ++ >> + static void >> + freeline (struct line *line) >> + { >> +@@ -326,56 +484,133 @@ keycmp (struct line const *line1, struct >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0size_t jf_1, size_t= jf_2) >> + { >> +=C2=A0=C2=A0=C2=A0/* Start of field to compare in each file.=C2=A0=C2=A0*/ >> +-=C2=A0=C2=A0char *beg1; >> +-=C2=A0=C2=A0char *beg2; >> +- >> +-=C2=A0=C2=A0size_t len1; >> +-=C2=A0=C2=A0size_t len2; /* Length of fields to compare.=C2=A0=C2=A0*/ >> ++=C2=A0=C2=A0char *beg[2]; >> ++=C2=A0=C2=A0char *copy[2]; >> ++=C2=A0=C2=A0size_t len[2];=C2=A0 /* Length of fields to compare.=C2=A0= =C2=A0*/ >> +=C2=A0=C2=A0=C2=A0int diff; >> ++=C2=A0=C2=A0int i, j; >> ++=C2=A0=C2=A0int mallocd =3D 0; >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0if (jf_1 < line1->nfields) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0beg1 =3D line1->fields[jf_1].beg; >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0len1 =3D line1->fields[jf_1].len; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0beg[0] =3D line1->fields[jf_1].beg; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0len[0] =3D line1->fields[jf_1].len; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0else >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0beg1 =3D NULL; >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0len1 =3D 0; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0beg[0] =3D NULL; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0len[0] =3D 0; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0if (jf_2 < line2->nfields) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0beg2 =3D line2->fields[jf_2].beg; >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0len2 =3D line2->fields[jf_2].len; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0beg[1] =3D line2->fields[jf_2].beg; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0len[1] =3D line2->fields[jf_2].len; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0else >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0beg2 =3D NULL; >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0len2 =3D 0; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0beg[1] =3D NULL; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0len[1] =3D 0; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0 >> +-=C2=A0=C2=A0if (len1 =3D=3D 0) >> +-=C2=A0=C2=A0=C2=A0=C2=A0return len2 =3D=3D 0 ? 0 : -1; >> +-=C2=A0=C2=A0if (len2 =3D=3D 0) >> ++=C2=A0=C2=A0if (len[0] =3D=3D 0) >> ++=C2=A0=C2=A0=C2=A0=C2=A0return len[1] =3D=3D 0 ? 0 : -1; >> ++=C2=A0=C2=A0if (len[1] =3D=3D 0) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return 1; >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0if (ignore_case) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* FIXME: ignore_case does not work = with NLS (in particular, >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0with multibyte cha= rs).=C2=A0=C2=A0*/ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0diff =3D memcasecmp (beg1, beg2, MIN= (len1, len2)); >> ++#ifdef HAVE_MBRTOWC >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (MB_CUR_MAX > 1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0size_t mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0wchar_t wc, uwc; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mbstate_t state, state_b= ak; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0memset (&state, '\0', si= zeof (mbstate_t)); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0for (i =3D 0; i < 2; i++) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= mallocd =3D 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= copy[i] =3D xmalloc (len[i] + 1); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= memset (copy[i], '\0',len[i] + 1); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= for (j =3D 0; j < MIN (len[0], len[1]);) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0state_bak =3D state; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0mblength =3D mbrtowc (&wc, beg[i] + j, len[i] - j,=20 >> &state); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0switch (mblength) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case (size_t) -1: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case (size_t) -2: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0state =3D state_bak; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Fall through */ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case 0: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mblength =3D 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0default: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0uwc =3D towupper (wc); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (uwc !=3D wc) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mbsta= te_t state_wc; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0size_= t mblen; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0memse= t (&state_wc, '\0', sizeof=20 >> (mbstate_t)); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mblen= =3D wcrtomb (copy[i] + j, uwc,=20 >> &state_wc); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0asser= t (mblen !=3D (size_t)-1); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0memcpy (copy[i] += j, beg[i] + j, mblength); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0j +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= copy[i][j] =3D '\0'; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++#endif >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0for (i =3D 0; i < 2; i++) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= mallocd =3D 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= copy[i] =3D xmalloc (len[i] + 1); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= for (j =3D 0; j < MIN (len[0], len[1]); j++) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0copy[i][j] =3D toupper (beg[i][j]); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= copy[i][j] =3D '\0'; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0else >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (hard_LC_COLLATE) >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return xmemcoll (beg1, l= en1, beg2, len2); >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0diff =3D memcmp (beg1, beg2, MIN (le= n1, len2)); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0copy[0] =3D beg[0]; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0copy[1] =3D beg[1]; >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0if (hard_LC_COLLATE) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0diff =3D xmemcoll ((char *) copy[0],= len[0], (char *) copy[1],=20 >> len[1]); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (mallocd) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0for (i =3D 0; i < 2; i++) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0free (copy[i= ]); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return diff; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0diff =3D memcmp (copy[0], copy[1], MIN (len[0], len[1])); >> ++ >> ++=C2=A0=C2=A0if (mallocd) >> ++=C2=A0=C2=A0=C2=A0=C2=A0for (i =3D 0; i < 2; i++) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0free (copy[i]); >> ++ >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0if (diff) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return diff; >> +-=C2=A0=C2=A0return len1 < len2 ? -1 : len1 !=3D len2; >> ++=C2=A0=C2=A0return len[0] - len[1]; >> + } >> +=C2=A0 >> + /* Check that successive input lines PREV and CURRENT from input=20 >> file >> +@@ -467,6 +702,11 @@ get_line (FILE *fp, struct line **linep, >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0++line_no[which - 1]; >> +=C2=A0 >> ++#if HAVE_MBRTOWC >> ++=C2=A0=C2=A0if (MB_CUR_MAX > 1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0xfields_multibyte (line); >> ++=C2=A0=C2=A0else >> ++#endif >> +=C2=A0=C2=A0=C2=A0xfields (line); >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0if (prevline[which - 1]) >> +@@ -566,21 +806,28 @@ prfield (size_t n, struct line const *li >> +=C2=A0 >> + /* Output all the fields in line, other than the join field.=C2=A0=C2=A0= */ >> +=C2=A0 >> ++#define PUT_TAB_CHAR >> \ >> ++=C2=A0=C2=A0do >> \ >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> \ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0(tab !=3D NULL) ? >> \ >> ++ fwrite(tab, sizeof(char), tablen, stdout) : putchar (' '); \ >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> \ >> ++=C2=A0=C2=A0while (0) >> ++ >> + static void >> + prfields (struct line const *line, size_t join_field, size_t=20 >> autocount) >> + { >> +=C2=A0=C2=A0=C2=A0size_t i; >> +=C2=A0=C2=A0=C2=A0size_t nfields =3D autoformat ? autocount : line->nfiel= ds; >> +-=C2=A0=C2=A0char output_separator =3D tab < 0 ? ' ' : tab; >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0for (i =3D 0; i < join_field && i < nfields; ++i) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0putchar (output_separator); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0PUT_TAB_CHAR; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0prfield (i, line); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0for (i =3D join_field + 1; i < nfields; ++i) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0putchar (output_separator); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0PUT_TAB_CHAR; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0prfield (i, line); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> + } >> +@@ -591,7 +838,6 @@ static void >> + prjoin (struct line const *line1, struct line const *line2) >> + { >> +=C2=A0=C2=A0=C2=A0const struct outlist *outlist; >> +-=C2=A0=C2=A0char output_separator =3D tab < 0 ? ' ' : tab; >> +=C2=A0=C2=A0=C2=A0size_t field; >> +=C2=A0=C2=A0=C2=A0struct line const *line; >> +=C2=A0 >> +@@ -625,7 +871,7 @@ prjoin (struct line const *line1, struct >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0o =3D o= ->next; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (o = =3D=3D NULL) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0break; >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0putchar (out= put_separator); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0PUT_TAB_CHAR; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0putchar (eolchar); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +@@ -1103,21 +1349,46 @@ main (int argc, char **argv) >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case 't': >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= unsigned char newtab =3D optarg[0]; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= char *newtab =3D NULL; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= size_t newtablen; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= newtab =3D xstrdup (optarg); >> ++#if HAVE_MBRTOWC >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= if (MB_CUR_MAX > 1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0mbstate_t state; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0memset (&state, 0, sizeof (mbstate_t)); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0newtablen =3D mbrtowc (NULL, newtab, >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0st= rnlen (newtab, MB_LEN_MAX), >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0&s= tate); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0if (newtablen =3D=3D (size_t) 0 >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0|| newtablen =3D=3D (size_t) = -1 >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0|| newtablen =3D=3D (size_t) = -2) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0newtablen =3D 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= else >> ++#endif >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0newtablen =3D 1; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0if (! newtab) >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0newtab =3D '\n'; /* '' =3D> process the whole line.=C2=A0=C2=A0*/ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0newtab =3D (char*)"\n"; /* '' =3D> process the whole=20 >> line.=C2=A0=C2=A0*/ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0else if (optarg[1]) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0{ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0if (STREQ (optarg, "\\0")) >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0newtab =3D '\0'; >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0else >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0error (EXIT_FAILURE, 0, _("multi-characte= r tab=20 >> %s"), >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0quote (optarg)); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0if (newtablen =3D=3D 1 && newtab[1]) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (STREQ (newtab, "\\0")) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0newtab[0] =3D '\0'; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= if (tab !=3D NULL && strcmp (tab, newtab)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0free (newtab); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0error (EXIT_FAILURE, 0, _("incompatible tabs")); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0} >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= if (0 <=3D tab && tab !=3D newtab) >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0error (EXIT_FAILURE, 0, _("incompatible tabs")); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0tab =3D newtab; >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= tablen =3D newtablen; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case 'z': >> +diff -Naurp coreutils-8.25-orig/src/pr.c coreutils-8.25/src/pr.c >> +--- coreutils-8.25-orig/src/pr.c 2016-01-01 07:48:50.000000000 -0600 >> ++++ coreutils-8.25/src/pr.c 2016-02-08 19:07:10.306944635 -0600 >> +@@ -311,6 +311,24 @@ >> +=C2=A0 >> + #include >> + #include >> ++ >> ++/* Get MB_LEN_MAX.=C2=A0=C2=A0*/ >> ++#include >> ++/* MB_LEN_MAX is incorrectly defined to be 1 in at least one GCC >> ++=C2=A0=C2=A0=C2=A0installation; work around this configuration error.=C2= =A0=C2=A0*/ >> ++#if !defined MB_LEN_MAX || MB_LEN_MAX =3D=3D 1 >> ++# define MB_LEN_MAX 16 >> ++#endif >> ++ >> ++/* Get MB_CUR_MAX.=C2=A0=C2=A0*/ >> ++#include >> ++ >> ++/* Solaris 2.5 has a bug: must be included before=20 >> .=C2=A0=C2=A0*/ >> ++/* Get mbstate_t, mbrtowc(), wcwidth().=C2=A0=C2=A0*/ >> ++#if HAVE_WCHAR_H >> ++# include >> ++#endif >> ++ >> + #include "system.h" >> + #include "error.h" >> + #include "fadvise.h" >> +@@ -323,6 +341,18 @@ >> + #include "xstrtol.h" >> + #include "xdectoint.h" >> +=C2=A0 >> ++/* Some systems, like BeOS, have multibyte encodings but lack=20 >> mbstate_t.=C2=A0=C2=A0*/ >> ++#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).=C2=A0=C2=A0*/ >> + #define PROGRAM_NAME "pr" >> +=C2=A0 >> +@@ -415,7 +445,20 @@ struct COLUMN >> +=C2=A0 >> + typedef struct COLUMN COLUMN; >> +=C2=A0 >> +-static int char_to_clump (char c); >> ++/* Funtion pointers to switch functions for single byte locale or=20 >> for >> ++=C2=A0=C2=A0=C2=A0multibyte locale. If multibyte functions do not exist = in your=20 >> sysytem, >> ++=C2=A0=C2=A0=C2=A0these pointers always point the function for single by= te locale.=20 >> */ >> ++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); >> +@@ -427,6 +470,7 @@ static void add_line_number (COLUMN *p); >> + static void getoptnum (const char *n_str, int min, int *num, >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0const= char *errfmt); >> + static void getoptarg (char *arg, char switch_char, char *character, >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0int *charac= ter_length, int *character_width, >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0int *= number); >> + static void print_files (int number_of_files, char **av); >> + static void init_parameters (int number_of_files); >> +@@ -440,7 +484,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 (const char *optarg_S); >> +@@ -452,7 +495,7 @@ static COLUMN *column_vector; >> +=C2=A0=C2=A0=C2=A0=C2=A0we store the leftmost columns contiguously in buf= f. >> +=C2=A0=C2=A0=C2=A0=C2=A0To print a line from buff, get the index of the f= irst character >> +=C2=A0=C2=A0=C2=A0=C2=A0from line_vector[i], and print up to line_vector[= i + 1]. */ >> +-static char *buff; >> ++static unsigned char *buff; >> +=C2=A0 >> + /* Index of the position in buff where the next character >> +=C2=A0=C2=A0=C2=A0=C2=A0will be stored. */ >> +@@ -556,7 +599,7 @@ static int chars_per_column; >> + static bool untabify_input =3D false; >> +=C2=A0 >> + /* (-e) The input tab character. */ >> +-static char input_tab_char =3D '\t'; >> ++static char input_tab_char[MB_LEN_MAX] =3D "\t"; >> +=C2=A0 >> + /* (-e) Tabstops are at chars_per_tab, 2*chars_per_tab,=20 >> 3*chars_per_tab, ... >> +=C2=A0=C2=A0=C2=A0=C2=A0where the leftmost column is 1. */ >> +@@ -566,7 +609,10 @@ static int chars_per_input_tab =3D 8; >> + static bool tabify_output =3D false; >> +=C2=A0 >> + /* (-i) The output tab character. */ >> +-static char output_tab_char =3D '\t'; >> ++static char output_tab_char[MB_LEN_MAX] =3D "\t"; >> ++ >> ++/* (-i) The byte length of output tab character. */ >> ++static int output_tab_char_length =3D 1; >> +=C2=A0 >> + /* (-i) The width of the output tab. */ >> + static int chars_per_output_tab =3D 8; >> +@@ -636,7 +682,13 @@ static int line_number; >> + static bool numbered_lines =3D false; >> +=C2=A0 >> + /* (-n) Character which follows each line number. */ >> +-static char number_separator =3D '\t'; >> ++static char number_separator[MB_LEN_MAX] =3D "\t"; >> ++ >> ++/* (-n) The byte length of the character which follows each line=20 >> number. */ >> ++static int number_separator_length =3D 1; >> ++ >> ++/* (-n) The character width of the character which follows each line=20 >> number. >> */ >> ++static int number_separator_width =3D 0; >> +=C2=A0 >> + /* (-n) line counting starts with 1st line of input file (not with=20 >> 1st >> +=C2=A0=C2=A0=C2=A0=C2=A0line of 1st page printed). */ >> +@@ -689,6 +741,7 @@ static bool use_col_separator =3D false; >> +=C2=A0=C2=A0=C2=A0=C2=A0-a|COLUMN|-m is a 'space' and with the -J option = a 'tab'. */ >> + static char *col_sep_string =3D (char *) ""; >> + static int col_sep_length =3D 0; >> ++static int col_sep_width =3D 0; >> + static char *column_separator =3D (char *) " "; >> + static char *line_separator =3D (char *) "\t"; >> +=C2=A0 >> +@@ -839,6 +892,13 @@ separator_string (const char *optarg_S) >> +=C2=A0=C2=A0=C2=A0col_sep_length =3D (int) strlen (optarg_S); >> +=C2=A0=C2=A0=C2=A0col_sep_string =3D xmalloc (col_sep_length + 1); >> +=C2=A0=C2=A0=C2=A0strcpy (col_sep_string, optarg_S); >> ++ >> ++#if HAVE_MBRTOWC >> ++=C2=A0=C2=A0if (MB_CUR_MAX > 1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0col_sep_width =3D mbswidth (col_sep_string, 0); >> ++=C2=A0=C2=A0else >> ++#endif >> ++=C2=A0=C2=A0=C2=A0=C2=A0col_sep_width =3D col_sep_length; >> + } >> +=C2=A0 >> + int >> +@@ -863,6 +923,21 @@ main (int argc, char **argv) >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0atexit (close_stdout); >> +=C2=A0 >> ++/* Define which functions are used, the ones for single byte locale=20 >> or the >> ones >> ++=C2=A0=C2=A0=C2=A0for multibyte locale. */ >> ++#if HAVE_MBRTOWC >> ++=C2=A0=C2=A0if (MB_CUR_MAX > 1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0print_char =3D print_char_multi; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0char_to_clump =3D char_to_clump_mult= i; >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0else >> ++#endif >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0print_char =3D print_char_single; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0char_to_clump =3D char_to_clump_sing= le; >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> +=C2=A0=C2=A0=C2=A0n_files =3D 0; >> +=C2=A0=C2=A0=C2=A0file_names =3D (argc > 1 >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0? xmalloc ((argc - 1) * sizeof (char *)) >> +@@ -939,8 +1014,12 @@ main (int argc, char **argv) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case 'e': >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (opt= arg) >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= getoptarg (optarg, 'e', &input_tab_char, >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0&chars_per_= input_tab); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0int dummy_length, dummy_width; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0getoptarg (optarg, 'e', input_tab_char, &dummy_length, >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0&dummy_width, &chars_per_input_tab); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Coul= d check tab width > 0. */ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0untabif= y_input =3D true; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> +@@ -953,8 +1032,12 @@ main (int argc, char **argv) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case 'i': >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (opt= arg) >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= getoptarg (optarg, 'i', &output_tab_char, >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0&chars_per_= output_tab); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0int dummy_width; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0getoptarg (optarg, 'i', output_tab_char, >> &output_tab_char_length, >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0&dummy_width, &chars_per_output_tab); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Coul= d check tab width > 0. */ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0tabify_= output =3D true; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> +@@ -972,8 +1055,8 @@ main (int argc, char **argv) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case 'n': >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0numbere= d_lines =3D true; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (opt= arg) >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= getoptarg (optarg, 'n', &number_separator, >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0&chars_per_= number); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= getoptarg (optarg, 'n', number_separator, >> &number_separator_length, >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0&number_sep= arator_width, &chars_per_number); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case 'N': >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0skip_co= unt =3D false; >> +@@ -997,7 +1080,7 @@ main (int argc, char **argv) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0old_s = =3D false; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Rese= t an additional input of -s, -S dominates -s */ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0col_sep= _string =3D bad_cast (""); >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0col_sep_leng= th =3D 0; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0col_sep_leng= th =3D col_sep_width =3D 0; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0use_col= _separator =3D true; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (opt= arg) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0separator_string (optarg); >> +@@ -1152,10 +1235,45 @@ getoptnum (const char *n_str, int min, i >> +=C2=A0=C2=A0=C2=A0=C2=A0a number. */ >> +=C2=A0 >> + static void >> +-getoptarg (char *arg, char switch_char, char *character, int=20 >> *number) >> ++getoptarg (char *arg, char switch_char, char *character, int >> *character_length, >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0int *c= haracter_width, int *number) >> + { >> +=C2=A0=C2=A0=C2=A0if (!ISDIGIT (*arg)) >> +-=C2=A0=C2=A0=C2=A0=C2=A0*character =3D *arg++; >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++#ifdef HAVE_MBRTOWC >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (MB_CUR_MAX > 1)=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* for multibyte locale. */ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0wchar_t wc; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0size_t mblen= gth; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0int width; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mbstate_t st= ate =3D {'\0'}; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mblength =3D= mbrtowc (&wc, arg, strnlen(arg, MB_LEN_MAX),=20 >> &state); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (mblength= =3D=3D (size_t)-1 || mblength =3D=3D (size_t)-2) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0*character_length =3D 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0*character_width =3D 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0*character_length =3D (mblength < 1) ? 1 : mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0width =3D wcwidth (wc); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0*character_width =3D (width < 0) ? 0 : width; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0strncpy (cha= racter, arg, *character_length); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0arg +=3D *ch= aracter_length; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* for single byte locale. */ >> ++#endif >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*character = =3D *arg++; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*character_l= ength =3D 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*character_w= idth =3D 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> +=C2=A0=C2=A0=C2=A0if (*arg) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0long int tmp_long; >> +@@ -1177,6 +1295,11 @@ static void >> + init_parameters (int number_of_files) >> + { >> +=C2=A0=C2=A0=C2=A0int chars_used_by_number =3D 0; >> ++=C2=A0=C2=A0int mb_len =3D 1; >> ++#if HAVE_MBRTOWC >> ++=C2=A0=C2=A0if (MB_CUR_MAX > 1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0mb_len =3D MB_LEN_MAX; >> ++#endif >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0lines_per_body =3D lines_per_page - lines_per_header - = >> lines_per_footer; >> +=C2=A0=C2=A0=C2=A0if (lines_per_body <=3D 0) >> +@@ -1214,7 +1337,7 @@ init_parameters (int number_of_files) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0col_sep_string =3D column_separator; >> +=C2=A0 >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0col_sep_leng= th =3D 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0col_sep_leng= th =3D col_sep_width =3D 1; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0use_col= _separator =3D true; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* It's rather pointless to def= ine a TAB separator with column >> +@@ -1244,11 +1367,11 @@ init_parameters (int number_of_files) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0+ TAB_WIDTH (chars_per_input_tab,=20 >> chars_per_number);=C2=A0=C2=A0=C2=A0*/ >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Estimate chars_per_text with= out any margin and keep it=20 >> constant. */ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (number_separator =3D=3D '\t') >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (number_separator[0] =3D=3D '\t') >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0number_width =3D (c= hars_per_number >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0+ TAB_WIDTH (chars_per_default_tab, >> chars_per_number)); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0number_width =3D chars_p= er_number + 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0number_width =3D chars_p= er_number + number_separator_width; >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* The number is part of the co= lumn width unless we are >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0printing file= s in parallel. */ >> +@@ -1257,7 +1380,7 @@ init_parameters (int number_of_files) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0chars_per_column =3D (chars_per_line - chars_used_by_nu= mber >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0- (columns - 1) *= col_sep_length) / columns; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0- (columns - 1) *= col_sep_width) / columns; >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0if (chars_per_column < 1) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0error (EXIT_FAILURE, 0, _("page width too n= arrow")); >> +@@ -1275,7 +1398,7 @@ init_parameters (int number_of_files) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0We've to use 8 as the lower limit, if= we use=20 >> chars_per_default_tab =3D 8 >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0to expand a tab which is not an input= _tab-char. */ >> +=C2=A0=C2=A0=C2=A0free (clump_buff); >> +-=C2=A0=C2=A0clump_buff =3D xmalloc (MAX (8, chars_per_input_tab)); >> ++=C2=A0=C2=A0clump_buff =3D xmalloc (mb_len * MAX (8, chars_per_input_tab= )); >> + } >> +=C2=A0 >> + /* Open the necessary files, >> +@@ -1383,7 +1506,7 @@ init_funcs (void) >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0/* Enlarge p->start_position of first column to use the= same form=20 >> of >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0padding_not_printed with all columns.= */ >> +-=C2=A0=C2=A0h =3D h + col_sep_length; >> ++=C2=A0=C2=A0h =3D h + col_sep_width; >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0/* This loop takes care of all but the rightmost column= . */ >> +=C2=A0 >> +@@ -1417,7 +1540,7 @@ init_funcs (void) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0h =3D h_next= + col_sep_length; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0h =3D h_next= + col_sep_width; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0h_next = =3D h + chars_per_column; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +@@ -1708,9 +1831,9 @@ static void >> + align_column (COLUMN *p) >> + { >> +=C2=A0=C2=A0=C2=A0padding_not_printed =3D p->start_position; >> +-=C2=A0=C2=A0if (padding_not_printed - col_sep_length > 0) >> ++=C2=A0=C2=A0if (padding_not_printed - col_sep_width > 0) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0pad_across_to (padding_not_printed -= col_sep_length); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0pad_across_to (padding_not_printed -= col_sep_width); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0padding_not_printed =3D ANYWHER= E; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0 >> +@@ -1981,13 +2104,13 @@ store_char (char c) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* May be too generous. */ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0buff =3D X2REALLOC (buff, &buff= _allocated); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +-=C2=A0=C2=A0buff[buff_current++] =3D c; >> ++=C2=A0=C2=A0buff[buff_current++] =3D (unsigned char) c; >> + } >> +=C2=A0 >> + static void >> + add_line_number (COLUMN *p) >> + { >> +-=C2=A0=C2=A0int i; >> ++=C2=A0=C2=A0int i, j; >> +=C2=A0=C2=A0=C2=A0char *s; >> +=C2=A0=C2=A0=C2=A0int num_width; >> +=C2=A0 >> +@@ -2004,22 +2127,24 @@ add_line_number (COLUMN *p) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Tabification is assumed for = multiple columns, also for n- >> separators, >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0but 'default = n-separator =3D TAB' hasn't been given priority=20 >> over >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0equal column_= width also specified by POSIX. */ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (number_separator =3D=3D '\t') >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (number_separator[0] =3D=3D '\t') >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0i =3D n= umber_width - chars_per_number; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (= i-- > 0) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0(p->char_func) (' '); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0(p->char_func) (number_s= eparator); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0for (j =3D 0; j < number= _separator_length; j++) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0(p->char_fun= c) (number_separator[j]); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0else >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* To comply with POSIX, we avoid any expan= sion of default TAB >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0separator with a single c= olumn output. No column_width=20 >> requirement >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0has to be considered. */ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0(p->char_func) (number_separator); >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (number_separator =3D=3D '\t') >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0for (j =3D 0; j < number_separator_l= ength; j++) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0(p->char_func) (number_s= eparator[j]); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (number_separator[0] =3D=3D '\t') >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0output_position =3D= POS_AFTER_TAB (chars_per_output_tab, >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0output_position); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +@@ -2180,7 +2305,7 @@ print_white_space (void) >> +=C2=A0=C2=A0=C2=A0while (goal - h_old > 1 >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0&& (h_new =3D= POS_AFTER_TAB (chars_per_output_tab, h_old)) <=3D=20 >> goal) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0putchar (output_tab_char); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0fwrite (output_tab_char, sizeof(char= ), output_tab_char_length, >> stdout); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0h_old =3D h_new; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0while (++h_old <=3D goal) >> +@@ -2200,6 +2325,7 @@ print_sep_string (void) >> + { >> +=C2=A0=C2=A0=C2=A0char *s; >> +=C2=A0=C2=A0=C2=A0int l =3D col_sep_length; >> ++=C2=A0=C2=A0int not_space_flag; >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0s =3D col_sep_string; >> +=C2=A0 >> +@@ -2213,6 +2339,7 @@ print_sep_string (void) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0for (; separators_not_printed >= 0; --separators_not_printed) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0not_space_fl= ag =3D 0; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (= l-- > 0) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0{ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0/* 3 types of sep_strings: spaces only, spaces and=20 >> chars, >> +@@ -2226,12 +2353,15 @@ print_sep_string (void) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0else >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0not_space_flag =3D 1; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (spaces_not_printed > 0) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0print_white_space (); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0putchar (*s++); >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0++output_position; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (not_spac= e_flag) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= output_position +=3D col_sep_width; >> ++ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* sep_= string ends with some spaces */ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (spa= ces_not_printed > 0) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0print_white_space (); >> +@@ -2259,7 +2389,7 @@ print_clump (COLUMN *p, int n, char *clu >> +=C2=A0=C2=A0=C2=A0=C2=A0required number of tabs and spaces. */ >> +=C2=A0 >> + static void >> +-print_char (char c) >> ++print_char_single (char c) >> + { >> +=C2=A0=C2=A0=C2=A0if (tabify_output) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +@@ -2283,6 +2413,74 @@ print_char (char c) >> +=C2=A0=C2=A0=C2=A0putchar (c); >> + } >> +=C2=A0 >> ++#ifdef HAVE_MBRTOWC >> ++static void >> ++print_char_multi (char c) >> ++{ >> ++=C2=A0=C2=A0static size_t mbc_pos =3D 0; >> ++=C2=A0=C2=A0static char mbc[MB_LEN_MAX] =3D {'\0'}; >> ++=C2=A0=C2=A0static mbstate_t state =3D {'\0'}; >> ++=C2=A0=C2=A0mbstate_t state_bak; >> ++=C2=A0=C2=A0wchar_t wc; >> ++=C2=A0=C2=A0size_t mblength; >> ++=C2=A0=C2=A0int width; >> ++ >> ++=C2=A0=C2=A0if (tabify_output) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0state_bak =3D state; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mbc[mbc_pos++] =3D c; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mblength =3D mbrtowc (&wc, mbc, mbc_= pos, &state); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (mbc_pos > 0) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0switch (mble= ngth) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= case (size_t)-2: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0state =3D state_bak; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0return; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= case (size_t)-1: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0state =3D state_bak; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0++output_position; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0putchar (mbc[0]); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0memmove (mbc, mbc + 1, MB_CUR_MAX - 1); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0--mbc_pos; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0break; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= case 0: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0mblength =3D 1; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= default: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0if (wc =3D=3D L' ') >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0memmove (mbc, mbc + mblength, MB_CUR_MAX = -=20 >> mblength); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0--mbc_pos; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0++spaces_not_printed; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0else if (spaces_not_printed > 0) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0print_white_space (); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0/* Nonprintables are assumed to have width 0, except=20 >> L'\b'. */ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0if ((width =3D wcwidth (wc)) < 1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (wc =3D=3D L'\b') >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0--output_position; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0output_position +=3D width; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0fwrite (mbc, sizeof(char), mblength, stdout); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0memmove (mbc, mbc + mblength, MB_CUR_MAX - mblength); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0mbc_pos -=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return; >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0putchar (c); >> ++} >> ++#endif >> ++ >> + /* Skip to page PAGE before printing. >> +=C2=A0=C2=A0=C2=A0=C2=A0PAGE may be larger than total number of pages. */ >> +=C2=A0 >> +@@ -2462,9 +2660,9 @@ read_line (COLUMN *p) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0align_e= mpty_cols =3D false; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0 >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (padding_not_printed - col_sep_le= ngth > 0) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (padding_not_printed - col_sep_wi= dth > 0) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0pad_across_t= o (padding_not_printed - col_sep_length); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0pad_across_t= o (padding_not_printed - col_sep_width); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0padding= _not_printed =3D ANYWHERE; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0 >> +@@ -2534,7 +2732,7 @@ print_stored (COLUMN *p) >> +=C2=A0=C2=A0=C2=A0int i; >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0int line =3D p->current_line++; >> +-=C2=A0=C2=A0char *first =3D &buff[line_vector[line]]; >> ++=C2=A0=C2=A0unsigned char *first =3D &buff[line_vector[line]]; >> +=C2=A0=C2=A0=C2=A0/* FIXME >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0UMR: Uninitialized memory read: >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0* This is occurring while in: >> +@@ -2546,7 +2744,7 @@ print_stored (COLUMN *p) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0xmalloc=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0[xmalloc.c:94] >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0init_store_cols [pr.c:1648] >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*/ >> +-=C2=A0=C2=A0char *last =3D &buff[line_vector[line + 1]]; >> ++=C2=A0=C2=A0unsigned char *last =3D &buff[line_vector[line + 1]]; >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0pad_vertically =3D true; >> +=C2=A0 >> +@@ -2565,9 +2763,9 @@ print_stored (COLUMN *p) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0 >> +-=C2=A0=C2=A0if (padding_not_printed - col_sep_length > 0) >> ++=C2=A0=C2=A0if (padding_not_printed - col_sep_width > 0) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0pad_across_to (padding_not_printed -= col_sep_length); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0pad_across_to (padding_not_printed -= col_sep_width); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0padding_not_printed =3D ANYWHER= E; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0 >> +@@ -2580,8 +2778,8 @@ print_stored (COLUMN *p) >> +=C2=A0=C2=A0=C2=A0if (spaces_not_printed =3D=3D 0) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0output_position =3D p->start_po= sition + end_vector[line]; >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (p->start_position - col_sep_leng= th =3D=3D chars_per_margin) >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0output_position -=3D col= _sep_length; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (p->start_position - col_sep_widt= h =3D=3D chars_per_margin) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0output_position -=3D col= _sep_width; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0return true; >> +@@ -2600,7 +2798,7 @@ print_stored (COLUMN *p) >> +=C2=A0=C2=A0=C2=A0=C2=A0number of characters is 1.) */ >> +=C2=A0 >> + static int >> +-char_to_clump (char c) >> ++char_to_clump_single (char c) >> + { >> +=C2=A0=C2=A0=C2=A0unsigned char uc =3D c; >> +=C2=A0=C2=A0=C2=A0char *s =3D clump_buff; >> +@@ -2610,10 +2808,10 @@ char_to_clump (char c) >> +=C2=A0=C2=A0=C2=A0int chars; >> +=C2=A0=C2=A0=C2=A0int chars_per_c =3D 8; >> +=C2=A0 >> +-=C2=A0=C2=A0if (c =3D=3D input_tab_char) >> ++=C2=A0=C2=A0if (c =3D=3D input_tab_char[0]) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0chars_per_c =3D chars_per_input_tab; >> +=C2=A0 >> +-=C2=A0=C2=A0if (c =3D=3D input_tab_char || c =3D=3D '\t') >> ++=C2=A0=C2=A0if (c =3D=3D input_tab_char[0] || c =3D=3D '\t') >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0width =3D TAB_WIDTH (chars_per_= c, input_position); >> +=C2=A0 >> +@@ -2694,6 +2892,164 @@ char_to_clump (char c) >> +=C2=A0=C2=A0=C2=A0return chars; >> + } >> +=C2=A0 >> ++#ifdef HAVE_MBRTOWC >> ++static int >> ++char_to_clump_multi (char c) >> ++{ >> ++=C2=A0=C2=A0static size_t mbc_pos =3D 0; >> ++=C2=A0=C2=A0static char mbc[MB_LEN_MAX] =3D {'\0'}; >> ++=C2=A0=C2=A0static mbstate_t state =3D {'\0'}; >> ++=C2=A0=C2=A0mbstate_t state_bak; >> ++=C2=A0=C2=A0wchar_t wc; >> ++=C2=A0=C2=A0size_t mblength; >> ++=C2=A0=C2=A0int wc_width; >> ++=C2=A0=C2=A0register char *s =3D clump_buff; >> ++=C2=A0=C2=A0register int i, j; >> ++=C2=A0=C2=A0char esc_buff[4]; >> ++=C2=A0=C2=A0int width; >> ++=C2=A0=C2=A0int chars; >> ++=C2=A0=C2=A0int chars_per_c =3D 8; >> ++ >> ++=C2=A0=C2=A0state_bak =3D state; >> ++=C2=A0=C2=A0mbc[mbc_pos++] =3D c; >> ++=C2=A0=C2=A0mblength =3D mbrtowc (&wc, mbc, mbc_pos, &state); >> ++ >> ++=C2=A0=C2=A0width =3D 0; >> ++=C2=A0=C2=A0chars =3D 0; >> ++=C2=A0=C2=A0while (mbc_pos > 0) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0switch (mblength) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case (size_t)-2: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0state =3D st= ate_bak; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return 0; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case (size_t)-1: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0state =3D st= ate_bak; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mblength =3D= 1; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (use_esc_= sequence || use_cntrl_prefix) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0width =3D +4; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0chars =3D +4; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0*s++ =3D '\\'; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0sprintf (esc_buff, "%03o", (unsigned char) mbc[0]); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0for (i =3D 0; i <=3D 2; ++i) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0*s++ =3D (int) esc_buff[i]; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0width +=3D 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0chars +=3D 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0*s++ =3D mbc[0]; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case 0: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mblength =3D= 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0/* Fall through */ >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0default: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (memcmp (= mbc, input_tab_char, mblength) =3D=3D 0) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= chars_per_c =3D chars_per_input_tab; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (memcmp (= mbc, input_tab_char, mblength) =3D=3D 0 || c =3D=3D=20 >> '\t') >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0int=C2=A0=C2=A0width_inc; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0width_inc =3D TAB_WIDTH (chars_per_c, input_position); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0width +=3D width_inc; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0if (untabify_input) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0for (i =3D width_inc; i; --i) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*s++ =3D ' '; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0chars +=3D width_inc; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0for (i =3D 0; i <=C2=A0=C2=A0mblength; i+= +) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*s++ =3D mbc[i]; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0chars +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else if ((wc= _width =3D wcwidth (wc)) < 1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0if (use_esc_sequence) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0for (i =3D 0; i < mblength; i++) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0width +=3D 4; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0chars +=3D 4; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*s++ =3D '\\'; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0sprintf (esc_buff= , "%03o", (unsigned char)=20 >> mbc[i]); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0for (j =3D 0; j <= =3D 2; ++j) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*s++ = =3D (int) esc_buff[j]; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0else if (use_cntrl_prefix) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (wc < 0200) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0width +=3D 2; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0chars +=3D 2; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*s++ =3D '^'; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*s++ =3D wc ^ 010= 0; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0for (i =3D 0; i <= mblength; i++) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0width +=3D 4; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0chars +=3D 4; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0*s++ =3D '\\'; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0sprintf (esc_buff, "%03o", (unsigned char) >> mbc[i]); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0for (j =3D 0; j <=3D 2; ++j) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0*s++ =3D (int) esc_buff[j]; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0else if (wc =3D=3D L'\b') >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0width +=3D -1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0chars +=3D 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*s++ =3D c; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0width +=3D 0; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0chars +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0for (i =3D 0; i < mblength; i++) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*s++ =3D mbc[i]; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0width +=3D wc_width; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0chars +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0for (i =3D 0; i < mblength; i++) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0*s++ =3D mbc[i]; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0memmove (mbc, mbc + mblength, MB_CUR= _MAX - mblength); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mbc_pos -=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0/* Too many backspaces must put us in position 0 -- never=20 >> negative. */ >> ++=C2=A0=C2=A0if (width < 0 && input_position =3D=3D 0) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0chars =3D 0; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0input_position =3D 0; >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0else if (width < 0 && input_position <=3D -width) >> ++=C2=A0=C2=A0=C2=A0=C2=A0input_position =3D 0; >> ++=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0input_position +=3D width; >> ++ >> ++=C2=A0=C2=A0return chars; >> ++} >> ++#endif >> ++ >> + /* We've just printed some files and need to clean up things before >> +=C2=A0=C2=A0=C2=A0=C2=A0looking for more options and printing the next ba= tch of files. >> +=C2=A0 >> +diff -Naurp coreutils-8.25-orig/src/sort.c coreutils-8.25/src/sort.c >> +--- coreutils-8.25-orig/src/sort.c 2016-01-16 13:09:33.000000000=20 >> -0600 >> ++++ coreutils-8.25/src/sort.c 2016-02-08 19:07:10.310944648 -0600 >> +@@ -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 "error.h" >> +@@ -163,14 +171,39 @@ static int decimal_point; >> + /* Thousands separator; if -1, then there isn't one.=C2=A0=C2=A0*/ >> + static int thousands_sep; >> +=C2=A0 >> ++/* True if -f is specified.=C2=A0=C2=A0*/ >> ++static bool folding; >> ++ >> + /* Nonzero if the corresponding locales are hard.=C2=A0=C2=A0*/ >> + static bool hard_LC_COLLATE; >> +-#if HAVE_NL_LANGINFO >> ++#if HAVE_LANGINFO_CODESET >> + static bool hard_LC_TIME; >> + #endif >> +=C2=A0 >> + #define NONZERO(x) ((x) !=3D 0) >> +=C2=A0 >> ++/* get a multibyte character's byte length. */ >> ++#define GET_BYTELEN_OF_CHAR(LIM, PTR, MBLENGTH, >> STATE)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0\ >> ++=C2=A0=C2=A0do=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 >> \ >> ++=C2=A0=C2=A0=C2=A0=C2=A0{=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 >> =C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0wchar_t=20 >> wc;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mbstate_t=20 >> state_bak;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0state_bak =3D=20 >> STATE;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mblength =3D mbrtowc (&wc, PTR, LIM = - PTR, >> &STATE);=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0switch >> (MBLENGTH)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case=20 >> (size_t)-1:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case=20 >> (size_t)-2:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0STATE =3D >> state_bak;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0/* Fall through.=20 >> */=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case >> 0:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0MBLENGTH =3D >> 1;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0}=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 >> =C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0}=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 >> =C2=A0\ >> ++=C2=A0=C2=A0while (0) >> ++ >> + /* The kind of blanks for '-b' to skip in various options. */ >> + enum blanktype { bl_start, bl_end, bl_both }; >> +=C2=A0 >> +@@ -344,13 +377,11 @@ static bool reverse; >> +=C2=A0=C2=A0=C2=A0=C2=A0they were read if all keys compare equal.=C2=A0= =C2=A0*/ >> + static bool stable; >> +=C2=A0 >> +-/* If TAB has this value, blanks separate fields.=C2=A0=C2=A0*/ >> +-enum { TAB_DEFAULT =3D CHAR_MAX + 1 }; >> +- >> +-/* Tab character separating fields.=C2=A0=C2=A0If TAB_DEFAULT, then fiel= ds are >> ++/* Tab character separating fields.=C2=A0=C2=A0If tab_length is 0, then = fields=20 >> are >> +=C2=A0=C2=A0=C2=A0=C2=A0separated by the empty string between a non-blank= character and a=20 >> blank >> +=C2=A0=C2=A0=C2=A0=C2=A0character. */ >> +-static int tab =3D TAB_DEFAULT; >> ++static char tab[MB_LEN_MAX + 1]; >> ++static size_t tab_length =3D 0; >> +=C2=A0 >> + /* Flag to remove consecutive duplicate lines from the output. >> +=C2=A0=C2=A0=C2=A0=C2=A0Only the last of a sequence of equal lines will b= e output. */ >> +@@ -810,6 +841,46 @@ reap_all (void) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0reap (-1); >> + } >> +=C2=A0 >> ++/* 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. >> ++=C2=A0=C2=A0=C2=A0Set LENGTH the byte length of investigated multibyte c= haracter.=20 >> */ >> ++#if HAVE_MBRTOWC >> ++static int >> ++ismbblank (const char *str, size_t len, size_t *length) >> ++{ >> ++=C2=A0=C2=A0size_t mblength; >> ++=C2=A0=C2=A0wchar_t wc; >> ++=C2=A0=C2=A0mbstate_t state; >> ++ >> ++=C2=A0=C2=A0memset (&state, '\0', sizeof(mbstate_t)); >> ++=C2=A0=C2=A0mblength =3D mbrtowc (&wc, str, len, &state); >> ++ >> ++=C2=A0=C2=A0if (mblength =3D=3D (size_t)-1 || mblength =3D=3D (size_t)-2) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*length =3D 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return 0; >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0*length =3D (mblength < 1) ? 1 : mblength; >> ++=C2=A0=C2=A0return iswblank (wc) || wc =3D=3D '\n'; >> ++} >> ++#endif >> ++ >> + /* Clean up any remaining temporary files.=C2=A0=C2=A0*/ >> +=C2=A0 >> + static void >> +@@ -1254,7 +1325,7 @@ zaptemp (char const *name) >> +=C2=A0=C2=A0=C2=A0free (node); >> + } >> +=C2=A0 >> +-#if HAVE_NL_LANGINFO >> ++#if HAVE_LANGINFO_CODESET >> +=C2=A0 >> + static int >> + struct_month_cmp (void const *m1, void const *m2) >> +@@ -1269,7 +1340,7 @@ struct_month_cmp (void const *m1, void c >> + /* Initialize the character class tables. */ >> +=C2=A0 >> + static void >> +-inittables (void) >> ++inittables_uni (void) >> + { >> +=C2=A0=C2=A0=C2=A0size_t i; >> +=C2=A0 >> +@@ -1281,7 +1352,7 @@ inittables (void) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0fold_toupper[i] =3D toupper (i); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0 >> +-#if HAVE_NL_LANGINFO >> ++#if HAVE_LANGINFO_CODESET >> +=C2=A0=C2=A0=C2=A0/* If we're not in the "C" locale, read different names= for=20 >> months.=C2=A0=C2=A0*/ >> +=C2=A0=C2=A0=C2=A0if (hard_LC_TIME) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +@@ -1363,6 +1434,84 @@ specify_nmerge (int oi, char c, char con >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0xstrtol_fatal (e, oi, c, long_options, s); >> + } >> +=C2=A0 >> ++#if HAVE_MBRTOWC >> ++static void >> ++inittables_mb (void) >> ++{ >> ++=C2=A0=C2=A0int i, j, k, l; >> ++=C2=A0=C2=A0char *name, *s, *lc_time, *lc_ctype; >> ++=C2=A0=C2=A0size_t s_len, mblength; >> ++=C2=A0=C2=A0char mbc[MB_LEN_MAX]; >> ++=C2=A0=C2=A0wchar_t wc, pwc; >> ++=C2=A0=C2=A0mbstate_t state_mb, state_wc; >> ++ >> ++=C2=A0=C2=A0lc_time =3D setlocale (LC_TIME, ""); >> ++=C2=A0=C2=A0if (lc_time) >> ++=C2=A0=C2=A0=C2=A0=C2=A0lc_time =3D xstrdup (lc_time); >> ++ >> ++=C2=A0=C2=A0lc_ctype =3D setlocale (LC_CTYPE, ""); >> ++=C2=A0=C2=A0if (lc_ctype) >> ++=C2=A0=C2=A0=C2=A0=C2=A0lc_ctype =3D xstrdup (lc_ctype); >> ++ >> ++=C2=A0=C2=A0if (lc_time && lc_ctype) >> ++=C2=A0=C2=A0=C2=A0=C2=A0/* temporarily set LC_CTYPE to match LC_TIME, so= that we can=20 >> convert >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0* the names of months to upper case */ >> ++=C2=A0=C2=A0=C2=A0=C2=A0setlocale (LC_CTYPE, lc_time); >> ++ >> ++=C2=A0=C2=A0for (i =3D 0; i < MONTHS_PER_YEAR; i++) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0s =3D (char *) nl_langinfo (ABMON_1 = + i); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0s_len =3D strlen (s); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0monthtab[i].name =3D name =3D (char = *) xmalloc (s_len + 1); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0monthtab[i].val =3D i + 1; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0memset (&state_mb, '\0', sizeof (mbs= tate_t)); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0memset (&state_wc, '\0', sizeof (mbs= tate_t)); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0for (j =3D 0; j < s_len;) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (!ismbbla= nk (s + j, s_len - j, &mblength)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= break; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0j +=3D mblen= gth; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0for (k =3D 0; j < s_len;) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mblength =3D= mbrtowc (&wc, (s + j), (s_len - j), &state_mb); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0assert (mble= ngth !=3D (size_t)-1 && mblength !=3D (size_t)-2); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (mblength= =3D=3D 0) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= break; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0pwc =3D towu= pper (wc); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (pwc =3D= =3D wc) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0memcpy (mbc, s + j, mblength); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0j +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0j +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0mblength =3D wcrtomb (mbc, pwc, &state_wc); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0assert (mblength !=3D (size_t)0 && mblength !=3D=20 >> (size_t)-1); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0for (l =3D 0= ; l < mblength; l++) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= name[k++] =3D mbc[l]; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0name[k] =3D '\0'; >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0qsort ((void *) monthtab, MONTHS_PER_YEAR, >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0sizeof (struct month), struct_month_= cmp); >> ++ >> ++=C2=A0=C2=A0if (lc_time && lc_ctype) >> ++=C2=A0=C2=A0=C2=A0=C2=A0/* restore the original locales */ >> ++=C2=A0=C2=A0=C2=A0=C2=A0setlocale (LC_CTYPE, lc_ctype); >> ++ >> ++=C2=A0=C2=A0free (lc_ctype); >> ++=C2=A0=C2=A0free (lc_time); >> ++} >> ++#endif >> ++ >> + /* Specify the amount of main memory to use when sorting.=C2=A0=C2=A0*/ >> + static void >> + specify_sort_size (int oi, char c, char const *s) >> +@@ -1596,7 +1745,7 @@ buffer_linelim (struct buffer const *buf >> +=C2=A0=C2=A0=C2=A0=C2=A0by KEY in LINE. */ >> +=C2=A0 >> + static char * >> +-begfield (struct line const *line, struct keyfield const *key) >> ++begfield_uni (const struct line *line, const struct keyfield *key) >> + { >> +=C2=A0=C2=A0=C2=A0char *ptr =3D line->text, *lim =3D ptr + line->length -= 1; >> +=C2=A0=C2=A0=C2=A0size_t sword =3D key->sword; >> +@@ -1605,10 +1754,10 @@ begfield (struct line const *line, struc >> +=C2=A0=C2=A0=C2=A0/* The leading field separator itself is included in a = field when=20 >> -t >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0is absent.=C2=A0=C2=A0*/ >> +=C2=A0 >> +-=C2=A0=C2=A0if (tab !=3D TAB_DEFAULT) >> ++=C2=A0=C2=A0if (tab_length) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (ptr < lim && sword--) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (ptr < lim && *ptr= !=3D tab) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (ptr < lim && *ptr= !=3D tab[0]) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0++ptr; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (ptr < lim) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0++ptr; >> +@@ -1634,11 +1783,70 @@ begfield (struct line const *line, struc >> +=C2=A0=C2=A0=C2=A0return ptr; >> + } >> +=C2=A0 >> ++#if HAVE_MBRTOWC >> ++static char * >> ++begfield_mb (const struct line *line, const struct keyfield *key) >> ++{ >> ++=C2=A0=C2=A0int i; >> ++=C2=A0=C2=A0char *ptr =3D line->text, *lim =3D ptr + line->length - 1; >> ++=C2=A0=C2=A0size_t sword =3D key->sword; >> ++=C2=A0=C2=A0size_t schar =3D key->schar; >> ++=C2=A0=C2=A0size_t mblength; >> ++=C2=A0=C2=A0mbstate_t state; >> ++ >> ++=C2=A0=C2=A0memset (&state, '\0', sizeof(mbstate_t)); >> ++ >> ++=C2=A0=C2=A0if (tab_length) >> ++=C2=A0=C2=A0=C2=A0=C2=A0while (ptr < lim && sword--) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (ptr < lim && memc= mp (ptr, tab, tab_length) !=3D 0) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= GET_BYTELEN_OF_CHAR (lim, ptr, mblength, state); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= ptr +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (ptr < lim) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= GET_BYTELEN_OF_CHAR (lim, ptr, mblength, state); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= ptr +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0while (ptr < lim && sword--) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (ptr < lim && ismb= blank (ptr, lim - ptr, &mblength)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0ptr +=3D mbl= ength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (ptr < lim) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= GET_BYTELEN_OF_CHAR (lim, ptr, mblength, state); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= ptr +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (ptr < lim && !ism= bblank (ptr, lim - ptr, &mblength)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0ptr +=3D mbl= ength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0if (key->skipsblanks) >> ++=C2=A0=C2=A0=C2=A0=C2=A0while (ptr < lim && ismbblank (ptr, lim - ptr, &= mblength)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0ptr +=3D mblength; >> ++ >> ++=C2=A0=C2=A0for (i =3D 0; i < schar; i++) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0GET_BYTELEN_OF_CHAR (lim, ptr, mblen= gth, state); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (ptr + mblength > lim) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0ptr +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0return ptr; >> ++} >> ++#endif >> ++ >> + /* Return the limit of (a pointer to the first character after) the=20 >> field >> +=C2=A0=C2=A0=C2=A0=C2=A0in LINE specified by KEY. */ >> +=C2=A0 >> + static char * >> +-limfield (struct line const *line, struct keyfield const *key) >> ++limfield_uni (const struct line *line, const struct keyfield *key) >> + { >> +=C2=A0=C2=A0=C2=A0char *ptr =3D line->text, *lim =3D ptr + line->length -= 1; >> +=C2=A0=C2=A0=C2=A0size_t eword =3D key->eword, echar =3D key->echar; >> +@@ -1653,10 +1861,10 @@ limfield (struct line const *line, struc >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0'beginning' is the first character fo= llowing the delimiting=20 >> TAB. >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0Otherwise, leave PTR pointing at the = first 'blank' character=20 >> after >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0the preceding field.=C2=A0=C2=A0*/ >> +-=C2=A0=C2=A0if (tab !=3D TAB_DEFAULT) >> ++=C2=A0=C2=A0if (tab_length) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (ptr < lim && eword--) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (ptr < lim && *ptr= !=3D tab) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (ptr < lim && *ptr= !=3D tab[0]) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0++ptr; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (ptr < lim && (e= word || echar)) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0++ptr; >> +@@ -1702,10 +1910,10 @@ limfield (struct line const *line, struc >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*/ >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0/* Make LIM point to the end of (one byte past) the cur= rent=20 >> field.=C2=A0=C2=A0*/ >> +-=C2=A0=C2=A0if (tab !=3D TAB_DEFAULT) >> ++=C2=A0=C2=A0if (tab_length) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0char *newlim; >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0newlim =3D memchr (ptr, tab, lim - p= tr); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0newlim =3D memchr (ptr, tab[0], lim = - ptr); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (newlim) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0lim =3D newlim; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +@@ -1736,6 +1944,130 @@ limfield (struct line const *line, struc >> +=C2=A0=C2=A0=C2=A0return ptr; >> + } >> +=C2=A0 >> ++#if HAVE_MBRTOWC >> ++static char * >> ++limfield_mb (const struct line *line, const struct keyfield *key) >> ++{ >> ++=C2=A0=C2=A0char *ptr =3D line->text, *lim =3D ptr + line->length - 1; >> ++=C2=A0=C2=A0size_t eword =3D key->eword, echar =3D key->echar; >> ++=C2=A0=C2=A0int i; >> ++=C2=A0=C2=A0size_t mblength; >> ++=C2=A0=C2=A0mbstate_t state; >> ++ >> ++=C2=A0=C2=A0if (echar =3D=3D 0) >> ++=C2=A0=C2=A0=C2=A0=C2=A0eword++; /* skip all of end field. */ >> ++ >> ++=C2=A0=C2=A0memset (&state, '\0', sizeof(mbstate_t)); >> ++ >> ++=C2=A0=C2=A0if (tab_length) >> ++=C2=A0=C2=A0=C2=A0=C2=A0while (ptr < lim && eword--) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (ptr < lim && memc= mp (ptr, tab, tab_length) !=3D 0) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= GET_BYTELEN_OF_CHAR (lim, ptr, mblength, state); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= ptr +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (ptr < lim && (eword = | echar)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= GET_BYTELEN_OF_CHAR (lim, ptr, mblength, state); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= ptr +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0while (ptr < lim && eword--) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (ptr < lim && ismb= blank (ptr, lim - ptr, &mblength)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0ptr +=3D mbl= ength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (ptr < lim) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= GET_BYTELEN_OF_CHAR (lim, ptr, mblength, state); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= ptr +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (ptr < lim && !ism= bblank (ptr, lim - ptr, &mblength)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0ptr +=3D mbl= ength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++ >> ++# ifdef POSIX_UNSPECIFIED >> ++=C2=A0=C2=A0/* Make LIM point to the end of (one byte past) the current = >> field.=C2=A0=C2=A0*/ >> ++=C2=A0=C2=A0if (tab_length) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0char *newlim, *p; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0newlim =3D NULL; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0for (p =3D ptr; p < lim;) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (memcmp (= p, tab, tab_length) =3D=3D 0) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0newlim =3D p; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0break; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0GET_BYTELEN_= OF_CHAR (lim, ptr, mblength, state); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0p +=3D mblen= gth; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0char *newlim; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0newlim =3D ptr; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (newlim < lim && ismbblank (ne= wlim, lim - newlim,=20 >> &mblength)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0newlim +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (ptr < lim) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0GET_BYTELEN_= OF_CHAR (lim, ptr, mblength, state); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0ptr +=3D mbl= ength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (newlim < lim && !ismbblank (n= ewlim, lim - newlim,=20 >> &mblength)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0newlim +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0lim =3D newlim; >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++# endif >> ++ >> ++=C2=A0=C2=A0if (echar !=3D 0) >> ++=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0/* If we're skipping leading blanks, don't start= counting=20 >> characters >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0until= after skipping past any leading blanks.=C2=A0=C2=A0*/ >> ++=C2=A0=C2=A0=C2=A0=C2=A0if (key->skipeblanks) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (ptr < lim && ismbblank (ptr, = lim - ptr, &mblength)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0ptr +=3D mblength; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0memset (&state, '\0', sizeof(mbstate_t)); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0/* Advance PTR by ECHAR (if possible), but no fu= rther than=20 >> LIM.=C2=A0=C2=A0*/ >> ++=C2=A0=C2=A0=C2=A0=C2=A0for (i =3D 0; i < echar; i++) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0GET_BYTELEN_OF_CHAR (lim= , ptr, mblength, state); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (ptr + mblength > lim) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0ptr +=3D mbl= ength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0return ptr; >> ++} >> ++#endif >> ++ >> ++static void >> ++skipblanks_uni (char **ptr, char *lim) >> ++{ >> ++=C2=A0=C2=A0while (*ptr < lim && blanks[to_uchar (**ptr)]) >> ++=C2=A0=C2=A0=C2=A0=C2=A0++(*ptr); >> ++} >> ++ >> ++#if HAVE_MBRTOWC >> ++static void >> ++skipblanks_mb (char **ptr, char *lim) >> ++{ >> ++=C2=A0=C2=A0size_t mblength; >> ++=C2=A0=C2=A0while (*ptr < lim && ismbblank (*ptr, lim - *ptr, &mblength)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0(*ptr) +=3D mblength; >> ++} >> ++#endif >> ++ >> + /* Fill BUF reading from FP, moving buf->left bytes from the end >> +=C2=A0=C2=A0=C2=A0=C2=A0of buf->buf to the beginning first.=C2=A0=C2=A0If= EOF is reached and the >> +=C2=A0=C2=A0=C2=A0=C2=A0file wasn't terminated by a newline, supply one.= =C2=A0=C2=A0Set up BUF's=20 >> line >> +@@ -1822,8 +2154,22 @@ fillbuf (struct buffer *buf, FILE *fp, c >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (key->sk= ipsblanks) >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while= (blanks[to_uchar (*line_start)]) >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0line_start++; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++#if HAVE_MBRTOWC >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0if (MB_CUR_MAX > 1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0size_t mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (line_start < line->keylim && >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0is= mbblank (line_start, >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0line->keyli= m -=20 >> line_start, >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0&mblength)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0line_start +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0else >> ++#endif >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0while (blanks[to_uchar (*line_start)]) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0line_start++; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0line->keybe= g =3D line_start; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +@@ -1944,7 +2290,7 @@ human_numcompare (char const *a, char co >> +=C2=A0=C2=A0=C2=A0=C2=A0hideously fast. */ >> +=C2=A0 >> + static int >> +-numcompare (char const *a, char const *b) >> ++numcompare_uni (const char *a, const char *b) >> + { >> +=C2=A0=C2=A0=C2=A0while (blanks[to_uchar (*a)]) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0a++; >> +@@ -1954,6 +2300,25 @@ numcompare (char const *a, char const *b >> +=C2=A0=C2=A0=C2=A0return strnumcmp (a, b, decimal_point, thousands_sep); >> + } >> +=C2=A0 >> ++#if HAVE_MBRTOWC >> ++static int >> ++numcompare_mb (const char *a, const char *b) >> ++{ >> ++=C2=A0=C2=A0size_t mblength, len; >> ++=C2=A0=C2=A0len =3D strlen (a); /* okay for UTF-8 */ >> ++=C2=A0=C2=A0while (*a && ismbblank (a, len > MB_CUR_MAX ? MB_CUR_MAX : l= en, >> &mblength)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0a +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0len -=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0len =3D strlen (b); /* okay for UTF-8 */ >> ++=C2=A0=C2=A0while (*b && ismbblank (b, len > MB_CUR_MAX ? MB_CUR_MAX : l= en, >> &mblength)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0b +=3D mblength; >> ++ >> ++=C2=A0=C2=A0return strnumcmp (a, b, decimal_point, thousands_sep); >> ++} >> ++#endif /* HAV_EMBRTOWC */ >> ++ >> + /* Work around a problem whereby the long double value returned by=20 >> glibc's >> +=C2=A0=C2=A0=C2=A0=C2=A0strtold ("NaN", ...) contains uninitialized bits:= clear all bytes=20 >> of >> +=C2=A0=C2=A0=C2=A0=C2=A0A and B before calling strtold.=C2=A0=C2=A0FIXME:= remove this function once >> +@@ -2004,7 +2369,7 @@ general_numcompare (char const *sa, char >> +=C2=A0=C2=A0=C2=A0=C2=A0Return 0 if the name in S is not recognized.=C2= =A0=C2=A0*/ >> +=C2=A0 >> + static int >> +-getmonth (char const *month, char **ea) >> ++getmonth_uni (char const *month, size_t len, char **ea) >> + { >> +=C2=A0=C2=A0=C2=A0size_t lo =3D 0; >> +=C2=A0=C2=A0=C2=A0size_t hi =3D MONTHS_PER_YEAR; >> +@@ -2280,15 +2645,14 @@ debug_key (struct line const *line, stru >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0char sa= ved =3D *lim; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*lim = =3D '\0'; >> +=C2=A0 >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (blank= s[to_uchar (*beg)]) >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= beg++; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0skipblanks (= &beg, lim); >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0char *t= ighter_lim =3D beg; >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (lim= < beg) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0tighter_lim =3D lim; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else if= (key->month) >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= getmonth (beg, &tighter_lim); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= getmonth (beg, lim-beg, &tighter_lim); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else if= (key->general_numeric) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0ignore_value (strtold (beg, &tighter_lim)); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else if= (key->numeric || key->human_numeric) >> +@@ -2432,7 +2796,7 @@ key_warnings (struct keyfield const *gke >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0bool maybe_space_aligned =3D !h= ard_LC_COLLATE &&=20 >> default_key_compare >> (key) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0&& !(key->schar || k= ey->echar); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0bool line_offset =3D key->eword= =3D=3D 0 && key->echar !=3D 0; /* >> -k1.x,1.y=C2=A0=C2=A0*/ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (!gkey_only && tab =3D=3D TAB_DEF= AULT && !line_offset >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (!gkey_only && !tab_length && !li= ne_offset >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0&& ((!k= ey->skipsblanks && !(implicit_skip ||=20 >> maybe_space_aligned)) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0|| (!key->skipsblanks && key->schar) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0|| (!key->skipeblanks && key->echar))) >> +@@ -2490,11 +2854,87 @@ key_warnings (struct keyfield const *gke >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0error (0, 0, _("option '-r' only applies to= last-resort=20 >> comparison")); >> + } >> +=C2=A0 >> ++#if HAVE_MBRTOWC >> ++static int >> ++getmonth_mb (const char *s, size_t len, char **ea) >> ++{ >> ++=C2=A0=C2=A0char *month; >> ++=C2=A0=C2=A0register size_t i; >> ++=C2=A0=C2=A0register int lo =3D 0, hi =3D MONTHS_PER_YEAR, result; >> ++=C2=A0=C2=A0char *tmp; >> ++=C2=A0=C2=A0size_t wclength, mblength; >> ++=C2=A0=C2=A0const char *pp; >> ++=C2=A0=C2=A0const wchar_t *wpp; >> ++=C2=A0=C2=A0wchar_t *month_wcs; >> ++=C2=A0=C2=A0mbstate_t state; >> ++ >> ++=C2=A0=C2=A0while (len > 0 && ismbblank (s, len, &mblength)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0s +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0len -=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0if (len =3D=3D 0) >> ++=C2=A0=C2=A0=C2=A0=C2=A0return 0; >> ++ >> ++=C2=A0=C2=A0if (SIZE_MAX - len < 1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0xalloc_die (); >> ++ >> ++=C2=A0=C2=A0month =3D (char *) xnmalloc (len + 1, MB_CUR_MAX); >> ++ >> ++=C2=A0=C2=A0pp =3D tmp =3D (char *) xnmalloc (len + 1, MB_CUR_MAX); >> ++=C2=A0=C2=A0memcpy (tmp, s, len); >> ++=C2=A0=C2=A0tmp[len] =3D '\0'; >> ++=C2=A0=C2=A0wpp =3D month_wcs =3D (wchar_t *) xnmalloc (len + 1, sizeof = >> (wchar_t)); >> ++=C2=A0=C2=A0memset (&state, '\0', sizeof (mbstate_t)); >> ++ >> ++=C2=A0=C2=A0wclength =3D mbsrtowcs (month_wcs, &pp, len + 1, &state); >> ++=C2=A0=C2=A0if (wclength =3D=3D (size_t)-1 || pp !=3D NULL) >> ++=C2=A0=C2=A0=C2=A0=C2=A0error (SORT_FAILURE, 0, _("Invalid multibyte inp= ut %s."),=20 >> quote(s)); >> ++ >> ++=C2=A0=C2=A0for (i =3D 0; i < wclength; i++) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0month_wcs[i] =3D towupper(month_wcs[= i]); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (iswblank (month_wcs[i])) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0month_wcs[i]= =3D L'\0'; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0mblength =3D wcsrtombs (month, &wpp, (len + 1) * MB_CUR_MAX,= =20 >> &state); >> ++=C2=A0=C2=A0assert (mblength !=3D (-1) && wpp =3D=3D NULL); >> ++ >> ++=C2=A0=C2=A0do >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0int ix =3D (lo + hi) / 2; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (strncmp (month, monthtab[ix].nam= e, strlen=20 >> (monthtab[ix].name)) < >> 0) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0hi =3D ix; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0lo =3D ix; >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0while (hi - lo > 1); >> ++ >> ++=C2=A0=C2=A0result =3D (!strncmp (month, monthtab[lo].name, strlen=20 >> (monthtab[lo].name)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0? monthtab[lo].val : 0); >> ++ >> ++=C2=A0=C2=A0if (ea && result) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*ea =3D (char*) s + strlen (monthtab[lo].n= ame); >> ++ >> ++=C2=A0=C2=A0free (month); >> ++=C2=A0=C2=A0free (tmp); >> ++=C2=A0=C2=A0free (month_wcs); >> ++ >> ++=C2=A0=C2=A0return result; >> ++} >> ++#endif >> ++ >> + /* Compare two lines A and B trying every key in sequence until=20 >> there >> +=C2=A0=C2=A0=C2=A0=C2=A0are no more keys or a difference is found. */ >> +=C2=A0 >> + static int >> +-keycompare (struct line const *a, struct line const *b) >> ++keycompare_uni (const struct line *a, const struct line *b) >> + { >> +=C2=A0=C2=A0=C2=A0struct keyfield *key =3D keylist; >> +=C2=A0 >> +@@ -2579,7 +3019,7 @@ keycompare (struct line const *a, struct >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else if= (key->human_numeric) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0diff =3D human_numcompare (ta, tb); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else if= (key->month) >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= diff =3D getmonth (ta, NULL) - getmonth (tb, NULL); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= diff =3D getmonth (ta, tlena, NULL) - getmonth (tb, tlenb,=20 >> NULL); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else if= (key->random) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0diff =3D compare_random (ta, tlena, tb, tlenb); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else if= (key->version) >> +@@ -2695,6 +3135,211 @@ keycompare (struct line const *a, struct >> +=C2=A0=C2=A0=C2=A0return key->reverse ? -diff : diff; >> + } >> +=C2=A0 >> ++#if HAVE_MBRTOWC >> ++static int >> ++keycompare_mb (const struct line *a, const struct line *b) >> ++{ >> ++=C2=A0=C2=A0struct keyfield *key =3D keylist; >> ++ >> ++=C2=A0=C2=A0/* For the first iteration only, the key positions have been >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0precomputed for us. */ >> ++=C2=A0=C2=A0char *texta =3D a->keybeg; >> ++=C2=A0=C2=A0char *textb =3D b->keybeg; >> ++=C2=A0=C2=A0char *lima =3D a->keylim; >> ++=C2=A0=C2=A0char *limb =3D b->keylim; >> ++ >> ++=C2=A0=C2=A0size_t mblength_a, mblength_b; >> ++=C2=A0=C2=A0wchar_t wc_a, wc_b; >> ++=C2=A0=C2=A0mbstate_t state_a, state_b; >> ++ >> ++=C2=A0=C2=A0int diff =3D 0; >> ++ >> ++=C2=A0=C2=A0memset (&state_a, '\0', sizeof(mbstate_t)); >> ++=C2=A0=C2=A0memset (&state_b, '\0', sizeof(mbstate_t)); >> ++=C2=A0=C2=A0/* Ignore keys with start after end.=C2=A0=C2=A0*/ >> ++=C2=A0=C2=A0if (a->keybeg - a->keylim > 0) >> ++=C2=A0=C2=A0=C2=A0=C2=A0return 0; >> ++ >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0/* Ignore and/or translate chars before comparing.=C2=A0=C2=A0*/ >> ++# define IGNORE_CHARS(NEW_LEN, LEN, TEXT, COPY, WC, MBLENGTH, >> STATE)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0do=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 >> \ >> ++=C2=A0=C2=A0=C2=A0=C2=A0{=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 >> =C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0wchar_t=20 >> uwc;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0char=20 >> mbc[MB_LEN_MAX];=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mbstate_t=20 >> state_wc;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0for (NEW_LEN =3D i =3D 0; i < >> LEN;)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mbstate_t >> state_bak;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0state_bak =3D >> STATE;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0MBLENGTH =3D= mbrtowc (&WC, TEXT + i, LEN - i, >> &STATE);=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (MBLENGTH= =3D=3D (size_t)-2 || MBLENGTH =3D=3D (size_t)- >> 1=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0|| MBLENGTH =3D=3D >> 0)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= {=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 >> =C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0if (MBLENGTH =3D=3D (size_t)-2 || MBLENGTH =3D=3D=20 >> (size_t)-1)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0STATE =3D=20 >> state_bak;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0if=20 >> (!ignore)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0COPY[NEW_LEN++] =3D=20 >> TEXT[i];=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0i++;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0continue;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 >> =C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= }=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 >> =C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if >> (ignore)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= {=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 >> =C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0if ((ignore =3D=3D nonprinting && !iswprint=20 >> (WC))=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0|| (ignore =3D=3D >> nondictionary=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0&& !iswalnu= m (WC) && !iswblank >> (WC)))=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0{=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0i +=3D=20 >> MBLENGTH;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0continue;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0}=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= }=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 >> =C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if=20 >> (translate)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= {=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 >> =C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0uwc =3D=20 >> towupper(WC);=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0if (WC =3D=3D >> uwc)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0{=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0memcpy (mbc, TEXT + i,=20 >> MBLENGTH);=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0i +=3D=20 >> MBLENGTH;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0}=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0else=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0{=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0i +=3D=20 >> MBLENGTH;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0WC =3D=20 >> uwc;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0memset (&state_wc, '\0', sizeof >> (mbstate_t));=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0MBLENGTH =3D wcrtomb (mbc, WC,=20 >> &state_wc);=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0assert (MBLENGTH !=3D (size_t)-1 && MBLEN= GTH !=3D=20 >> 0);=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0}=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0for (j =3D 0; j < MBLENGTH; >> j++)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0COPY[NEW_LEN++] =3D=20 >> mbc[j];=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= }=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 >> =C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 >> =C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= for (j =3D 0; j < MBLENGTH;=20 >> j++)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0COPY[NEW_LEN++] =3D=20 >> TEXT[i++];=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0}=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0COPY[NEW_LEN] =3D=20 >> '\0';=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0}=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 >> =C2=A0\ >> ++=C2=A0=C2=A0while (0) >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Actually compare the fields. */ >> ++ >> ++=C2=A0=C2=A0for (;;) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Find the lengths. */ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0size_t lena =3D lima <=3D texta ? 0 = : lima - texta; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0size_t lenb =3D limb <=3D textb ? 0 = : limb - textb; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0char enda IF_LINT (=3D 0); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0char endb IF_LINT (=3D 0); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0char const *translate =3D key->trans= late; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0bool const *ignore =3D key->ignore; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (ignore || translate) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (SIZE_MAX= - lenb - 2 < lena) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= xalloc_die (); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0char *copy_a= =3D (char *) xnmalloc (lena + lenb + 2,=20 >> MB_CUR_MAX); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0char *copy_b= =3D copy_a + lena * MB_CUR_MAX + 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0size_t new_l= en_a, new_len_b; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0size_t i, j; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0IGNORE_CHARS= (new_len_a, lena, texta, copy_a, >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0wc_a,= mblength_a, state_a); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0IGNORE_CHARS= (new_len_b, lenb, textb, copy_b, >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0wc_b,= mblength_b, state_b); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0texta =3D co= py_a; textb =3D copy_b; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0lena =3D new= _len_a; lenb =3D new_len_b; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Use the k= eys in-place, temporarily null-terminated.=C2=A0=C2=A0*/ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0enda =3D tex= ta[lena]; texta[lena] =3D '\0'; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0endb =3D tex= tb[lenb]; textb[lenb] =3D '\0'; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (key->random) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0diff =3D compare_random = (texta, lena, textb, lenb); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else if (key->numeric | key->general= _numeric |=20 >> key->human_numeric) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0char savea = =3D *lima, saveb =3D *limb; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*lima =3D *l= imb =3D '\0'; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0diff =3D (ke= y->numeric ? numcompare (texta, textb) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0: key->general_numeric ? general_numcompa= re=20 >> (texta, textb) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0: human_numcompare (texta, textb)); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*lima =3D sa= vea, *limb =3D saveb; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else if (key->version) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0diff =3D filevercmp (tex= ta, textb); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else if (key->month) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0diff =3D getmonth (texta= , lena, NULL) - getmonth (textb, lenb,=20 >> NULL); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else if (lena =3D=3D 0) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0diff =3D - NONZERO (lenb= ); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else if (lenb =3D=3D 0) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0diff =3D 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else if (hard_LC_COLLATE && !folding) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0diff =3D xme= mcoll0 (texta, lena + 1, textb, lenb + 1); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0diff =3D mem= cmp (texta, textb, MIN (lena, lenb)); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (diff =3D= =3D 0) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= diff =3D lena < lenb ? -1 : lena !=3D lenb; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (ignore || translate) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0free (texta); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0texta[lena] = =3D enda; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0textb[lenb] = =3D endb; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (diff) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0goto not_equal; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0key =3D key->next; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (! key) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Find the beginning and limit of t= he next field.=C2=A0=C2=A0*/ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (key->eword !=3D -1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0lima =3D limfield (a, ke= y), limb =3D limfield (b, key); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0lima =3D a->text + a->le= ngth - 1, limb =3D b->text + b->length -=20 >> 1; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (key->sword !=3D -1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0texta =3D begfield (a, k= ey), textb =3D begfield (b, key); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0texta =3D a-= >text, textb =3D b->text; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (key->ski= psblanks) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0while (texta < lima && ismbblank (texta, lima - texta, >> &mblength_a)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0texta +=3D mblength_a; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0while (textb < limb && ismbblank (textb, limb - textb, >> &mblength_b)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0textb +=3D mblength_b; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++not_equal: >> ++=C2=A0=C2=A0if (key && key->reverse) >> ++=C2=A0=C2=A0=C2=A0=C2=A0return -diff; >> ++=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0return diff; >> ++} >> ++#endif >> ++ >> + /* Compare two lines A and B, returning negative, zero, or positive >> +=C2=A0=C2=A0=C2=A0=C2=A0depending on whether A compares less than, equal = to, or greater=20 >> than B. >> */ >> +=C2=A0 >> +@@ -2722,7 +3367,7 @@ compare (struct line const *a, struct li >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0diff =3D - NONZERO (blen); >> +=C2=A0=C2=A0=C2=A0else if (blen =3D=3D 0) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0diff =3D 1; >> +-=C2=A0=C2=A0else if (hard_LC_COLLATE) >> ++=C2=A0=C2=A0else if (hard_LC_COLLATE && !folding) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Note xmemcoll0 is a performa= nce enhancement as >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0it will not u= nconditionally write '\0' after the >> +@@ -4121,6 +4766,7 @@ set_ordering (char const *s, struct keyf >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case 'f': >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0key->tr= anslate =3D fold_toupper; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0folding =3D = true; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case 'g': >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0key->ge= neral_numeric =3D true; >> +@@ -4199,7 +4845,7 @@ main (int argc, char **argv) >> +=C2=A0=C2=A0=C2=A0initialize_exit_failure (SORT_FAILURE); >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0hard_LC_COLLATE =3D hard_locale (LC_COLLATE); >> +-#if HAVE_NL_LANGINFO >> ++#if HAVE_LANGINFO_CODESET >> +=C2=A0=C2=A0=C2=A0hard_LC_TIME =3D hard_locale (LC_TIME); >> + #endif >> +=C2=A0 >> +@@ -4220,6 +4866,29 @@ main (int argc, char **argv) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0thousands_sep =3D -1; >> +=C2=A0=C2=A0=C2=A0} >> +=C2=A0 >> ++#if HAVE_MBRTOWC >> ++=C2=A0=C2=A0if (MB_CUR_MAX > 1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0inittables =3D inittables_mb; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0begfield =3D begfield_mb; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0limfield =3D limfield_mb; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0skipblanks =3D skipblanks_mb; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0getmonth =3D getmonth_mb; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0keycompare =3D keycompare_mb; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0numcompare =3D numcompare_mb; >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0else >> ++#endif >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0inittables =3D inittables_uni; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0begfield =3D begfield_uni; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0limfield =3D limfield_uni; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0skipblanks =3D skipblanks_uni; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0getmonth =3D getmonth_uni; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0keycompare =3D keycompare_uni; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0numcompare =3D numcompare_uni; >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> +=C2=A0=C2=A0=C2=A0have_read_stdin =3D false; >> +=C2=A0=C2=A0=C2=A0inittables (); >> +=C2=A0 >> +@@ -4494,13 +5163,34 @@ main (int argc, char **argv) >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case 't': >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= char newtab =3D optarg[0]; >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= if (! newtab) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= char newtab[MB_LEN_MAX + 1]; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= size_t newtab_length =3D 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= strncpy (newtab, optarg, MB_LEN_MAX); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= if (! newtab[0]) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0error (SORT_FAILURE, 0, _("empty tab")); >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= if (optarg[1]) >> ++#if HAVE_MBRTOWC >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= if (MB_CUR_MAX > 1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0wchar_t wc; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0mbstate_t state; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0memset (&state, '\0', sizeof (mbstate_t)); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0newtab_length =3D mbrtowc (&wc, newtab, strnlen=20 >> (newtab, >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0MB_LEN_MAX), >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0&state); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0switch (newtab_length) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case (size_t) -1: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case (size_t) -2: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case 0: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0newtab_length =3D 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0} >> ++#endif >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= if (newtab_length =3D=3D 1 && optarg[1]) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0{ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (STREQ (optarg, "\\0")) >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0newtab =3D '\0'; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0newtab[0] =3D '\0'; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Provoke with 'sort -= txx'.=C2=A0=C2=A0Complain about >> +@@ -4511,9 +5201,12 @@ main (int argc, char **argv) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0quote (optarg)); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0} >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= if (tab !=3D TAB_DEFAULT && tab !=3D newtab) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= if (tab_length >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0&& (tab_length !=3D newtab_length >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0|| memcmp (tab, newtab, tab_l= ength) !=3D 0)) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0error (SORT_FAILURE, 0, _("incompatible tabs")); >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= tab =3D newtab; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= memcpy (tab, newtab, newtab_length); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= tab_length =3D newtab_length; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0break; >> +=C2=A0 >> +@@ -4751,12 +5444,10 @@ main (int argc, char **argv) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0sort (files, nfiles, outfile, n= threads); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0 >> +-#ifdef lint >> +=C2=A0=C2=A0=C2=A0if (files_from) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0readtokens0_free (&tok); >> +=C2=A0=C2=A0=C2=A0else >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0free (files); >> +-#endif >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0if (have_read_stdin && fclose (stdin) =3D=3D EOF) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0die (_("close failed"), "-"); >> +diff -Naurp coreutils-8.25-orig/src/unexpand.c=20 >> coreutils-8.25/src/unexpand.c >> +--- coreutils-8.25-orig/src/unexpand.c 2016-01-01 07:48:50.000000000 >> -0600 >> ++++ coreutils-8.25/src/unexpand.c 2016-02-08 19:07:10.311944651 -0600 >> +@@ -38,12 +38,29 @@ >> + #include >> + #include >> + #include >> ++ >> ++/* Get mbstate_t, mbrtowc(), wcwidth(). */ >> ++#if HAVE_WCHAR_H >> ++# include >> ++#endif >> ++ >> + #include "system.h" >> + #include "error.h" >> + #include "fadvise.h" >> + #include "quote.h" >> + #include "xstrndup.h" >> +=C2=A0 >> ++/* MB_LEN_MAX is incorrectly defined to be 1 in at least one GCC >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0installation; work around this confi= guration error.=C2=A0=C2=A0*/ >> ++#if !defined MB_LEN_MAX || MB_LEN_MAX < 2 >> ++# define MB_LEN_MAX 16 >> ++#endif >> ++ >> ++/* Some systems, like BeOS, have multibyte encodings but lack=20 >> mbstate_t.=C2=A0=C2=A0*/ >> ++#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).=C2=A0=C2=A0*/ >> + #define PROGRAM_NAME "unexpand" >> +=C2=A0 >> +@@ -103,6 +120,210 @@ static struct option const longopts[] =3D >> +=C2=A0=C2=A0=C2=A0{NULL, 0, NULL, 0} >> + }; >> +=C2=A0 >> ++static FILE *next_file (FILE *fp); >> ++ >> ++#if HAVE_MBRTOWC >> ++static void >> ++unexpand_multibyte (void) >> ++{ >> ++=C2=A0=C2=A0FILE *fp; /* Input stream. */ >> ++=C2=A0=C2=A0mbstate_t i_state; /* Current shift state of the input >> stream. */ >> ++=C2=A0=C2=A0mbstate_t i_state_bak; /* Back up the I_STATE. */ >> ++=C2=A0=C2=A0mbstate_t o_state; /* Current shift state of the output >> stream. */ >> ++=C2=A0=C2=A0char buf[MB_LEN_MAX + BUFSIZ];=C2=A0=C2=A0/* For spooling a = read byte=20 >> sequence. */ >> ++=C2=A0=C2=A0char *bufpos =3D buf; /* Next read position of BUF. >> */ >> ++=C2=A0=C2=A0size_t buflen =3D 0; /* The length of the byte sequence in >> buf. */ >> ++=C2=A0=C2=A0wint_t wc; /* A gotten wide character. */ >> ++=C2=A0=C2=A0size_t mblength; /* The byte size of a multibyte character >> ++ =C2=A0=C2=A0=C2=A0which shows as same character as WC. */ >> ++=C2=A0=C2=A0bool prev_tab =3D false; >> ++ >> ++=C2=A0=C2=A0/* Index in `tab_list' of next tabstop: */ >> ++=C2=A0=C2=A0int tab_index =3D 0; /* For calculating width of pending >> tabs. */ >> ++=C2=A0=C2=A0int print_tab_index =3D 0; /* For printing as many tabs as p= ossible. >> */ >> ++=C2=A0=C2=A0unsigned int column =3D 0; /* Column on screen of next char.= */ >> ++=C2=A0=C2=A0int next_tab_column; /* Column the next tab stop is on. */ >> ++=C2=A0=C2=A0int convert =3D 1; /* If nonzero, perform translations. */ >> ++=C2=A0=C2=A0unsigned int pending =3D 0; /* Pending columns of blanks. */ >> ++ >> ++=C2=A0=C2=A0fp =3D next_file ((FILE *) NULL); >> ++=C2=A0=C2=A0if (fp =3D=3D NULL) >> ++=C2=A0=C2=A0=C2=A0=C2=A0return; >> ++ >> ++=C2=A0=C2=A0memset (&o_state, '\0', sizeof(mbstate_t)); >> ++=C2=A0=C2=A0memset (&i_state, '\0', sizeof(mbstate_t)); >> ++ >> ++=C2=A0=C2=A0for (;;) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (buflen < MB_LEN_MAX && !feof(fp)= && !ferror(fp)) >> ++ { >> ++ =C2=A0=C2=A0memmove (buf, bufpos, buflen); >> ++ =C2=A0=C2=A0buflen +=3D fread (buf + buflen, sizeof(char), BUFSIZ, fp); >> ++ =C2=A0=C2=A0bufpos =3D buf; >> ++ } >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Get a wide character. */ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (buflen < 1) >> ++ { >> ++ =C2=A0=C2=A0mblength =3D 1; >> ++ =C2=A0=C2=A0wc =3D WEOF; >> ++ } >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++ { >> ++ =C2=A0=C2=A0i_state_bak =3D i_state; >> ++ =C2=A0=C2=A0mblength =3D mbrtowc ((wchar_t *)&wc, bufpos, buflen, &i_st= ate); >> ++ } >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (mblength =3D=3D (size_t)-1 || mb= length =3D=3D (size_t)-2) >> ++ { >> ++ =C2=A0=C2=A0i_state =3D i_state_bak; >> ++ =C2=A0=C2=A0wc =3D L'\0'; >> ++ } >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (wc =3D=3D L' ' && convert && col= umn < INT_MAX) >> ++ { >> ++ =C2=A0=C2=A0++pending; >> ++ =C2=A0=C2=A0++column; >> ++ } >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else if (wc =3D=3D L'\t' && convert) >> ++ { >> ++ =C2=A0=C2=A0if (tab_size =3D=3D 0) >> ++ =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Do not let tab_index =3D=3D firs= t_free_tab; >> ++ =C2=A0stop when it is 1 less. */ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (tab_index < first_free_tab -= 1 >> ++ =C2=A0=C2=A0&& column >=3D tab_list[tab_index]) >> ++ tab_index++; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0next_tab_column =3D tab_list[tab_in= dex]; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (tab_index < first_free_tab - 1) >> ++ tab_index++; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (column >=3D next_tab_column) >> ++ { >> ++ =C2=A0=C2=A0convert =3D 0; /* Ran out of tab stops. */ >> ++ =C2=A0=C2=A0goto flush_pend_mb; >> ++ } >> ++ =C2=A0=C2=A0=C2=A0=C2=A0} >> ++ =C2=A0=C2=A0else >> ++ =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0next_tab_column =3D column + tab_si= ze - column % tab_size; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0} >> ++ =C2=A0=C2=A0pending +=3D next_tab_column - column; >> ++ =C2=A0=C2=A0column =3D next_tab_column; >> ++ } >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++ { >> ++flush_pend_mb: >> ++ =C2=A0=C2=A0/* Flush pending spaces.=C2=A0=C2=A0Print as many tabs as p= ossible, >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0then print the rest as spaces. */ >> ++ =C2=A0=C2=A0if (pending =3D=3D 1 && column !=3D 1 && !prev_tab) >> ++ =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0putchar (' '); >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0pending =3D 0; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0} >> ++ =C2=A0=C2=A0column -=3D pending; >> ++ =C2=A0=C2=A0while (pending > 0) >> ++ =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (tab_size =3D=3D 0) >> ++ { >> ++ =C2=A0=C2=A0/* Do not let print_tab_index =3D=3D first_free_tab; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0stop when it is 1 less. */ >> ++ =C2=A0=C2=A0while (print_tab_index < first_free_tab - 1 >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0&& column >=3D tab_list[print_tab_= index]) >> ++ =C2=A0=C2=A0=C2=A0=C2=A0print_tab_index++; >> ++ =C2=A0=C2=A0next_tab_column =3D tab_list[print_tab_index]; >> ++ =C2=A0=C2=A0if (print_tab_index < first_free_tab - 1) >> ++ =C2=A0=C2=A0=C2=A0=C2=A0print_tab_index++; >> ++ } >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++ { >> ++ =C2=A0=C2=A0next_tab_column =3D >> ++ =C2=A0=C2=A0=C2=A0=C2=A0column + tab_size - column % tab_size; >> ++ } >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (next_tab_column - column <=3D p= ending) >> ++ { >> ++ =C2=A0=C2=A0putchar ('\t'); >> ++ =C2=A0=C2=A0pending -=3D next_tab_column - column; >> ++ =C2=A0=C2=A0column =3D next_tab_column; >> ++ } >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++ { >> ++ =C2=A0=C2=A0--print_tab_index; >> ++ =C2=A0=C2=A0column +=3D pending; >> ++ =C2=A0=C2=A0while (pending !=3D 0) >> ++ =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0putchar (' '); >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0pending--; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0} >> ++ } >> ++ =C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++ =C2=A0=C2=A0if (wc =3D=3D WEOF) >> ++ =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0fp =3D next_file (fp); >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (fp =3D=3D NULL) >> ++ break;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* N= o more files. */ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++ { >> ++ =C2=A0=C2=A0memset (&i_state, '\0', sizeof(mbstate_t)); >> ++ =C2=A0=C2=A0continue; >> ++ } >> ++ =C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++ =C2=A0=C2=A0if (mblength =3D=3D (size_t)-1 || mblength =3D=3D (size_t)-= 2) >> ++ =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (convert) >> ++ { >> ++ =C2=A0=C2=A0++column; >> ++ =C2=A0=C2=A0if (convert_entire_line =3D=3D 0) >> ++ =C2=A0=C2=A0=C2=A0=C2=A0convert =3D 0; >> ++ } >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mblength =3D 1; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0putchar (buf[0]); >> ++ =C2=A0=C2=A0=C2=A0=C2=A0} >> ++ =C2=A0=C2=A0else if (mblength =3D=3D 0) >> ++ =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (convert && convert_entire_line = =3D=3D 0) >> ++ convert =3D 0; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mblength =3D 1; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0putchar ('\0'); >> ++ =C2=A0=C2=A0=C2=A0=C2=A0} >> ++ =C2=A0=C2=A0else >> ++ =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (convert) >> ++ { >> ++ =C2=A0=C2=A0if (wc =3D=3D L'\b') >> ++ =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (column > 0) >> ++ --column; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0} >> ++ =C2=A0=C2=A0else >> ++ =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0int width;=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* The width of WC. */ >> ++ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0width =3D wcwidth (wc); >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0column +=3D (width > 0) ? width : = 0; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (convert_entire_line =3D=3D 0) >> ++ convert =3D 0; >> ++ =C2=A0=C2=A0=C2=A0=C2=A0} >> ++ } >> ++ >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (wc =3D=3D L'\n') >> ++ { >> ++ =C2=A0=C2=A0tab_index =3D print_tab_index =3D 0; >> ++ =C2=A0=C2=A0column =3D pending =3D 0; >> ++ =C2=A0=C2=A0convert =3D 1; >> ++ } >> ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0fwrite (bufpos, sizeof(char), mblen= gth, stdout); >> ++ =C2=A0=C2=A0=C2=A0=C2=A0} >> ++ } >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0prev_tab =3D wc =3D=3D L'\t'; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0buflen -=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0bufpos +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++} >> ++#endif >> ++ >> ++ >> + void >> + usage (int status) >> + { >> +@@ -523,7 +744,12 @@ main (int argc, char **argv) >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0file_list =3D (optind < argc ? &argv[optind] : stdin_ar= gv); >> +=C2=A0 >> +-=C2=A0=C2=A0unexpand (); >> ++#if HAVE_MBRTOWC >> ++=C2=A0=C2=A0if (MB_CUR_MAX > 1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0unexpand_multibyte (); >> ++=C2=A0=C2=A0else >> ++#endif >> ++=C2=A0=C2=A0=C2=A0=C2=A0unexpand (); >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0if (have_read_stdin && fclose (stdin) !=3D 0) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0error (EXIT_FAILURE, errno, "-"); >> +diff -Naurp coreutils-8.25-orig/src/uniq.c coreutils-8.25/src/uniq.c >> +--- coreutils-8.25-orig/src/uniq.c 2016-01-13 05:08:59.000000000=20 >> -0600 >> ++++ coreutils-8.25/src/uniq.c 2016-02-08 19:07:10.312944654 -0600 >> +@@ -21,6 +21,17 @@ >> + #include >> + #include >> +=C2=A0 >> ++/* 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 "xstrtol.h" >> + #include "memcasecmp.h" >> + #include "quote.h" >> ++#include "xmemcoll.h" >> ++ >> ++/* MB_LEN_MAX is incorrectly defined to be 1 in at least one GCC >> ++=C2=A0=C2=A0=C2=A0installation; work around this configuration error.=C2= =A0=C2=A0*/ >> ++#if !defined MB_LEN_MAX || MB_LEN_MAX < 2 >> ++# define MB_LEN_MAX 16 >> ++#endif >> ++ >> ++/* Some systems, like BeOS, have multibyte encodings but lack=20 >> mbstate_t.=C2=A0=C2=A0*/ >> ++#if HAVE_MBRTOWC && defined mbstate_t >> ++# define mbrtowc(pwc, s, n, ps) (mbrtowc) (pwc, s, n, 0) >> ++#endif >> +=C2=A0 >> + /* The official name of this program (e.g., no 'g' prefix).=C2=A0=C2=A0*/ >> + #define PROGRAM_NAME "uniq" >> +@@ -143,6 +166,10 @@ enum >> +=C2=A0=C2=A0=C2=A0GROUP_OPTION =3D CHAR_MAX + 1 >> + }; >> +=C2=A0 >> ++/* Function pointers. */ >> ++static char * >> ++(*find_field) (struct linebuffer *line); >> ++ >> + static struct option const longopts[] =3D >> + { >> +=C2=A0=C2=A0=C2=A0{"count", no_argument, NULL, 'c'}, >> +@@ -252,7 +279,7 @@ size_opt (char const *opt, char const *m >> +=C2=A0=C2=A0=C2=A0=C2=A0return a pointer to the beginning of the line's f= ield to be=20 >> compared. */ >> +=C2=A0 >> + static char * _GL_ATTRIBUTE_PURE >> +-find_field (struct linebuffer const *line) >> ++find_field_uni (struct linebuffer *line) >> + { >> +=C2=A0=C2=A0=C2=A0size_t count; >> +=C2=A0=C2=A0=C2=A0char const *lp =3D line->buffer; >> +@@ -272,6 +299,83 @@ find_field (struct linebuffer const *lin >> +=C2=A0=C2=A0=C2=A0return line->buffer + i; >> + } >> +=C2=A0 >> ++#if HAVE_MBRTOWC >> ++ >> ++# define MBCHAR_TO_WCHAR(WC, MBLENGTH, LP, POS, SIZE, STATEP,=20 >> CONVFAIL)=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0do=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 >> \ >> ++=C2=A0=C2=A0=C2=A0=C2=A0{=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 >> =C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mbstate_t=20 >> state_bak;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0CONVFAIL =3D=20 >> 0;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0state_bak =3D=20 >> *STATEP;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0MBLENGTH =3D mbrtowc (&WC, LP + POS,= SIZE - POS, >> STATEP);=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0switch >> (MBLENGTH)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case=20 >> (size_t)-2:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case=20 >> (size_t)-1:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*STATEP =3D >> state_bak;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0CONVFAIL++;= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 >> =C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Fall thro= ugh >> */=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0case >> 0:=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0MBLENGTH =3D >> 1;=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0}=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ >> ++=C2=A0=C2=A0=C2=A0=C2=A0}=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 >> =C2=A0\ >> ++=C2=A0=C2=A0while (0) >> ++ >> ++static char * >> ++find_field_multi (struct linebuffer *line) >> ++{ >> ++=C2=A0=C2=A0size_t count; >> ++=C2=A0=C2=A0char *lp =3D line->buffer; >> ++=C2=A0=C2=A0size_t size =3D line->length - 1; >> ++=C2=A0=C2=A0size_t pos; >> ++=C2=A0=C2=A0size_t mblength; >> ++=C2=A0=C2=A0wchar_t wc; >> ++=C2=A0=C2=A0mbstate_t *statep; >> ++=C2=A0=C2=A0int convfail =3D 0; >> ++ >> ++=C2=A0=C2=A0pos =3D 0; >> ++=C2=A0=C2=A0statep =3D &(line->state); >> ++ >> ++=C2=A0=C2=A0/* skip fields. */ >> ++=C2=A0=C2=A0for (count =3D 0; count < skip_fields && pos < size; count++) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (pos < size) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0MBCHAR_TO_WC= HAR (wc, mblength, lp, pos, size, statep,=20 >> convfail); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (convfail= || !(iswblank (wc) || wc =3D=3D '\n')) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0pos +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0break; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0pos +=3D mbl= ength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (pos < size) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0MBCHAR_TO_WC= HAR (wc, mblength, lp, pos, size, statep,=20 >> convfail); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (!convfai= l && (iswblank (wc) || wc =3D=3D '\n')) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= break; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0pos +=3D mbl= ength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0/* skip fields. */ >> ++=C2=A0=C2=A0for (count =3D 0; count < skip_chars && pos < size; count++) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0MBCHAR_TO_WCHAR (wc, mblength, lp, p= os, size, statep,=20 >> convfail); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0pos +=3D mblength; >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0return lp + pos; >> ++} >> ++#endif >> ++ >> + /* Return false if two strings OLD and NEW match, true if not. >> +=C2=A0=C2=A0=C2=A0=C2=A0OLD and NEW point not to the beginnings of the li= nes >> +=C2=A0=C2=A0=C2=A0=C2=A0but rather to the beginnings of the fields to com= pare. >> +@@ -280,6 +384,8 @@ find_field (struct linebuffer const *lin >> + static bool >> + different (char *old, char *new, size_t oldlen, size_t newlen) >> + { >> ++=C2=A0=C2=A0char *copy_old, *copy_new; >> ++ >> +=C2=A0=C2=A0=C2=A0if (check_chars < oldlen) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0oldlen =3D check_chars; >> +=C2=A0=C2=A0=C2=A0if (check_chars < newlen) >> +@@ -287,15 +393,104 @@ different (char *old, char *new, size_t >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0if (ignore_case) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* FIXME: This should invoke strcoll= somehow.=C2=A0=C2=A0*/ >> +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return oldlen !=3D newlen || memcase= cmp (old, new, oldlen); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0size_t i; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0copy_old =3D xmalloc (oldlen + 1); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0copy_new =3D xmalloc (oldlen + 1); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0for (i =3D 0; i < oldlen; i++) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0copy_old[i] = =3D toupper (old[i]); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0copy_new[i] = =3D toupper (new[i]); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0bool rc =3D xmemcoll (copy_old, oldl= en, copy_new, newlen); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0free (copy_old); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0free (copy_new); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0return rc; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +-=C2=A0=C2=A0else if (hard_LC_COLLATE) >> +-=C2=A0=C2=A0=C2=A0=C2=A0return xmemcoll (old, oldlen, new, newlen) !=3D = 0; >> +=C2=A0=C2=A0=C2=A0else >> +-=C2=A0=C2=A0=C2=A0=C2=A0return oldlen !=3D newlen || memcmp (old, new, o= ldlen); >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0copy_old =3D (char *)old; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0copy_new =3D (char *)new; >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++=C2=A0=C2=A0return xmemcoll (copy_old, oldlen, copy_new, newlen); >> ++ >> + } >> +=C2=A0 >> ++#if HAVE_MBRTOWC >> ++static int >> ++different_multi (const char *old, const char *new, size_t oldlen,=20 >> size_t >> newlen, mbstate_t oldstate, mbstate_t newstate) >> ++{ >> ++=C2=A0=C2=A0size_t i, j, chars; >> ++=C2=A0=C2=A0const char *str[2]; >> ++=C2=A0=C2=A0char *copy[2]; >> ++=C2=A0=C2=A0size_t len[2]; >> ++=C2=A0=C2=A0mbstate_t state[2]; >> ++=C2=A0=C2=A0size_t mblength; >> ++=C2=A0=C2=A0wchar_t wc, uwc; >> ++=C2=A0=C2=A0mbstate_t state_bak; >> ++ >> ++=C2=A0=C2=A0str[0] =3D old; >> ++=C2=A0=C2=A0str[1] =3D new; >> ++=C2=A0=C2=A0len[0] =3D oldlen; >> ++=C2=A0=C2=A0len[1] =3D newlen; >> ++=C2=A0=C2=A0state[0] =3D oldstate; >> ++=C2=A0=C2=A0state[1] =3D newstate; >> ++ >> ++=C2=A0=C2=A0for (i =3D 0; i < 2; i++) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0copy[i] =3D xmalloc (len[i] + 1); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0memset (copy[i], '\0', len[i] + 1); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0for (j =3D 0, chars =3D 0; j < len[i= ] && chars < check_chars;=20 >> chars++) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0state_bak = =3D state[i]; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mblength =3D= mbrtowc (&wc, str[i] + j, len[i] - j,=20 >> &(state[i])); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0switch (mble= ngth) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= case (size_t)-1: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= case (size_t)-2: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0state[i] =3D state_bak; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0/* Fall through */ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= case 0: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0mblength =3D 1; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0break; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= default: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0if (ignore_case) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0uwc =3D towupper (wc); >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (uwc !=3D wc) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mbstate_t state_w= c; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0size_t mblen; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0memset (&state_wc= , '\0', sizeof(mbstate_t)); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mblen =3D wcrtomb= (copy[i] + j, uwc, &state_wc); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0assert (mblen != =3D (size_t)-1); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0memcpy (copy[i] + j, str[i] += j, mblength); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0else >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0memcpy (copy[i] + j, str[i] + j, mblength); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0j +=3D mblen= gth; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0copy[i][j] =3D '\0'; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0len[i] =3D j; >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0int rc =3D xmemcoll (copy[0], len[0], copy[1], len[1]); >> ++=C2=A0=C2=A0free (copy[0]); >> ++=C2=A0=C2=A0free (copy[1]); >> ++=C2=A0=C2=A0return rc; >> ++ >> ++} >> ++#endif >> ++ >> + /* Output the line in linebuffer LINE to standard output >> +=C2=A0=C2=A0=C2=A0=C2=A0provided that the switches say it should be outpu= t. >> +=C2=A0=C2=A0=C2=A0=C2=A0MATCH is true if the line matches the previous li= ne. >> +@@ -359,19 +554,38 @@ check_file (const char *infile, const ch >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0char *prevfield IF_LINT ( =3D N= ULL); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0size_t prevlen IF_LINT ( =3D 0); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0bool first_group_printed =3D fa= lse; >> ++#if HAVE_MBRTOWC >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mbstate_t prevstate; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0memset (&prevstate, '\0', sizeof (mb= state_t)); >> ++#endif >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (!feof (stdin)) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0char *t= hisfield; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0size_t = thislen; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0bool ne= w_group; >> ++#if HAVE_MBRTOWC >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mbstate_t th= isstate; >> ++#endif >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (rea= dlinebuffer_delim (thisline, stdin, delimiter) =3D=3D=20 >> 0) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0break; >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0thisfie= ld =3D find_field (thisline); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0thislen= =3D thisline->length - 1 - (thisfield -=20 >> thisline->buffer); >> ++#if HAVE_MBRTOWC >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (MB_CUR_M= AX > 1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0thisstate =3D thisline->state; >> +=C2=A0 >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0new_group =3D (prevline->length =3D=3D 0 >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0|| different_multi (thisfield, prevfield, >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0thislen, prevlen, >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0thisstate,=20 >> prevstate)); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++#endif >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0new_gro= up =3D (prevline->length =3D=3D 0 >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0|| di= fferent (thisfield, prevfield, thislen, >> prevlen)); >> +=C2=A0 >> +@@ -389,6 +603,10 @@ check_file (const char *infile, const ch >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0SWAP_LINES (prevline, thisline); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0prevfield =3D thisfield; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0prevlen =3D thislen; >> ++#if HAVE_MBRTOWC >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0if (MB_CUR_MAX > 1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0prevstate =3D thisstate; >> ++#endif >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0first_group_printed =3D true; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0} >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +@@ -401,17 +619,26 @@ check_file (const char *infile, const ch >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0size_t prevlen; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0uintmax_t match_count =3D 0; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0bool first_delimiter =3D true; >> ++#if HAVE_MBRTOWC >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mbstate_t prevstate; >> ++#endif >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (readlinebuffer_delim (prevl= ine, stdin, delimiter) =3D=3D 0) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0goto closefiles; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0prevfield =3D find_field (prevl= ine); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0prevlen =3D prevline->length - = 1 - (prevfield -=20 >> prevline->buffer); >> ++#if HAVE_MBRTOWC >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0prevstate =3D prevline->state; >> ++#endif >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0while (!feof (stdin)) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0bool ma= tch; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0char *t= hisfield; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0size_t = thislen; >> ++#if HAVE_MBRTOWC >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mbstate_t th= isstate =3D thisline->state; >> ++#endif >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (rea= dlinebuffer_delim (thisline, stdin, delimiter) =3D=3D=20 >> 0) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0{ >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0if (ferror (stdin)) >> +@@ -420,6 +647,14 @@ check_file (const char *infile, const ch >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0} >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0thisfie= ld =3D find_field (thisline); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0thislen= =3D thisline->length - 1 - (thisfield -=20 >> thisline->buffer); >> ++#if HAVE_MBRTOWC >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (MB_CUR_M= AX > 1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0match =3D !different_multi (thisfield, prevfield, >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0thislen, prevlen, thisstate,=20 >> prevstate); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0else >> ++#endif >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0match = =3D !different (thisfield, prevfield, thislen,=20 >> prevlen); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0match_c= ount +=3D match; >> +=C2=A0 >> +@@ -452,6 +687,9 @@ check_file (const char *infile, const ch >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0SWAP_LINES (prevline, thisline); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0prevfield =3D thisfield; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0prevlen =3D thislen; >> ++#if HAVE_MBRTOWC >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0prevstate =3D thisstate; >> ++#endif >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0if (!match) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0match_count =3D 0; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0} >> +@@ -498,6 +736,19 @@ main (int argc, char **argv) >> +=C2=A0 >> +=C2=A0=C2=A0=C2=A0atexit (close_stdout); >> +=C2=A0 >> ++#if HAVE_MBRTOWC >> ++=C2=A0=C2=A0if (MB_CUR_MAX > 1) >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0find_field =3D find_field_multi; >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0else >> ++#endif >> ++=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0find_field =3D find_field_uni; >> ++=C2=A0=C2=A0=C2=A0=C2=A0} >> ++ >> ++ >> ++ >> +=C2=A0=C2=A0=C2=A0skip_chars =3D 0; >> +=C2=A0=C2=A0=C2=A0skip_fields =3D 0; >> +=C2=A0=C2=A0=C2=A0check_chars =3D SIZE_MAX; >> +diff -Naurp coreutils-8.25-orig/tests/i18n/sort-month.sh coreutils- >> 8.25/tests/i18n/sort-month.sh >> +--- coreutils-8.25-orig/tests/i18n/sort-month.sh 1969-12-31 >> 18:00:00.000000000 -0600 >> ++++ coreutils-8.25/tests/i18n/sort-month.sh 2016-02-08 >> 19:07:10.312944654 -0600 >> +@@ -0,0 +1,34 @@ >> ++#!/bin/sh >> ++# Verify sort -M multi-byte support. >> ++ >> ++. "${srcdir=3D.}/tests/init.sh"; path_prepend_ ./src >> ++print_ver_ sort >> ++require_valgrind_ >> ++ >> ++# Skip this test if some deallocations are >> ++# avoided at process end. >> ++grep '^#define lint 1' $CONFIG_HEADER > /dev/null || >> ++=C2=A0=C2=A0skip_ 'Allocation checks only work reliably in "lint" mode' >> ++ >> ++export LC_ALL=3Den_US.UTF-8 >> ++locale -k LC_CTYPE | grep -q "charmap.*UTF-8" \ >> ++=C2=A0=C2=A0|| skip_ "No UTF-8 locale available" >> ++ >> ++# Note the use of =C9=91 here which expands to >> ++# a wider representation upon case conversion >> ++# which triggered an assertion in sort -M >> ++cat < exp >> ++. >> ++=C9=91 >> ++EOF >> ++ >> ++ >> ++# check large mem leak with --month-sort >> ++# https://bugzilla.redhat.com/show_bug.cgi?id=3D1259942 >> ++valgrind --leak-check=3Dfull \ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0--error-exitcode= =3D1 --errors-for-leak-kinds=3Ddefinite \ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0sort -M < exp > ou= t || fail=3D1 >> ++compare exp out || { fail=3D1; cat out; } >> ++ >> ++ >> ++Exit $fail >> +diff -Naurp coreutils-8.25-orig/tests/i18n/sort.sh coreutils- >> 8.25/tests/i18n/sort.sh >> +--- coreutils-8.25-orig/tests/i18n/sort.sh 1969-12-31 >> 18:00:00.000000000 -0600 >> ++++ coreutils-8.25/tests/i18n/sort.sh 2016-02-08 19:07:10.312944654 >> -0600 >> +@@ -0,0 +1,29 @@ >> ++#!/bin/sh >> ++# Verify sort's multi-byte support. >> ++ >> ++. "${srcdir=3D.}/tests/init.sh"; path_prepend_ ./src >> ++print_ver_ sort >> ++ >> ++export LC_ALL=3Den_US.UTF-8 >> ++locale -k LC_CTYPE | grep -q "charmap.*UTF-8" \ >> ++=C2=A0=C2=A0|| skip_ "No UTF-8 locale available" >> ++ >> ++# Enable heap consistency checkng on older systems >> ++export MALLOC_CHECK_=3D2 >> ++ >> ++ >> ++# check buffer overflow issue due to >> ++# expanding multi-byte representation due to case conversion >> ++# https://bugzilla.suse.com/show_bug.cgi?id=3D928749 >> ++cat < exp >> ++. >> ++=C9=91 >> ++EOF >> ++cat < out || fail=3D1 >> ++. >> ++=C9=91 >> ++EOF >> ++compare exp out || { fail=3D1; cat out; } >> ++ >> ++ >> ++Exit $fail >> +diff -Naurp coreutils-8.25-orig/tests/local.mk=20 >> coreutils-8.25/tests/local.mk >> +--- coreutils-8.25-orig/tests/local.mk 2016-01-16 12:18:13.000000000 >> -0600 >> ++++ coreutils-8.25/tests/local.mk 2016-02-08 19:07:10.313944658 -0600 >> +@@ -344,6 +344,9 @@ all_tests =3D \ >> +=C2=A0=C2=A0=C2=A0tests/misc/sort-discrim.sh \ >> +=C2=A0=C2=A0=C2=A0tests/misc/sort-files0-from.pl \ >> +=C2=A0=C2=A0=C2=A0tests/misc/sort-float.sh \ >> ++=C2=A0=C2=A0tests/misc/sort-mb-tests.sh \ >> ++=C2=A0=C2=A0tests/i18n/sort.sh \ >> ++=C2=A0=C2=A0tests/i18n/sort-month.sh \ >> +=C2=A0=C2=A0=C2=A0tests/misc/sort-merge.pl \ >> +=C2=A0=C2=A0=C2=A0tests/misc/sort-merge-fdlimit.sh \ >> +=C2=A0=C2=A0=C2=A0tests/misc/sort-month.sh \ >> +diff -Naurp coreutils-8.25-orig/tests/misc/cut.pl coreutils- >> 8.25/tests/misc/cut.pl >> +--- coreutils-8.25-orig/tests/misc/cut.pl 2016-01-16 >> 12:18:13.000000000 -0600 >> ++++ coreutils-8.25/tests/misc/cut.pl 2016-02-08 19:07:10.314944661 >> -0600 >> +@@ -23,9 +23,11 @@ use strict; >> + # Turn off localization of executable's output. >> + @ENV{qw(LANGUAGE LANG LC_ALL)} =3D ('C') x 3; >> +=C2=A0 >> +-my $mb_locale =3D $ENV{LOCALE_FR_UTF8}; >> ++my $mb_locale; >> ++# uncommented enable multibyte paths >> ++$mb_locale =3D $ENV{LOCALE_FR_UTF8}; >> + ! defined $mb_locale || $mb_locale eq 'none' >> +-=C2=A0=C2=A0and $mb_locale =3D 'C'; >> ++ and $mb_locale =3D 'C'; >> +=C2=A0 >> + my $prog =3D 'cut'; >> + my $try =3D "Try '$prog --help' for more information.\n"; >> +@@ -240,6 +242,7 @@ if ($mb_locale ne 'C') >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0my @new_t =3D @$t; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0my $test_name =3D s= hift @new_t; >> +=C2=A0 >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0next if ($test_name =3D~= "newline-[12][0-9]"); >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0push @new, ["$test_= name-mb", @new_t, {ENV =3D>=20 >> "LC_ALL=3D$mb_locale"}]; >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0push @Tests, @new; >> +diff -Naurp coreutils-8.25-orig/tests/misc/expand.pl coreutils- >> 8.25/tests/misc/expand.pl >> +--- coreutils-8.25-orig/tests/misc/expand.pl 2016-01-16 >> 12:18:13.000000000 -0600 >> ++++ coreutils-8.25/tests/misc/expand.pl 2016-02-08 19:07:10.314944661 >> -0600 >> +@@ -23,6 +23,15 @@ use strict; >> + # Turn off localization of executable's output. >> + @ENV{qw(LANGUAGE LANG LC_ALL)} =3D ('C') x 3; >> +=C2=A0 >> ++#comment out next line to disable multibyte tests >> ++my $mb_locale =3D $ENV{LOCALE_FR_UTF8}; >> ++! defined $mb_locale || $mb_locale eq 'none' >> ++ and $mb_locale =3D 'C'; >> ++ >> ++my $prog =3D 'expand'; >> ++my $try =3D "Try \`$prog --help' for more information.\n"; >> ++my $inval =3D "$prog: invalid byte, character or field list\n$try"; >> ++ >> + my @Tests =3D >> +=C2=A0=C2=A0=C2=A0( >> +=C2=A0=C2=A0=C2=A0=C2=A0['t1', '--tabs=3D3',=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0{IN=3D>"a\tb"}, {OUT=3D>"a=C2=A0=C2=A0b"}], >> +@@ -31,6 +40,37 @@ my @Tests =3D >> +=C2=A0=C2=A0=C2=A0=C2=A0['i2', '--tabs=3D3 -i', {IN=3D>" \ta\tb"}, {OUT= =3D>"=C2=A0=C2=A0=C2=A0a\tb"}], >> +=C2=A0=C2=A0=C2=A0); >> +=C2=A0 >> ++if ($mb_locale ne 'C') >> ++=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0# Duplicate each test vector, appending "-mb" to= the test name=20 >> and >> ++=C2=A0=C2=A0=C2=A0=C2=A0# inserting {ENV =3D> "LC_ALL=3D$mb_locale"} in = the copy, so that we >> ++=C2=A0=C2=A0=C2=A0=C2=A0# provide coverage for the distro-added multi-by= te code paths. >> ++=C2=A0=C2=A0=C2=A0=C2=A0my @new; >> ++=C2=A0=C2=A0=C2=A0=C2=A0foreach my $t (@Tests) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0my @new_t =3D @$t; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0my $test_name =3D shift = @new_t; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# Depending on whether e= xpand is multi-byte-patched, >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# it emits different dia= gnostics: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0#=C2=A0=C2=A0=C2=A0non-M= B: invalid byte or field list >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0#=C2=A0=C2=A0=C2=A0MB:= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0invalid byte, character or field list >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# Adjust the expected er= ror output accordingly. >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (grep {ref $_ eq 'HAS= H' && exists $_->{ERR} && $_->{ERR}=20 >> eq >> $inval} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= (@new_t)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= my $sub =3D {ERR_SUBST =3D> 's/, character//'}; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= push @new_t, $sub; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= push @$t, $sub; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0push @new, ["$test_name-= mb", @new_t, {ENV =3D>=20 >> "LC_ALL=3D$mb_locale"}]; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0push @Tests, @new; >> ++=C2=A0=C2=A0} >> ++ >> ++ >> ++(a)Tests =3D triple_test \@Tests; >> ++ >> + my $save_temps =3D $ENV{DEBUG}; >> + my $verbose =3D $ENV{VERBOSE}; >> +=C2=A0 >> +diff -Naurp coreutils-8.25-orig/tests/misc/fold.pl coreutils- >> 8.25/tests/misc/fold.pl >> +--- coreutils-8.25-orig/tests/misc/fold.pl 2016-01-16 >> 12:18:13.000000000 -0600 >> ++++ coreutils-8.25/tests/misc/fold.pl 2016-02-08 19:07:10.314944661 >> -0600 >> +@@ -20,9 +20,18 @@ use strict; >> +=C2=A0 >> + (my $program_name =3D $0) =3D~ s|.*/||; >> +=C2=A0 >> ++my $prog =3D 'fold'; >> ++my $try =3D "Try \`$prog --help' for more information.\n"; >> ++my $inval =3D "$prog: invalid byte, character or field list\n$try"; >> ++ >> + # Turn off localization of executable's output. >> + @ENV{qw(LANGUAGE LANG LC_ALL)} =3D ('C') x 3; >> +=C2=A0 >> ++# uncommented to enable multibyte paths >> ++my $mb_locale =3D $ENV{LOCALE_FR_UTF8}; >> ++! defined $mb_locale || $mb_locale eq 'none' >> ++ and $mb_locale =3D 'C'; >> ++ >> + my @Tests =3D >> +=C2=A0=C2=A0=C2=A0( >> +=C2=A0=C2=A0=C2=A0=C2=A0['s1', '-w2 -s', {IN=3D>"a\t"}, {OUT=3D>"a\n\t"}], >> +@@ -31,9 +40,48 @@ my @Tests =3D >> +=C2=A0=C2=A0=C2=A0=C2=A0['s4', '-w4 -s', {IN=3D>"abc ef\n"}, {OUT=3D>"abc= \nef\n"}], >> +=C2=A0=C2=A0=C2=A0); >> +=C2=A0 >> ++# Add _POSIX2_VERSION=3D199209 to the environment of each test >> ++# that uses an old-style option like +1. >> ++if ($mb_locale ne 'C') >> ++=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0# Duplicate each test vector, appending "-mb" to= the test name=20 >> and >> ++=C2=A0=C2=A0=C2=A0=C2=A0# inserting {ENV =3D> "LC_ALL=3D$mb_locale"} in = the copy, so that we >> ++=C2=A0=C2=A0=C2=A0=C2=A0# provide coverage for the distro-added multi-by= te code paths. >> ++=C2=A0=C2=A0=C2=A0=C2=A0my @new; >> ++=C2=A0=C2=A0=C2=A0=C2=A0foreach my $t (@Tests) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0my @new_t =3D @$t; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0my $test_name =3D shift = @new_t; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# Depending on whether f= old is multi-byte-patched, >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# it emits different dia= gnostics: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0#=C2=A0=C2=A0=C2=A0non-M= B: invalid byte or field list >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0#=C2=A0=C2=A0=C2=A0MB:= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0invalid byte, character or field list >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# Adjust the expected er= ror output accordingly. >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (grep {ref $_ eq 'HAS= H' && exists $_->{ERR} && $_->{ERR}=20 >> eq >> $inval} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= (@new_t)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= my $sub =3D {ERR_SUBST =3D> 's/, character//'}; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= push @new_t, $sub; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= push @$t, $sub; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0push @new, ["$test_name-= mb", @new_t, {ENV =3D>=20 >> "LC_ALL=3D$mb_locale"}]; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0push @Tests, @new; >> ++=C2=A0=C2=A0} >> ++ >> ++(a)Tests =3D triple_test \@Tests; >> ++ >> ++# Remember that triple_test creates from each test with exactly one=20 >> "IN" >> ++# file two more tests (.p and .r suffix on name) corresponding to=20 >> reading >> ++# input from a file and from a pipe.=C2=A0=C2=A0The pipe-reading test wo= uld=20 >> 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. >> ++(a)Tests =3D grep {$_->[0] ne 'output-is-input.p'} @Tests; >> ++ >> + my $save_temps =3D $ENV{DEBUG}; >> + my $verbose =3D $ENV{VERBOSE}; >> +=C2=A0 >> +-my $prog =3D 'fold'; >> + my $fail =3D run_tests ($program_name, $prog, \@Tests, $save_temps,=20 >> $verbose); >> + exit $fail; >> +diff -Naurp coreutils-8.25-orig/tests/misc/join.pl coreutils- >> 8.25/tests/misc/join.pl >> +--- coreutils-8.25-orig/tests/misc/join.pl 2016-01-16 >> 12:18:13.000000000 -0600 >> ++++ coreutils-8.25/tests/misc/join.pl 2016-02-08 19:07:10.315944664 >> -0600 >> +@@ -25,6 +25,15 @@ my $limits =3D getlimits (); >> +=C2=A0 >> + my $prog =3D 'join'; >> +=C2=A0 >> ++my $try =3D "Try \`$prog --help' for more information.\n"; >> ++my $inval =3D "$prog: invalid byte, character or field list\n$try"; >> ++ >> ++my $mb_locale; >> ++#Comment out next line to disable multibyte tests >> ++$mb_locale =3D $ENV{LOCALE_FR_UTF8}; >> ++! defined $mb_locale || $mb_locale eq 'none' >> ++=C2=A0=C2=A0and $mb_locale =3D 'C'; >> ++ >> + my $delim =3D chr 0247; >> + sub t_subst ($) >> + { >> +@@ -329,8 +338,49 @@ foreach my $t (@tv) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0push @Tests, $new_ent; >> +=C2=A0=C2=A0=C2=A0} >> +=C2=A0 >> ++# Add _POSIX2_VERSION=3D199209 to the environment of each test >> ++# that uses an old-style option like +1. >> ++if ($mb_locale ne 'C') >> ++=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0# Duplicate each test vector, appending "-mb" to= the test name=20 >> and >> ++=C2=A0=C2=A0=C2=A0=C2=A0# inserting {ENV =3D> "LC_ALL=3D$mb_locale"} in = the copy, so that we >> ++=C2=A0=C2=A0=C2=A0=C2=A0# provide coverage for the distro-added multi-by= te code paths. >> ++=C2=A0=C2=A0=C2=A0=C2=A0my @new; >> ++=C2=A0=C2=A0=C2=A0=C2=A0foreach my $t (@Tests) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0my @new_t =3D @$t; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0my $test_name =3D shift = @new_t; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# Depending on whether j= oin is multi-byte-patched, >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# it emits different dia= gnostics: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0#=C2=A0=C2=A0=C2=A0non-M= B: invalid byte or field list >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0#=C2=A0=C2=A0=C2=A0MB:= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0invalid byte, character or field list >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# Adjust the expected er= ror output accordingly. >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (grep {ref $_ eq 'HAS= H' && exists $_->{ERR} && $_->{ERR}=20 >> eq >> $inval} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= (@new_t)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= my $sub =3D {ERR_SUBST =3D> 's/, character//'}; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= push @new_t, $sub; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= push @$t, $sub; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0#Adjust the output some = error messages including test_name=20 >> for mb >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (grep {ref $_ eq 'HAS= H' && exists $_->{ERR}} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0(@new_t)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= my $sub2 =3D {ERR_SUBST =3D> "s/$test_name-mb/$test_name/"}; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= push @new_t, $sub2; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= push @$t, $sub2; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0push @new, ["$test_name-= mb", @new_t, {ENV =3D>=20 >> "LC_ALL=3D$mb_locale"}]; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0push @Tests, @new; >> ++=C2=A0=C2=A0} >> ++ >> + @Tests =3D triple_test \@Tests; >> +=C2=A0 >> ++#skip invalid-j-mb test, it is failing because of the format >> ++(a)Tests =3D grep {$_->[0] ne 'invalid-j-mb'} @Tests; >> ++ >> + my $save_temps =3D $ENV{DEBUG}; >> + my $verbose =3D $ENV{VERBOSE}; >> +=C2=A0 >> +diff -Naurp coreutils-8.25-orig/tests/misc/sort-mb-tests.sh=20 >> coreutils- >> 8.25/tests/misc/sort-mb-tests.sh >> +--- coreutils-8.25-orig/tests/misc/sort-mb-tests.sh 1969-12-31 >> 18:00:00.000000000 -0600 >> ++++ coreutils-8.25/tests/misc/sort-mb-tests.sh 2016-02-08 >> 19:07:10.315944664 -0600 >> +@@ -0,0 +1,45 @@ >> ++#!/bin/sh >> ++# Verify sort's multi-byte support. >> ++ >> ++. "${srcdir=3D.}/tests/init.sh"; path_prepend_ ./src >> ++print_ver_ sort >> ++ >> ++export LC_ALL=3Den_US.UTF-8 >> ++locale -k LC_CTYPE | grep -q "charmap.*UTF-8" \ >> ++=C2=A0=C2=A0|| skip_ "No UTF-8 locale available" >> ++ >> ++ >> ++cat < exp >> ++Banana=EF=BC=A05 >> ++Apple=EF=BC=A010 >> ++Citrus=EF=BC=A020 >> ++Cherry=EF=BC=A030 >> ++EOF >> ++ >> ++cat < out || fail=3D1 >> ++Apple=EF=BC=A010 >> ++Banana=EF=BC=A05 >> ++Citrus=EF=BC=A020 >> ++Cherry=EF=BC=A030 >> ++EOF >> ++ >> ++compare exp out || { fail=3D1; cat out; } >> ++ >> ++ >> ++cat < exp >> ++Citrus=EF=BC=A0=EF=BC=A1=EF=BC=A120=EF=BC=A0=EF=BC=A05 >> ++Cherry=EF=BC=A0=EF=BC=A1=EF=BC=A130=EF=BC=A0=EF=BC=A010 >> ++Apple=EF=BC=A0=EF=BC=A1=EF=BC=A110=EF=BC=A0=EF=BC=A020 >> ++Banana=EF=BC=A0=EF=BC=A1=EF=BC=A15=EF=BC=A0=EF=BC=A030 >> ++EOF >> ++ >> ++cat < out || fail=3D1 >> ++Apple=EF=BC=A0=EF=BC=A1=EF=BC=A110=EF=BC=A0=EF=BC=A020 >> ++Banana=EF=BC=A0=EF=BC=A1=EF=BC=A15=EF=BC=A0=EF=BC=A030 >> ++Citrus=EF=BC=A0=EF=BC=A1=EF=BC=A120=EF=BC=A0=EF=BC=A05 >> ++Cherry=EF=BC=A0=EF=BC=A1=EF=BC=A130=EF=BC=A0=EF=BC=A010 >> ++EOF >> ++ >> ++compare exp out || { fail=3D1; cat out; } >> ++ >> ++Exit $fail >> +diff -Naurp coreutils-8.25-orig/tests/misc/sort-merge.pl coreutils- >> 8.25/tests/misc/sort-merge.pl >> +--- coreutils-8.25-orig/tests/misc/sort-merge.pl 2016-01-16 >> 12:18:14.000000000 -0600 >> ++++ coreutils-8.25/tests/misc/sort-merge.pl 2016-02-08 >> 19:07:10.316944667 -0600 >> +@@ -26,6 +26,15 @@ my $prog =3D 'sort'; >> + # Turn off localization of executable's output. >> + @ENV{qw(LANGUAGE LANG LC_ALL)} =3D ('C') x 3; >> +=C2=A0 >> ++my $mb_locale; >> ++# uncommented according to upstream commit enabling multibyte paths >> ++$mb_locale =3D $ENV{LOCALE_FR_UTF8}; >> ++! defined $mb_locale || $mb_locale eq 'none' >> ++ and $mb_locale =3D 'C'; >> ++ >> ++my $try =3D "Try \`$prog --help' for more information.\n"; >> ++my $inval =3D "$prog: invalid byte, character or field list\n$try"; >> ++ >> + # three empty files and one that says 'foo' >> + my @inputs =3D (+(map{{IN=3D> {"empty$_"=3D> ''}}}1..3), {IN=3D> {foo=3D= >=20 >> "foo\n"}}); >> +=C2=A0 >> +@@ -77,6 +86,39 @@ my @Tests =3D >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{OUT=3D>$big_input}= ], >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0); >> +=C2=A0 >> ++# Add _POSIX2_VERSION=3D199209 to the environment of each test >> ++# that uses an old-style option like +1. >> ++if ($mb_locale ne 'C') >> ++=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0# Duplicate each test vector, appending "-mb" to= the test name=20 >> and >> ++=C2=A0=C2=A0=C2=A0=C2=A0# inserting {ENV =3D> "LC_ALL=3D$mb_locale"} in = the copy, so that we >> ++=C2=A0=C2=A0=C2=A0=C2=A0# provide coverage for the distro-added multi-by= te code paths. >> ++=C2=A0=C2=A0=C2=A0=C2=A0my @new; >> ++=C2=A0=C2=A0=C2=A0=C2=A0foreach my $t (@Tests) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0my @new_t =3D @$t; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0my $test_name =3D shift = @new_t; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# Depending on whether s= ort is multi-byte-patched, >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# it emits different dia= gnostics: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0#=C2=A0=C2=A0=C2=A0non-M= B: invalid byte or field list >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0#=C2=A0=C2=A0=C2=A0MB:= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0invalid byte, character or field list >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# Adjust the expected er= ror output accordingly. >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (grep {ref $_ eq 'HAS= H' && exists $_->{ERR} && $_->{ERR}=20 >> eq >> $inval} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= (@new_t)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= my $sub =3D {ERR_SUBST =3D> 's/, character//'}; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= push @new_t, $sub; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= push @$t, $sub; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0next if ($test_name =3D~= "nmerge-."); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0push @new, ["$test_name-= mb", @new_t, {ENV =3D>=20 >> "LC_ALL=3D$mb_locale"}]; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0push @Tests, @new; >> ++=C2=A0=C2=A0} >> ++ >> ++(a)Tests =3D triple_test \@Tests; >> ++ >> + my $save_temps =3D $ENV{DEBUG}; >> + my $verbose =3D $ENV{VERBOSE}; >> +=C2=A0 >> +diff -Naurp coreutils-8.25-orig/tests/misc/sort.pl coreutils- >> 8.25/tests/misc/sort.pl >> +--- coreutils-8.25-orig/tests/misc/sort.pl 2016-01-16 >> 12:18:14.000000000 -0600 >> ++++ coreutils-8.25/tests/misc/sort.pl 2016-02-08 19:07:10.316944667 >> -0600 >> +@@ -24,10 +24,15 @@ my $prog =3D 'sort'; >> + # Turn off localization of executable's output. >> + @ENV{qw(LANGUAGE LANG LC_ALL)} =3D ('C') x 3; >> +=C2=A0 >> +-my $mb_locale =3D $ENV{LOCALE_FR_UTF8}; >> ++my $mb_locale; >> ++#Comment out next line to disable multibyte tests >> ++$mb_locale =3D $ENV{LOCALE_FR_UTF8}; >> + ! defined $mb_locale || $mb_locale eq 'none' >> +=C2=A0=C2=A0=C2=A0and $mb_locale =3D 'C'; >> +=C2=A0 >> ++my $try =3D "Try \`$prog --help' for more information.\n"; >> ++my $inval =3D "$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 '-'. >> +@@ -424,6 +429,38 @@ foreach my $t (@Tests) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> +=C2=A0=C2=A0=C2=A0} >> +=C2=A0 >> ++if ($mb_locale ne 'C') >> ++=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0# Duplicate each test vector, appending "-mb" to= the test name=20 >> and >> ++=C2=A0=C2=A0=C2=A0=C2=A0# inserting {ENV =3D> "LC_ALL=3D$mb_locale"} in = the copy, so that we >> ++=C2=A0=C2=A0=C2=A0=C2=A0# provide coverage for the distro-added multi-by= te code paths. >> ++=C2=A0=C2=A0=C2=A0=C2=A0my @new; >> ++=C2=A0=C2=A0=C2=A0=C2=A0foreach my $t (@Tests) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0my @new_t =3D @$t; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0my $test_name =3D shift = @new_t; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# Depending on whether s= ort is multi-byte-patched, >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# it emits different dia= gnostics: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0#=C2=A0=C2=A0=C2=A0non-M= B: invalid byte or field list >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0#=C2=A0=C2=A0=C2=A0MB:= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0invalid byte, character or field list >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# Adjust the expected er= ror output accordingly. >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (grep {ref $_ eq 'HAS= H' && exists $_->{ERR} && $_->{ERR}=20 >> eq >> $inval} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= (@new_t)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= my $sub =3D {ERR_SUBST =3D> 's/, character//'}; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= push @new_t, $sub; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= push @$t, $sub; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0#disable several failing= tests until investigation, disable=20 >> all >> tests with envvars set >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0next if (grep {ref $_ eq= 'HASH' && exists $_->{ENV}}=20 >> (@new_t)); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0next if ($test_name =3D~= "18g" or $test_name =3D~ "sort-numeric"=20 >> or >> $test_name =3D~ "08[ab]" or $test_name =3D~ "03[def]" or $test_name =3D~=20 >> "h4" or >> $test_name =3D~ "n1" or $test_name =3D~ "2[01]a"); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0next if ($test_name =3D~= "11[ab]"); # avoid FP: expected=20 >> result >> differs to MB result due to collation rules. >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0push @new, ["$test_name-= mb", @new_t, {ENV =3D>=20 >> "LC_ALL=3D$mb_locale"}]; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0push @Tests, @new; >> ++=C2=A0=C2=A0=C2=A0} >> ++ >> + @Tests =3D triple_test \@Tests; >> +=C2=A0 >> + # Remember that triple_test creates from each test with exactly one=20 >> "IN" >> +@@ -433,6 +470,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 =3D grep {$_->[0] ne 'output-is-input.p'} @Tests; >> ++(a)Tests =3D grep {$_->[0] ne 'output-is-input-mb.p'} @Tests; >> +=C2=A0 >> + my $save_temps =3D $ENV{DEBUG}; >> + my $verbose =3D $ENV{VERBOSE}; >> +diff -Naurp coreutils-8.25-orig/tests/misc/unexpand.pl coreutils- >> 8.25/tests/misc/unexpand.pl >> +--- coreutils-8.25-orig/tests/misc/unexpand.pl 2016-01-16 >> 12:18:14.000000000 -0600 >> ++++ coreutils-8.25/tests/misc/unexpand.pl 2016-02-08 >> 19:07:10.317944671 -0600 >> +@@ -27,6 +27,14 @@ my $limits =3D getlimits (); >> +=C2=A0 >> + my $prog =3D 'unexpand'; >> +=C2=A0 >> ++# comment out next line to disable multibyte tests >> ++my $mb_locale =3D $ENV{LOCALE_FR_UTF8}; >> ++! defined $mb_locale || $mb_locale eq 'none' >> ++ and $mb_locale =3D 'C'; >> ++ >> ++my $try =3D "Try \`$prog --help' for more information.\n"; >> ++my $inval =3D "$prog: invalid byte, character or field list\n$try"; >> ++ >> + my @Tests =3D >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0( >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0['a1', {IN=3D> ' 'x 1 ."y\n"}, {OUT= =3D> ' 'x 1 ."y\n"}], >> +@@ -92,6 +100,37 @@ my @Tests =3D >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{EXIT =3D> 1}, {ERR =3D> "$prog= : tab stop value is too large\n"}], >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0); >> +=C2=A0 >> ++if ($mb_locale ne 'C') >> ++=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0# Duplicate each test vector, appending "-mb" to= the test name=20 >> and >> ++=C2=A0=C2=A0=C2=A0=C2=A0# inserting {ENV =3D> "LC_ALL=3D$mb_locale"} in = the copy, so that we >> ++=C2=A0=C2=A0=C2=A0=C2=A0# provide coverage for the distro-added multi-by= te code paths. >> ++=C2=A0=C2=A0=C2=A0=C2=A0my @new; >> ++=C2=A0=C2=A0=C2=A0=C2=A0foreach my $t (@Tests) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0my @new_t =3D @$t; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0my $test_name =3D shift = @new_t; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# Depending on whether u= nexpand is multi-byte-patched, >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# it emits different dia= gnostics: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0#=C2=A0=C2=A0=C2=A0non-M= B: invalid byte or field list >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0#=C2=A0=C2=A0=C2=A0MB:= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0invalid byte, character or field list >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# Adjust the expected er= ror output accordingly. >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (grep {ref $_ eq 'HAS= H' && exists $_->{ERR} && $_->{ERR}=20 >> eq >> $inval} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= (@new_t)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= my $sub =3D {ERR_SUBST =3D> 's/, character//'}; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= push @new_t, $sub; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= push @$t, $sub; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0next if ($test_name =3D~= 'b-1'); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0push @new, ["$test_name-= mb", @new_t, {ENV =3D>=20 >> "LC_ALL=3D$mb_locale"}]; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0push @Tests, @new; >> ++=C2=A0=C2=A0} >> ++ >> ++(a)Tests =3D triple_test \@Tests; >> ++ >> + my $save_temps =3D $ENV{DEBUG}; >> + my $verbose =3D $ENV{VERBOSE}; >> +=C2=A0 >> +diff -Naurp coreutils-8.25-orig/tests/misc/uniq.pl coreutils- >> 8.25/tests/misc/uniq.pl >> +--- coreutils-8.25-orig/tests/misc/uniq.pl 2016-01-16 >> 12:18:14.000000000 -0600 >> ++++ coreutils-8.25/tests/misc/uniq.pl 2016-02-08 19:07:10.317944671 >> -0600 >> +@@ -23,9 +23,17 @@ my $limits =3D getlimits (); >> + my $prog =3D 'uniq'; >> + my $try =3D "Try '$prog --help' for more information.\n"; >> +=C2=A0 >> ++my $inval =3D "$prog: invalid byte, character or field list\n$try"; >> ++ >> + # Turn off localization of executable's output. >> + @ENV{qw(LANGUAGE LANG LC_ALL)} =3D ('C') x 3; >> +=C2=A0 >> ++my $mb_locale; >> ++#Comment out next line to disable multibyte tests >> ++$mb_locale =3D $ENV{LOCALE_FR_UTF8}; >> ++! defined $mb_locale || $mb_locale eq 'none' >> ++=C2=A0=C2=A0and $mb_locale =3D 'C'; >> ++ >> + # When possible, create a "-z"-testing variant of each test. >> + sub add_z_variants($) >> + { >> +@@ -262,6 +270,53 @@ foreach my $t (@Tests) >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0and push @$t, {ENV=3D>'_POSIX2_= VERSION=3D199209'}; >> +=C2=A0=C2=A0=C2=A0} >> +=C2=A0 >> ++if ($mb_locale ne 'C') >> ++=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0# Duplicate each test vector, appending "-mb" to= the test name=20 >> and >> ++=C2=A0=C2=A0=C2=A0=C2=A0# inserting {ENV =3D> "LC_ALL=3D$mb_locale"} in = the copy, so that we >> ++=C2=A0=C2=A0=C2=A0=C2=A0# provide coverage for the distro-added multi-by= te code paths. >> ++=C2=A0=C2=A0=C2=A0=C2=A0my @new; >> ++=C2=A0=C2=A0=C2=A0=C2=A0foreach my $t (@Tests) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0my @new_t =3D @$t; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0my $test_name =3D shift = @new_t; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# Depending on whether u= niq is multi-byte-patched, >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# it emits different dia= gnostics: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0#=C2=A0=C2=A0=C2=A0non-M= B: invalid byte or field list >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0#=C2=A0=C2=A0=C2=A0MB:= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0invalid byte, character or field list >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# Adjust the expected er= ror output accordingly. >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (grep {ref $_ eq 'HAS= H' && exists $_->{ERR} && $_->{ERR}=20 >> eq >> $inval} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= (@new_t)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= my $sub =3D {ERR_SUBST =3D> 's/, character//'}; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= push @new_t, $sub; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= push @$t, $sub; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# In test #145, replace = the each =E2=80=98...=E2=80=99 by '...'. >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if ($test_name =3D~ "145= ") >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= my $sub =3D { ERR_SUBST =3D> "s/=E2=80=98([^=E2=80=99]+)=E2=80=99/'\$1'/g"}; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= push @new_t, $sub; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= push @$t, $sub; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0next if (=C2=A0=C2=A0=C2= =A0$test_name =3D~ "schar" >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0or $test_name =3D~ "^obs-plus" >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0or $test_name =3D~ "119"); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0push @new, ["$test_name-= mb", @new_t, {ENV =3D>=20 >> "LC_ALL=3D$mb_locale"}]; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0push @Tests, @new; >> ++=C2=A0=C2=A0=C2=A0} >> ++ >> ++# Remember that triple_test creates from each test with exactly one=20 >> "IN" >> ++# file two more tests (.p and .r suffix on name) corresponding to=20 >> reading >> ++# input from a file and from a pipe.=C2=A0=C2=A0The pipe-reading test wo= uld=20 >> 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. >> ++ >> ++(a)Tests =3D grep {$_->[0] ne 'output-is-input.p'} @Tests; >> ++ >> + @Tests =3D add_z_variants \@Tests; >> + @Tests =3D triple_test \@Tests; >> +=C2=A0 >> +diff -Naurp coreutils-8.25-orig/tests/pr/pr-tests.pl coreutils- >> 8.25/tests/pr/pr-tests.pl >> +--- coreutils-8.25-orig/tests/pr/pr-tests.pl 2016-01-16 >> 12:18:14.000000000 -0600 >> ++++ coreutils-8.25/tests/pr/pr-tests.pl 2016-02-08 19:07:10.318944674 >> -0600 >> +@@ -24,6 +24,15 @@ use strict; >> + my $prog =3D 'pr'; >> + my $normalize_strerror =3D "s/': .*/'/"; >> +=C2=A0 >> ++my $mb_locale; >> ++#Uncomment the following line to enable multibyte tests >> ++$mb_locale =3D $ENV{LOCALE_FR_UTF8}; >> ++! defined $mb_locale || $mb_locale eq 'none' >> ++=C2=A0=C2=A0and $mb_locale =3D 'C'; >> ++ >> ++my $try =3D "Try \`$prog --help' for more information.\n"; >> ++my $inval =3D "$prog: invalid byte, character or field list\n$try"; >> ++ >> + my @tv =3D ( >> +=C2=A0 >> + # -b option is no longer an official option. But it's still working=20 >> to >> +@@ -467,8 +476,48 @@ push @Tests, >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{IN=3D>{3=3D>"x\ty\tz\n"}}, >> +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{OUT=3D>join("\t", qw(a b c m n o x y= z)) . "\n"} ]; >> +=C2=A0 >> ++# Add _POSIX2_VERSION=3D199209 to the environment of each test >> ++# that uses an old-style option like +1. >> ++if ($mb_locale ne 'C') >> ++=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0# Duplicate each test vector, appending "-mb" to= the test name=20 >> and >> ++=C2=A0=C2=A0=C2=A0=C2=A0# inserting {ENV =3D> "LC_ALL=3D$mb_locale"} in = the copy, so that we >> ++=C2=A0=C2=A0=C2=A0=C2=A0# provide coverage for the distro-added multi-by= te code paths. >> ++=C2=A0=C2=A0=C2=A0=C2=A0my @new; >> ++=C2=A0=C2=A0=C2=A0=C2=A0foreach my $t (@Tests) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0my @new_t =3D @$t; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0my $test_name =3D shift = @new_t; >> ++ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# Depending on whether p= r is multi-byte-patched, >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# it emits different dia= gnostics: >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0#=C2=A0=C2=A0=C2=A0non-M= B: invalid byte or field list >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0#=C2=A0=C2=A0=C2=A0MB:= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0invalid byte, character or field list >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# Adjust the expected er= ror output accordingly. >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (grep {ref $_ eq 'HAS= H' && exists $_->{ERR} && $_->{ERR}=20 >> eq >> $inval} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= (@new_t)) >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= my $sub =3D {ERR_SUBST =3D> 's/, character//'}; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= push @new_t, $sub; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= push @$t, $sub; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0#temporarily skip some f= ailing tests >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0next if ($test_name =3D~= "col-0" or $test_name =3D~=20 >> "col-inval"); >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0push @new, ["$test_name-= mb", @new_t, {ENV =3D>=20 >> "LC_ALL=3D$mb_locale"}]; >> ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0} >> ++=C2=A0=C2=A0=C2=A0=C2=A0push @Tests, @new; >> ++=C2=A0=C2=A0} >> ++ >> + @Tests =3D triple_test \@Tests; >> +=C2=A0 >> ++# Remember that triple_test creates from each test with exactly one=20 >> "IN" >> ++# file two more tests (.p and .r suffix on name) corresponding to=20 >> reading >> ++# input from a file and from a pipe.=C2=A0=C2=A0The pipe-reading test wo= uld=20 >> 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. >> ++(a)Tests =3D grep {$_->[0] ne 'output-is-input.p'} @Tests; >> ++ >> + my $save_temps =3D $ENV{DEBUG}; >> + my $verbose =3D $ENV{VERBOSE}; >> +=C2=A0 --===============1533347033086643886==--