Support multi-byte --transform='...\L...' etc

Support upcasing and downcasing in multi-byte locales.
* gnulib.modules: Add c32rtomb, c32tolower, c32toupper,
mbrtoc32-regular.
* src/transform.c: Do not include ctype.h.  Include mcel.h.
(stk, stk_init): Move up.
(run_case_conv): Return void, not char *.  Append result to
stk directly; this avoids the need for a separate allocation.
All callers changed.  Do not assume a single-byte locale.
* tests/xform04.at: New test.
* tests/Makefile.am (TESTSUITE_AT):
* tests/testsuite.at: Add it.
This commit is contained in:
Paul Eggert
2023-09-12 23:21:18 -05:00
parent 783321ff1b
commit c1e277476c
6 changed files with 101 additions and 63 deletions

View File

@@ -287,7 +287,8 @@ TESTSUITE_AT = \
xform-h.at\
xform01.at\
xform02.at\
xform03.at
xform03.at\
xform04.at
distclean-local:
-rm -rf download

View File

@@ -293,6 +293,7 @@ m4_include([xform-h.at])
m4_include([xform01.at])
m4_include([xform02.at])
m4_include([xform03.at])
m4_include([xform04.at])
AT_BANNER([Exclude])
m4_include([exclude.at])

48
tests/xform04.at Normal file
View File

@@ -0,0 +1,48 @@
# Process this file with autom4te to create testsuite. -*- Autotest -*-
# Test suite for GNU tar.
# Copyright 2023 Free Software Foundation, Inc.
# This file is part of GNU tar.
# GNU tar is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
# GNU tar is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# Transformations can change the number of bytes when downcasing.
AT_SETUP([transformations and multi-byte downcasing])
AT_KEYWORDS([transform xform xform04])
AT_TAR_CHECK([
if test "`(locale charmap) 2>/dev/null`" != UTF-8; then
for locale in en_US.UTF-8 `(locale -a) 2>/dev/null` not-found; do
case $locale in
*.[[Uu][Tt][Ff]]*8)
if test "`(LC_ALL=$locale locale charmap) 2>/dev/null`" = UTF-8; then
LC_ALL=$locale
export LC_ALL
break
fi;;
not-found)
AT_SKIP_TEST;;
esac
done
fi
genfile --file Aa.Ⱥⱥ
tar -cvf /dev/null --transform='s/.*/\L&-\U&/' --show-transformed-name Aa.Ⱥⱥ],
[0],
[aa.ⱥⱥ-AA.ȺȺ
])
AT_CLEANUP