From 408a83048366a22bf7645b71bee7428743793736 Mon Sep 17 00:00:00 2001 From: Bart Schaefer Date: Sat, 10 Apr 2021 14:26:46 -0700 Subject: 47913: implement CASE_PATHS option to make NO_CASE_GLOB more sensible --- ChangeLog | 5 +++++ Doc/Zsh/options.yo | 16 ++++++++++++++++ Src/options.c | 1 + Src/pattern.c | 9 ++++++++- Src/zsh.h | 1 + 5 files changed, 31 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 2fe66e4d1..0e8a33f7c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2021-04-10 Bart Schaefer + + * 47913: Doc/Zsh/options.yo, Src/options.c, Src/pattern.c, Src/zsh.h: + implement CASE_PATHS option to make NO_CASE_GLOB more sensible + 2021-04-10 dana * unposted (see 48415): README: Document incompatibility diff --git a/Doc/Zsh/options.yo b/Doc/Zsh/options.yo index b3bf11f5c..714e8a1a1 100644 --- a/Doc/Zsh/options.yo +++ b/Doc/Zsh/options.yo @@ -474,6 +474,22 @@ item(tt(CASE_MATCH) )( Make regular expressions using the tt(zsh/regex) module (including matches with tt(=~)) sensitive to case. ) +pindex(CASE_PATHS) +pindex(NO_CASE_PATHS) +pindex(CASEPATHS) +pindex(NOCASEPATHS) +cindex(case-sensitive globbing, option) +item(tt(CASE_PATHS))( +If tt(CASE_PATHS) is not set (the default), tt(CASE_GLOB) affects the +interpretation of em(every) path component, whenever a special +character appears in em(any) component. When tt(CASE_PATHS) is set, +file path components that do em(not) contain special filename +generation characters are always sensitive to case, thus restricting +tt(NO_CASE_GLOB) to components that contain globbing characters. + +Note that if the filesystem itself is not sensitive to case, then +tt(CASE_PATHS) has no effect. +) pindex(CSH_NULL_GLOB) pindex(NO_CSH_NULL_GLOB) pindex(CSHNULLGLOB) diff --git a/Src/options.c b/Src/options.c index fba021e7d..6ea6290e5 100644 --- a/Src/options.c +++ b/Src/options.c @@ -105,6 +105,7 @@ static struct optname optns[] = { {{NULL, "bsdecho", OPT_EMULATE|OPT_SH}, BSDECHO}, {{NULL, "caseglob", OPT_ALL}, CASEGLOB}, {{NULL, "casematch", OPT_ALL}, CASEMATCH}, +{{NULL, "casepaths", 0}, CASEPATHS}, {{NULL, "cbases", 0}, CBASES}, {{NULL, "cprecedences", OPT_EMULATE|OPT_NONZSH}, CPRECEDENCES}, {{NULL, "cdablevars", OPT_EMULATE}, CDABLEVARS}, diff --git a/Src/pattern.c b/Src/pattern.c index c28f2c9fb..c0e31b78e 100644 --- a/Src/pattern.c +++ b/Src/pattern.c @@ -509,7 +509,7 @@ void patcompstart(void) { patcompcharsset(); - if (isset(CASEGLOB)) + if (isset(CASEGLOB) || isset(CASEPATHS)) patglobflags = 0; else patglobflags = GF_IGNCASE; @@ -632,6 +632,13 @@ patcompile(char *exp, int inflags, char **endexp) p->patmlen = len; p->patnpar = patnpar-1; +#ifndef __CYGWIN__ /* The filesystem itself is case-insensitive on Cygwin */ + if ((patflags & PAT_FILE) && !isset(CASEGLOB) && !(patflags & PAT_PURES)) { + p->globflags |= GF_IGNCASE; + p->globend |= GF_IGNCASE; + } +#endif + if (!strp) { pscan = (Upat)(patout + startoff); diff --git a/Src/zsh.h b/Src/zsh.h index a26b2d05b..d70a4017c 100644 --- a/Src/zsh.h +++ b/Src/zsh.h @@ -2387,6 +2387,7 @@ enum { BSDECHO, CASEGLOB, CASEMATCH, + CASEPATHS, CBASES, CDABLEVARS, CDSILENT, -- cgit 1.4.1