From 6f202377c7596f9b4225af9fb9c149212eed2162 Mon Sep 17 00:00:00 2001 From: dana Date: Fri, 3 May 2019 20:13:11 -0500 Subject: 44267: sort: Restore option to ignore backslashes Fix regression introduced by workers/41242 --- ChangeLog | 5 +++++ Src/sort.c | 25 ++++++++++++++++++++++++- Test/Y01completion.ztst | 22 ++++++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index e0635dda8..a22414245 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2019-05-03 dana + + * 44267: Src/sort.c, Test/Y01completion.ztst: Restore option to + ignore backslashes when sorting + 2019-05-03 Peter Stephenson * 44271: Src/loop.c, Test/A01grammar.ztst: until with positive diff --git a/Src/sort.c b/Src/sort.c index 92ee1c0d4..562b89491 100644 --- a/Src/sort.c +++ b/Src/sort.c @@ -33,6 +33,9 @@ /* Flag for direction of sort: 1 forwards, -1 reverse */ static int sortdir; +/* Flag that sort ignores backslashes */ +static int sortnobslash; + /* Flag that sort is numeric */ static int sortnumeric; @@ -113,9 +116,24 @@ eltpcmp(const void *a, const void *b) bs += (laststarta - as); as += (laststarta - as); } + + if (sortnobslash) { + while (*as && *bs) { + if (*as == '\\') + as++; + if (*bs == '\\') + bs++; + if (*as != *bs || !*as) + break; + as++; + bs++; + } + } + #ifdef HAVE_STRCOLL cmp = strcoll(as, bs); #endif + if (sortnumeric) { for (; *as == *bs && *as; as++, bs++); #ifndef HAVE_STRCOLL @@ -162,7 +180,10 @@ mod_export int zstrcmp(const char *as, const char *bs, int sortflags) { struct sortelt ae, be, *aeptr, *beptr; - int oldsortdir = sortdir, oldsortnumeric = sortnumeric, ret; + int oldsortdir = sortdir; + int oldsortnobslash = sortnobslash; + int oldsortnumeric = sortnumeric; + int ret; ae.cmp = as; be.cmp = bs; @@ -173,11 +194,13 @@ zstrcmp(const char *as, const char *bs, int sortflags) beptr = &be; sortdir = 1; + sortnobslash = (sortflags & SORTIT_IGNORING_BACKSLASHES) ? 1 : 0; sortnumeric = (sortflags & SORTIT_NUMERICALLY) ? 1 : 0; ret = eltpcmp(&aeptr, &beptr); /* Paranoia: I don't think we ever need to restore these. */ + sortnobslash = oldsortnobslash; sortnumeric = oldsortnumeric; sortdir = oldsortdir; diff --git a/Test/Y01completion.ztst b/Test/Y01completion.ztst index b1c0e40e5..f1c981f26 100644 --- a/Test/Y01completion.ztst +++ b/Test/Y01completion.ztst @@ -99,6 +99,7 @@ F:regression test workers/31611 comptesteval 'cd "A(B)/C"' comptest $'cd ../\t' } always { + comptesteval 'cd -' # Reset CWD rmdir 'A(B)/C' 'A(B)' } 0:directory name is not a glob qualifier @@ -116,6 +117,27 @@ F:regression test workers/31611 0:allow for suffixes when moving cursor to end of match (without ignored suffix) >line: {tst word:/}{} +# Test for regression introduced by workers/41242, raised in workers/43842 + { + mkdir sortnobslash + touch sortnobslash/{'!foo','#foo','\foo','|foo','~foo',Afoo,bfoo} + comptesteval 'old_LC_ALL=$LC_ALL; LC_ALL=C' + comptest $': sortnobslash/\t' + } always { + comptesteval 'LC_ALL=$old_LC_ALL' + rm -rf sortnobslash + } +0:ignore backslashes when sorting completion matches +>line: {: sortnobslash/}{} +>DESCRIPTION:{file} +>FI:{\!foo} +>FI:{\#foo} +>FI:{Afoo} +>FI:{\\foo} +>FI:{bfoo} +>FI:{\|foo} +>FI:{\~foo} + %clean zmodload -ui zsh/zpty -- cgit 1.4.1