summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPádraig Brady <P@draigBrady.com>2015-11-03 11:07:06 +0000
committerPádraig Brady <P@draigBrady.com>2015-11-04 23:30:15 +0000
commit697b8ce26549cceffa8745a1dc0f13654173c575 (patch)
tree8abc475a2a9ef4c028a45dd5d32c9a6f361be84a
parent7549be4af7e8ac9a088927c35a011da835968b9f (diff)
downloadcoreutils-697b8ce26549cceffa8745a1dc0f13654173c575.tar.xz
ls: avoid redundant processing when already escaping
This is mainly noticeable when the multi-byte code within ls.c is triggered by multi-byte quotes. $ seq 200000 | xargs touch $ time ls-old -U --quoting=locale --hide-control-chars >/dev/null real 0m0.483s $ time ls-new -U --quoting=locale --hide-control-chars >/dev/null real 0m0.430s * src/ls.c (quote_name): Avoid rescanning the output looking for unprintable chars when we know the quoting mode already escapes them. * tests/misc/ls-misc.pl: Add tests for all quoting modes, with and without -q, to verify this assumption.
-rw-r--r--src/ls.c6
-rwxr-xr-xtests/misc/ls-misc.pl26
2 files changed, 24 insertions, 8 deletions
diff --git a/src/ls.c b/src/ls.c
index 8d68a03e1..c22c536c0 100644
--- a/src/ls.c
+++ b/src/ls.c
@@ -4082,7 +4082,11 @@ quote_name (FILE *out, const char *name, struct quoting_options const *options,
quotearg_buffer (buf, len + 1, name, -1, options);
}
- if (qmark_funny_chars)
+ enum quoting_style qs = get_quoting_style (options);
+
+ if (qmark_funny_chars
+ && (qs == shell_quoting_style || qs == shell_always_quoting_style
+ || qs == literal_quoting_style))
{
if (MB_CUR_MAX > 1)
{
diff --git a/tests/misc/ls-misc.pl b/tests/misc/ls-misc.pl
index 8b97c50f0..d3897737e 100755
--- a/tests/misc/ls-misc.pl
+++ b/tests/misc/ls-misc.pl
@@ -132,13 +132,25 @@ my @Tests =
['q-q', '-q', $q_bell, {OUT => "q?\n"}],
['q-Q', '-Q', $q_bell, {OUT => "\"q\\a\"\n"}],
- ['q-lit-q', '--quoting=literal -q', $q_bell, {OUT => "q?\n"}],
- ['q-qs-lit', '--quoting=literal', $q_bell, {OUT => "q\a\n"}],
- ['q-qs-sh', '--quoting=shell', $q_bell, {OUT => "q\a\n"}],
- ['q-qs-sh-a', '--quoting=shell-always', $q_bell, {OUT => "'q\a'\n"}],
- ['q-qs-sh-e', '--quoting=shell-escape', $q_bell, {OUT => "'q'\$'\\a'\n"}],
- ['q-qs-c', '--quoting=c', $q_bell, {OUT => "\"q\\a\"\n"}],
- ['q-qs-esc', '--quoting=escape', $q_bell, {OUT => "q\\a\n"}],
+ ['q-qs-lit', '--quoting=literal', $q_bell, {OUT => "q\a\n"}],
+ ['q-qs-sh', '--quoting=shell', $q_bell, {OUT => "q\a\n"}],
+ ['q-qs-sh-a', '--quoting=shell-always',$q_bell, {OUT => "'q\a'\n"}],
+ ['q-qs-sh-e', '--quoting=shell-escape',$q_bell, {OUT => "'q'\$'\\a'\n"}],
+ ['q-qs-c', '--quoting=c', $q_bell, {OUT => "\"q\\a\"\n"}],
+ ['q-qs-esc', '--quoting=escape', $q_bell, {OUT => "q\\a\n"}],
+ ['q-qs-loc', '--quoting=locale', $q_bell, {OUT => "'q\\a'\n"}],
+ ['q-qs-cloc', '--quoting=clocale', $q_bell, {OUT => "\"q\\a\"\n"}],
+
+ ['q-qs-lit-q', '--quoting=literal -q', $q_bell, {OUT => "q?\n"}],
+ ['q-qs-sh-q', '--quoting=shell -q', $q_bell, {OUT => "q?\n"}],
+ ['q-qs-sh-a-q', '--quoting=shell-al -q', $q_bell, {OUT => "'q?'\n"}],
+ ['q-qs-sh-e-q', '--quoting=shell-escape -q',
+ $q_bell, {OUT => "'q'\$'\\a'\n"}],
+ ['q-qs-c-q', '--quoting=c -q', $q_bell, {OUT => "\"q\\a\"\n"}],
+ ['q-qs-esc-q', '--quoting=escape -q', $q_bell, {OUT => "q\\a\n"}],
+ ['q-qs-loc-q', '--quoting=locale -q', $q_bell, {OUT => "'q\\a'\n"}],
+ ['q-qs-cloc-q', '--quoting=clocale -q', $q_bell, {OUT => "\"q\\a\"\n"}],
+
['q-qs-c-1', '--quoting=c',
{IN => {"t\004" => ''}}, {OUT => "\"t\\004\"\n"}],