diff options
author | Pádraig Brady <P@draigBrady.com> | 2015-11-03 11:07:06 +0000 |
---|---|---|
committer | Pádraig Brady <P@draigBrady.com> | 2015-11-04 23:30:15 +0000 |
commit | 697b8ce26549cceffa8745a1dc0f13654173c575 (patch) | |
tree | 8abc475a2a9ef4c028a45dd5d32c9a6f361be84a | |
parent | 7549be4af7e8ac9a088927c35a011da835968b9f (diff) | |
download | coreutils-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.c | 6 | ||||
-rwxr-xr-x | tests/misc/ls-misc.pl | 26 |
2 files changed, 24 insertions, 8 deletions
@@ -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"}], |