1
0
mirror of git://git.sv.gnu.org/coreutils.git synced 2026-07-25 18:19:00 +02:00
Files
coreutils/tests/ls/quoting-utf8.sh
Sylvestre Ledru 7dd7fd17b9 tests: ls: check C1 control char escaping in UTF-8 quoting
* tests/ls/quoting-utf8.sh: A non-ASCII C1 control character (U+0085
NEL) is not printable, so locale/clocale quoting must octal-escape its
bytes (\302\205) rather than emit them literally.  Add a file named
with U+0085 and verify the escaped form for both styles.
gap identified here: https://github.com/uutils/coreutils/pull/13150

Link: https://github.com/coreutils/coreutils/pull/306
2026-06-30 18:21:36 +01:00

79 lines
3.3 KiB
Bash
Executable File

#!/bin/sh
# Ensure --quoting-style=locale/clocale uses Unicode quotes in UTF-8 locales
# Copyright (C) 2026 Free Software Foundation, Inc.
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
. "${srcdir=.}/tests/init.sh";
print_ver_ ls
test "$(LC_ALL=en_US.UTF-8 locale charmap 2>/dev/null)" = UTF-8 ||
skip_ 'en_US.UTF-8 locale not available'
touch 'hello world' "it's" 'say "hi"' 'tab here' || framework_failure_
# A non-ASCII (C1) control character: U+0085 NEL = \xc2\x85.
nel=$(printf 'nel\302\205here')
touch "$nel" || framework_failure_
# Note we use en_US as there are no translations provided,
# and so locale quoting for UTF-8 is hardcoded to these quoting characters:
# U+2018 = \xe2\x80\x98 (LEFT SINGLE QUOTATION MARK)
# U+2019 = \xe2\x80\x99 (RIGHT SINGLE QUOTATION MARK)
lq=$(printf '\342\200\230')
rq=$(printf '\342\200\231')
# In UTF-8 locales, both locale and clocale should use Unicode quotes
for style in locale clocale; do
LC_ALL=en_US.UTF-8 ls --quoting-style=$style > out_${style}_utf8 || fail=1
# Verify Unicode left/right quotes are present
grep "$lq" out_${style}_utf8 > /dev/null 2>&1 \
|| { echo "$style UTF-8: missing Unicode left quote"; fail=1; }
grep "$rq" out_${style}_utf8 > /dev/null 2>&1 \
|| { echo "$style UTF-8: missing Unicode right quote"; fail=1; }
# Verify 'hello world' is quoted with Unicode quotes
grep "^${lq}hello world${rq}\$" out_${style}_utf8 > /dev/null 2>&1 \
|| { echo "$style UTF-8: 'hello world' not properly quoted"; fail=1; }
# Embedded apostrophe should NOT be escaped (delimiters are different chars)
grep "^${lq}it's${rq}\$" out_${style}_utf8 > /dev/null 2>&1 || \
{ echo "$style UTF-8: embedded apostrophe shouldn't be escaped"; fail=1; }
# Embedded double quote should NOT be escaped
grep "^${lq}say \"hi\"${rq}\$" out_${style}_utf8 > /dev/null 2>&1 || \
{ echo "$style UTF-8: embedded double quote shouldn't be escaped"; fail=1; }
# Control characters should still be C-escaped
grep "tab\\\\there" out_${style}_utf8 > /dev/null 2>&1 \
|| { echo "$style UTF-8: tab should be escaped as \\t"; fail=1; }
# Non-ASCII (C1) control characters are octal-escaped by byte
grep "^${lq}nel\\\\302\\\\205here${rq}\$" out_${style}_utf8 > /dev/null 2>&1 \
|| { echo "$style UTF-8: U+0085 should be octal-escaped"; fail=1; }
done
# In C locale, locale uses ASCII single quotes, clocale uses ASCII double quotes
LC_ALL=C ls --quoting-style=locale > out_locale_c || fail=1
grep "^'hello world'\$" out_locale_c > /dev/null 2>&1 \
|| { echo "locale C: expected ASCII single quotes"; fail=1; }
LC_ALL=C ls --quoting-style=clocale > out_clocale_c || fail=1
grep '^"hello world"$' out_clocale_c > /dev/null 2>&1 \
|| { echo "clocale C: expected ASCII double quotes"; fail=1; }
Exit $fail