From mboxrd@z Thu Jan 1 00:00:00 1970 From: Michael Tremer To: development@lists.ipfire.org Subject: Re: [PATCH] coreutils: update to 8.25 Date: Fri, 08 Apr 2016 16:56:16 +0100 Message-ID: <1460130976.30749.403.camel@ipfire.org> In-Reply-To: <1460025461-7651-1-git-send-email-marcel.lorenz@ipfire.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============3946260674805803724==" List-Id: --===============3946260674805803724== Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Hi, we have to focus more on quality over quantity here: 1) The rootfile has changed but is not included in this patch. 2) Why is uptime not built any more (this alone will trigger a rootfile chang= e)? 3) Include comments about why you think adding the i18n patch is required 4) Why are the sorting tests being disabled but no testsuite is executed at a= ll? 5) This package is part of the toolchain. Can you confirm that the toolchain still builds (on at least both x86 architectures)? Best, -Michael 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 40efdbce865d2458d8da0a9dc= ee7c16c > +$(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 070e43ba7f618d747414ef56a= b248a48 > =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 b/src/patches/coreutil= s- > 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=A0Reje= cted > +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 htt= ps://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 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 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 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} =09 > \ > +=C2=A0=C2=A0=C2=A0while (0) > +=C2=A0 > ++/* Refill the buffer BUF to get a multibyte character. */ > ++#define REFILL_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=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 (STR= EAM) && !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, 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 f= read (BUF + BUFLEN, sizeof(char), BUFSIZ, 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. 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 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. */=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=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 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, &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 (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 (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 throu= gn. > */=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0\ > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=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 sele= cted > +=C2=A0=C2=A0=C2=A0=C2=A0by a finite range, we check if it is between CURRE= NT_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 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 in= cludes (does > +=C2=A0=C2=A0=C2=A0=C2=A0not include) the first field.=C2=A0=C2=A0In both o= f 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 positi= ons. */ > ++=C2=A0=C2=A0=C2=A0=C2=A0character_mode, > ++ > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Output the given delimiter-separated fiel= ds. */ > +=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 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=A0= This 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 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, 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 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 ou= tput any selected > ++=C2=A0=C2=A0=C2=A0characters. > ++ > ++=C2=A0=C2=A0=C2=A02. Read from stream STREAM, printing to standard output= any 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 line so > far. */ > ++=C2=A0=C2=A0char buf[MB_LEN_MAX + BUFSIZ];=C2=A0=C2=A0/* For spooling a r= ead byte 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 BUF.= */ > ++=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. */ > ++=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 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 false. > */ > ++=C2=A0=C2=A0/* Whether to begin printing delimiters between ranges for th= e current > line. > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0Set after we've begun printing data corresp= onding 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, s= tream); > ++ > ++=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/* ignore= 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=A0p= utchar (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 (line= _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_delimit= er =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 (&i= dx); > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (print_kth= (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 (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 r= ead byte 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 BUF.= */ > ++=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. */ > ++=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 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 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 bu= ffer > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0all of the first field to determine whether= it is `delimited.' > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0But that is unnecessary if all non-delimite= d lines must be printed > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0and the first field has been selected, or i= f non-delimited 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 ex= actly 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_firs= t_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 + 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=A0b= reak; > ++ > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* If the fir= st field extends to the end of line (it is 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, 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 t= erminated.=C2=A0=C2=A0*/ > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=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_kth= (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 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, 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 (&f= ield_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_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=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 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_deli= m) && 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 || (!convfail= && 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_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|| (!empty_input && !(suppress_non_delimited && 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=A0p= utchar (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=A0b= reak; > ++=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_sel= ected_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_mode= _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=A0c= ut_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=A0c= ut_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_character= s_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 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, 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, "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_mb= (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/* Build= 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 (oper= ating_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 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_lis= t_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 (operating= _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=A0F= ATAL_ERROR (_("only one type of list may be specified")); > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0operating_mod= e =3D character_mode; > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0spec_list_str= ing =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/* Build= 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 (oper= ating_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 d= elimiter. */ > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Inter= pret -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=A0F= ATAL_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=A0delim =3D opt= arg[0]; > +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0delim_specifi= ed =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, s= trnlen(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 (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) !=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 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=A0d= elim_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_DELIMITE= R_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_cha= racter_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_singleby= te_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_delimi= ter_string =3D xstrdup(mbdelim); > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0output_delimi= ter_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_single= byte_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 d= ummy[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_delimi= ter_string =3D dummy; > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0output_delimi= ter_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 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 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 r= ead byte 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(mbsta= te_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, bu= flen, &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), mbleng= th, 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_arg= v); > +=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 -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 config= uration 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 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 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, (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 (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. */ > + static bool have_read_stdin; > +=C2=A0 > +-static char const shortopts[] =3D "bsw:0::1::2::3::4::5::6::7::8::9::"; > ++static char const shortopts[] =3D "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 rath= er 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 i= nstead 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 w= ill > go. */ > +=C2=A0=C2=A0=C2=A0size_t offset_out =3D 0; /* Index in 'line_out' for next= 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 (filena= me)); > +-=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 r= ead byte 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 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 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 conversion i= s 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 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_blan= k =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_n= um =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 (ist= ream) && !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=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 f= read (buf + buflen, sizeof(char), BUFSIZ, istream); > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0bufpos =3D bu= f; > ++=C2=A0=C2=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 sta= te_bak; > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* Fall throu= gh. */ > ++ > ++=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/* 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 charac= ter_mode)=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0/* character 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 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=A0i= ncrement =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, 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 && bre= ak_spaces && 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 co= lumn - last_blank_column + ((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 (line= _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 && col= umn !=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_LIN= E; > ++=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 + 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=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, bufpos= , 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 && !co= nvfail && wc =3D=3D L'\b') > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0++bs_following_last_blank= _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_blan= k =3D 0; > ++ > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (break_spaces && !convfail && iswb= lank (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_po= s =3D offset_out; > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0last_blank_co= lumn =3D column; > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0is_blank_seen= =3D 1; > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0last_blank_in= crement =3D increment; > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0is_bs_followi= ng_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_l= ast_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) of= fset_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 (filena= me)); > ++=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_errno= ); > ++=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", quo= tef (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, lon= gopts, 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 (operating= _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=A0F= ATAL_ERROR (_("only one way of folding may be specified")); > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0operating_mod= e =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 (operating= _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=A0F= ATAL_ERROR (_("only one way of folding may be specified")); > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0operating_mod= e =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 -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 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 se= parated > +-=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 TAB.=C2=A0=C2=A0*/ > +-static int tab =3D -1; > ++/* Tab character separating fields.=C2=A0=C2=A0If NULL, fields are separa= ted > ++=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, lim= - ptr)) !=3D NULL; ptr =3D sep + 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 + 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 th= e 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 + mblen= gth) > ++ { > ++ =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 || mb= length =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 : mb= length; > ++ > ++ =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (mblength =3D=3D tablen && !memcm= p (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 fir= st 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 (&wc= , ptr, lim - ptr + 1, &state); > ++ > ++=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=A0m= blength =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=A0s= tate =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=A0b= reak; > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=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 || mb= length =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 : mb= length; > ++ > ++ =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 || mb= length =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 : mb= length; > ++ > ++ =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 w= ith NLS (in particular, > +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0with multibyte char= s).=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_ba= k; > ++ > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0memset (&state, '\0', siz= eof (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=A0m= allocd =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=A0c= opy[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=A0m= emset (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=A0f= or (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, &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=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 (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, &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=A0c= opy[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=A0m= allocd =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=A0c= opy[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=A0f= or (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=A0c= opy[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, le= n1, beg2, len2); > +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0diff =3D memcmp (beg1, beg2, MIN (len= 1, 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], 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 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 =09 > \ > ++=C2=A0=C2=A0do =09 > \ > ++=C2=A0=C2=A0=C2=A0=C2=A0{ =09 > \ > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0(tab !=3D NULL) ? =09 > \ > ++ fwrite(tab, sizeof(char), tablen, stdout) : putchar (' '); \ > ++=C2=A0=C2=A0=C2=A0=C2=A0} =09 > \ > ++=C2=A0=C2=A0while (0) > ++ > + static void > + prfields (struct line const *line, size_t join_field, size_t autocount) > + { > +=C2=A0=C2=A0=C2=A0size_t i; > +=C2=A0=C2=A0=C2=A0size_t nfields =3D autoformat ? autocount : line->nfield= s; > +-=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 (outp= ut_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=A0u= nsigned 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=A0c= har *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=A0s= ize_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=A0n= ewtab =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=A0i= f (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=A0e= lse > ++#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 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 %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=A0i= f (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=A0i= f (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=A0t= ablen =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 .= =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 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 for > ++=C2=A0=C2=A0=C2=A0multibyte locale. If multibyte functions do not exist i= n your sysytem, > ++=C2=A0=C2=A0=C2=A0these pointers always point the function for single byt= e locale. */ > ++static void (*print_char) (char c); > ++static int (*char_to_clump) (char c); > ++ > ++/* Functions for single byte locale. */ > ++static void print_char_single (char c); > ++static int char_to_clump_single (char c); > ++ > ++/* Functions for multibyte locale. */ > ++static void print_char_multi (char c); > ++static int char_to_clump_multi (char c); > ++ > + static bool read_line (COLUMN *p); > + static bool print_page (void); > + static bool print_stored (COLUMN *p); > +@@ -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 buff. > +=C2=A0=C2=A0=C2=A0=C2=A0To print a line from buff, get the index of the fi= rst 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, 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 number. = */ > ++static int number_separator_length =3D 1; > ++ > ++/* (-n) The character width of the character which follows each line numb= er. > */ > ++static int number_separator_width =3D 0; > +=C2=A0 > + /* (-n) line counting starts with 1st line of input file (not with 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 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_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=A0print_char =3D print_char_single; > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0char_to_clump =3D char_to_clump_singl= e; > ++=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 (opta= rg) > +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0g= etoptarg (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/* Could= 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=A0untabify= _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 (opta= rg) > +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0g= etoptarg (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/* Could= 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_o= utput =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=A0numbered= _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 (opta= rg) > +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0g= etoptarg (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=A0g= etoptarg (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_cou= nt =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/* Reset= 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_lengt= h =3D 0; > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0col_sep_lengt= h =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 (opta= rg) > +=C2=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 *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 *ch= aracter_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 mbleng= th; > ++=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 sta= te =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), &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 (char= acter, arg, *character_length); > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0arg +=3D *cha= racter_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_le= ngth =3D 1; > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0*character_wi= dth =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 - l= ines_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_lengt= h =3D 1; > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0col_sep_lengt= h =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 defi= ne 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, 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 witho= ut any margin and keep it 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 (ch= ars_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_pe= r_number + 1; > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0number_width =3D chars_pe= r_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 col= umn width unless we are > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0printing files= 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_num= ber > +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=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 na= rrow")); > +@@ -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 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 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 ANYWHERE; > +=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 m= ultiple 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 over > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0equal column_w= idth 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 nu= mber_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_se= parator); > ++=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_func= ) (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 expans= ion of default TAB > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0separator with a single co= lumn output. No column_width 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_le= ngth; j++) > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0(p->char_func) (number_se= parator[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 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_fla= g =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 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_space= _flag) > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0o= utput_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_s= tring 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 (spac= es_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_p= os, &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 (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=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0c= ase (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=A0c= ase (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=A0c= ase 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=A0d= efault: > ++=C2=A0=C2=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 = - 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 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_em= pty_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_len= gth > 0) > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (padding_not_printed - col_sep_wid= th > 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_to= (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_to= (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 ANYWHERE; > +=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_pos= ition + end_vector[line]; > +-=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (p->start_position - col_sep_lengt= 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_length; > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (p->start_position - col_sep_width= =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 sta= te_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 sta= te_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_s= equence || 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 (m= bc, 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=A0c= hars_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 (m= bc, input_tab_char, mblength) =3D=3D 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=A0{ > ++=C2=A0=C2=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) 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 neg= ative. */ > ++=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 bat= ch 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 -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 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 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 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 (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 (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. */=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=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 field= s are > ++/* Tab character separating fields.=C2=A0=C2=A0If tab_length is 0, then f= ields are > +=C2=A0=C2=A0=C2=A0=C2=A0separated by the empty string between a non-blank = character and a 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 be= 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 ch= aracter. */ > ++#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 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 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 (mbst= ate_t)); > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0memset (&state_wc, '\0', sizeof (mbst= ate_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 (!ismbblan= k (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=A0b= reak; > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0j +=3D mbleng= th; > ++=C2=A0=C2=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 (mblen= gth !=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=A0b= reak; > ++ > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0pwc =3D towup= per (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 (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=A0n= ame[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_c= mp); > ++ > ++=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 f= ield when -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 && memcm= p (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=A0G= ET_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=A0p= tr +=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=A0G= ET_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=A0p= tr +=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 && ismbb= lank (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 mble= ngth; > ++=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=A0G= ET_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=A0p= tr +=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 && !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 mble= ngth; > ++=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, &m= blength)) > ++=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, mbleng= th, 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 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 fol= lowing the delimiting TAB. > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0Otherwise, leave PTR pointing at the f= irst 'blank' character 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 && (ew= ord || 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 curr= ent 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 - pt= r); > ++=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 && memcm= p (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=A0G= ET_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=A0p= tr +=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=A0G= ET_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=A0p= tr +=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 && ismbb= lank (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 mble= ngth; > ++=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=A0G= ET_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=A0p= tr +=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 && !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 mble= ngth; > ++=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 f= ield.=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_O= F_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 mbleng= th; > ++=C2=A0=C2=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 (new= lim, lim - newlim, &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_O= F_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 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=A0while (newlim < lim && !ismbblank (ne= wlim, lim - newlim, &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 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, l= im - 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 fur= ther than 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 mble= ngth; > ++=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 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 - 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 : le= n, > &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 : le= n, > &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 glibc's > +=C2=A0=C2=A0=C2=A0=C2=A0strtold ("NaN", ...) contains uninitialized bits: = clear all bytes 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 sav= ed =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 (blanks= [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=A0b= eg++; > ++=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 *ti= ghter_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=A0g= etmonth (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=A0g= etmonth (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 !ha= rd_LC_COLLATE && 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_DEFA= ULT && !line_offset > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (!gkey_only && !tab_length && !lin= e_offset > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0&& ((!ke= y->skipsblanks && !(implicit_skip || 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 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 inpu= t %s."), 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, = &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].name= , strlen (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 (month= tab[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].na= me); > ++ > ++=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 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=A0d= iff =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=A0d= iff =3D getmonth (ta, tlena, NULL) - getmonth (tb, tlenb, 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 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 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 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 (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 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 (!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 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 (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 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 (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 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, 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 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 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 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, &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 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 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=A0f= or (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=A0COPY[NEW_LEN++] =3D 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 '\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->transl= ate; > ++=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=A0x= alloc_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, 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_le= n_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 cop= y_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 ke= ys 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 text= a[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 text= b[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 | 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 *li= mb =3D '\0'; > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0diff =3D (key= ->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 (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 sav= ea, *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 (text= a, 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, 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 xmem= coll0 (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 memc= mp (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=A0d= iff =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 th= e 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, key= ), 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->len= gth - 1, limb =3D b->text + b->length - 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, ke= y), 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->skip= sblanks) > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0{ > ++=C2=A0=C2=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 t= o, or greater 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 performan= ce enhancement as > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0it will not un= conditionally 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->tra= nslate =3D fold_toupper; > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0folding =3D t= rue; > +=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->gen= eral_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=A0c= har 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=A0i= f (! newtab) > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0c= har 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=A0s= ize_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=A0s= trncpy (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=A0i= f (! 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=A0i= f (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=A0i= f (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 (newt= ab, > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=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=A0i= f (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=A0i= f (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=A0i= f (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=A0t= ab =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=A0m= emcpy (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=A0t= ab_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, nt= hreads); > +=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 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 config= uration 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 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 r= ead byte 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 po= ssible. > */ > ++=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_sta= te); > ++ } > ++ > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (mblength =3D=3D (size_t)-1 || mbl= ength =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 && colu= mn < 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 first= _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_ind= ex]; > ++ =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_siz= e - 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 po= ssible, > ++ =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_i= ndex]) > ++ =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 pe= nding) > ++ { > ++ =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/* No= 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), mbleng= th, 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_arg= v); > +=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 -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 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 fi= eld to be 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, 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 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 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 *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 (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 (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 throu= gh > */=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=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_WCH= AR (wc, mblength, lp, pos, size, statep, 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 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=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_WCH= AR (wc, mblength, lp, pos, size, statep, 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=A0b= reak; > ++ > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0pos +=3D 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/* 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, po= s, size, statep, 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 lin= es > +=C2=A0=C2=A0=C2=A0=C2=A0but rather to the beginnings of the fields to comp= are. > +@@ -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 || memcasec= mp (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, oldle= n, 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, ol= dlen); > ++=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, 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; 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, &(state[i])); > ++ > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0switch (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=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0c= ase (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=A0c= ase (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=A0c= ase 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=A0d= efault: > ++=C2=A0=C2=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 mbleng= th; > ++=C2=A0=C2=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 output. > +=C2=A0=C2=A0=C2=A0=C2=A0MATCH is true if the line matches the previous lin= e. > +@@ -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 NU= LL); > +=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 fal= se; > ++#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 (mbs= tate_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 *th= isfield; > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0size_t t= hislen; > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0bool new= _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 thi= sstate; > ++#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 (read= linebuffer_delim (thisline, stdin, delimiter) =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=A0break; > +=C2=A0 > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0thisfiel= d =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 - 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_MA= X > 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, prevst= ate)); > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=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_grou= p =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 (prevli= ne, 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 (prevli= ne); > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0prevlen =3D prevline->length - 1= - (prevfield - 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 mat= ch; > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0char *th= isfield; > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0size_t t= hislen; > ++#if HAVE_MBRTOWC > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0mbstate_t thi= sstate =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 (read= linebuffer_delim (thisline, stdin, delimiter) =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=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=A0thisfiel= d =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 - 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_MA= X > 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, pre= vstate); > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=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, prevlen); > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0match_co= unt +=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=3D= 1 --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 > out= || 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 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 sh= ift @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_n= ame-mb", @new_t, {ENV =3D> "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 and > ++=C2=A0=C2=A0=C2=A0=C2=A0# inserting {ENV =3D> "LC_ALL=3D$mb_locale"} in t= he copy, so that we > ++=C2=A0=C2=A0=C2=A0=C2=A0# provide coverage for the distro-added multi-byt= e 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 ex= pand is multi-byte-patched, > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# it emits different diag= nostics: > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0#=C2=A0=C2=A0=C2=A0non-MB= : 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 err= or output accordingly. > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (grep {ref $_ eq 'HASH= ' && exists $_->{ERR} && $_->{ERR} 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=A0m= y $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=A0p= ush @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=A0p= ush @$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-m= b", @new_t, {ENV =3D> "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 and > ++=C2=A0=C2=A0=C2=A0=C2=A0# inserting {ENV =3D> "LC_ALL=3D$mb_locale"} in t= he copy, so that we > ++=C2=A0=C2=A0=C2=A0=C2=A0# provide coverage for the distro-added multi-byt= e 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 fo= ld is multi-byte-patched, > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# it emits different diag= nostics: > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0#=C2=A0=C2=A0=C2=A0non-MB= : 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 err= or output accordingly. > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (grep {ref $_ eq 'HASH= ' && exists $_->{ERR} && $_->{ERR} 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=A0m= y $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=A0p= ush @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=A0p= ush @$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-m= b", @new_t, {ENV =3D> "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 "IN" > ++# file two more tests (.p and .r suffix on name) corresponding to reading > ++# input from a file and from a pipe.=C2=A0=C2=A0The pipe-reading test wou= ld 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, $verb= ose); > + 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 and > ++=C2=A0=C2=A0=C2=A0=C2=A0# inserting {ENV =3D> "LC_ALL=3D$mb_locale"} in t= he copy, so that we > ++=C2=A0=C2=A0=C2=A0=C2=A0# provide coverage for the distro-added multi-byt= e 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 jo= in is multi-byte-patched, > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# it emits different diag= nostics: > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0#=C2=A0=C2=A0=C2=A0non-MB= : 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 err= or output accordingly. > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (grep {ref $_ eq 'HASH= ' && exists $_->{ERR} && $_->{ERR} 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=A0m= y $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=A0p= ush @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=A0p= ush @$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 e= rror messages including test_name for mb > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (grep {ref $_ eq 'HASH= ' && 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=A0m= y $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=A0p= ush @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=A0p= ush @$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-m= b", @new_t, {ENV =3D> "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 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>= "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 and > ++=C2=A0=C2=A0=C2=A0=C2=A0# inserting {ENV =3D> "LC_ALL=3D$mb_locale"} in t= he copy, so that we > ++=C2=A0=C2=A0=C2=A0=C2=A0# provide coverage for the distro-added multi-byt= e 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 so= rt is multi-byte-patched, > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# it emits different diag= nostics: > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0#=C2=A0=C2=A0=C2=A0non-MB= : 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 err= or output accordingly. > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (grep {ref $_ eq 'HASH= ' && exists $_->{ERR} && $_->{ERR} 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=A0m= y $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=A0p= ush @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=A0p= ush @$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-m= b", @new_t, {ENV =3D> "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 and > ++=C2=A0=C2=A0=C2=A0=C2=A0# inserting {ENV =3D> "LC_ALL=3D$mb_locale"} in t= he copy, so that we > ++=C2=A0=C2=A0=C2=A0=C2=A0# provide coverage for the distro-added multi-byt= e 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 so= rt is multi-byte-patched, > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# it emits different diag= nostics: > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0#=C2=A0=C2=A0=C2=A0non-MB= : 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 err= or output accordingly. > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (grep {ref $_ eq 'HASH= ' && exists $_->{ERR} && $_->{ERR} 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=A0m= y $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=A0p= ush @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=A0p= ush @$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 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}} (@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" or > $test_name =3D~ "08[ab]" or $test_name =3D~ "03[def]" or $test_name =3D~ "h= 4" 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 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-m= b", @new_t, {ENV =3D> "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 "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 and > ++=C2=A0=C2=A0=C2=A0=C2=A0# inserting {ENV =3D> "LC_ALL=3D$mb_locale"} in t= he copy, so that we > ++=C2=A0=C2=A0=C2=A0=C2=A0# provide coverage for the distro-added multi-byt= e 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 un= expand is multi-byte-patched, > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# it emits different diag= nostics: > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0#=C2=A0=C2=A0=C2=A0non-MB= : 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 err= or output accordingly. > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (grep {ref $_ eq 'HASH= ' && exists $_->{ERR} && $_->{ERR} 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=A0m= y $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=A0p= ush @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=A0p= ush @$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-m= b", @new_t, {ENV =3D> "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_V= ERSION=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 and > ++=C2=A0=C2=A0=C2=A0=C2=A0# inserting {ENV =3D> "LC_ALL=3D$mb_locale"} in t= he copy, so that we > ++=C2=A0=C2=A0=C2=A0=C2=A0# provide coverage for the distro-added multi-byt= e 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 un= iq is multi-byte-patched, > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# it emits different diag= nostics: > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0#=C2=A0=C2=A0=C2=A0non-MB= : 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 err= or output accordingly. > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (grep {ref $_ eq 'HASH= ' && exists $_->{ERR} && $_->{ERR} 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=A0m= y $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=A0p= ush @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=A0p= ush @$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 t= he 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=A0m= y $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=A0p= ush @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=A0p= ush @$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-m= b", @new_t, {ENV =3D> "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 "IN" > ++# file two more tests (.p and .r suffix on name) corresponding to reading > ++# input from a file and from a pipe.=C2=A0=C2=A0The pipe-reading test wou= ld 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 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 and > ++=C2=A0=C2=A0=C2=A0=C2=A0# inserting {ENV =3D> "LC_ALL=3D$mb_locale"} in t= he copy, so that we > ++=C2=A0=C2=A0=C2=A0=C2=A0# provide coverage for the distro-added multi-byt= e 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 pr= is multi-byte-patched, > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0# it emits different diag= nostics: > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0#=C2=A0=C2=A0=C2=A0non-MB= : 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 err= or output accordingly. > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0if (grep {ref $_ eq 'HASH= ' && exists $_->{ERR} && $_->{ERR} 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=A0m= y $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=A0p= ush @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=A0p= ush @$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 fa= iling 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~ "col-inval"); > ++=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0push @new, ["$test_name-m= b", @new_t, {ENV =3D> "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 "IN" > ++# file two more tests (.p and .r suffix on name) corresponding to reading > ++# input from a file and from a pipe.=C2=A0=C2=A0The pipe-reading test wou= ld 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 --===============3946260674805803724== Content-Type: application/pgp-signature Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="signature.asc" MIME-Version: 1.0 LS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS0KVmVyc2lvbjogR251UEcgdjIKCmlRSWNCQUFC Q2dBR0JRSlhCOVN4QUFvSkVJQjU4UDl2a0FrSFIzNFFBSlpkbW5tSHFvSDVQNSsxOGZ1WGMzQi8K SXRJOXdFeUFZY0xub1o2WEF4RnlTWkl2WFRjQktlem04aWxIQ1g2V2V1T3JhSkxsWndZODlaVXpQ OS9sU1FqYgpEK0NLZUlUdVdrWjZvWk5zaHRKUkY4ai9BM1JRNVV6K3B0Ujh1K1ZFZW1VTWdra2tl TGFuclhwSlpaUGNQN3NFCllzdkdjNnVUS2NoblBJSWFkUFdpNm9lNndwVkIvdTVRWXk0dDQ0TmVs VTRkUy94dVBLKzV1cnBuRmRUYnpQL1gKOEszek90SVM4emF4ZTBuSEFLcStvbURNWUJ0NktLaWRM R3ZQRUhJZktWOUJ3bi9HRnkyT2h4UzdGWTZ6OHUzKwp4blIwSXE1YXlTL1R1c2U4ZTF6OHBKYzFl eTJzZzVOSEJCZ1NUY3cxbng1K1U5bEN1T3FxMUlBdDFqb3BGM0JtCkkrS2xlYU9wSWhjSEtQdGpG a1IrUUVSZGtCTlp6UFljMlhEOHR4aXpTQ0w3anFLWTJNY0VvdFpPU3R1T20rbzUKcG5La2RKNWQw aWVrejEzVTlzWlg1K1NtLzlEZTVIZWZMTWhYaUdLMlBFVmhnbmllKy8xZXpCRXJ6TUxxSkZjLwow enNsZCt1M2dsdWtKdk51bkNuZ1ROZlduY2kxQVdKWG9XRmRvL1VYdmtLWXRSSVM0cnk4NFVsVEd1 QkVHTVJGCmhxN21EeG9wRFJraDNYb2I0RUJVWUdnYmZBbmxucGMwN1pTT05CRkQ4eERJeFlZbXlj V3Q1bmZDRnpHRDVkYTIKMDl3ZXc5aWRCU1JaVzZ5UlRqcFJocXB2SWxWTTFSNDZveVRhQ242MVdl cGk2V2pZTFRvN3BWeUJlVGJOd0FyWQpMdk5zZEdSU2trQWVRRlQrVEpubQo9SEwvTAotLS0tLUVO RCBQR1AgU0lHTkFUVVJFLS0tLS0K --===============3946260674805803724==--