diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index fbb2e4c4f..225686079 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,12 @@ +Fri Nov 10 13:48:44 2000 Bradley A. Town + + * dcrt0.cc: New global variable `ignore_case_with_glob'. + (dll_crt0_1): Disable case-insensitive globbing before calling `main'. + * environ.cc (glob_init): New static function to set or clear + `ignore_case_with_glob'. + (known): Changed "glob" entry to call `glob_init'. + * glob.c (match): Use case-insensitive globbing if needed. + Thu Nov 9 14:30:00 2000 Corinna Vinschen * dir.cc (readdir): Avoid reading from the beginning when diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index 4362a779e..8682685b5 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -106,6 +106,7 @@ extern "C" /* resourcelocks */ &_reslock, /* threadinterface */ &_mtinterf, /* impure_ptr */ &reent_data, }; + BOOL ignore_case_with_glob = FALSE; }; char *old_title = NULL; @@ -835,6 +836,9 @@ dll_crt0_1 () return; } + /* Disable case-insensitive globbing */ + ignore_case_with_glob = FALSE; + /* Flush signals and ensure that signal thread is up and running. Can't do this for noncygwin case since the signal thread is blocked due to LoadLibrary serialization. */ diff --git a/winsup/cygwin/environ.cc b/winsup/cygwin/environ.cc index 3b67bc760..6fc59407e 100644 --- a/winsup/cygwin/environ.cc +++ b/winsup/cygwin/environ.cc @@ -27,6 +27,7 @@ details. */ #include "perprocess.h" extern BOOL allow_glob; +extern BOOL ignore_case_with_glob; extern BOOL allow_ntea; extern BOOL strip_title_path; extern DWORD chunksize; @@ -380,6 +381,31 @@ enum settings set_process_state, }; +/* When BUF is: + * null or empty: disables globbing + * "ignorecase": enables case-insensitive globbing + * anything else: enables case-sensitive globbing + */ +static void +glob_init (const char *buf) +{ + if (!buf || !*buf) + { + allow_glob = FALSE; + ignore_case_with_glob = FALSE; + } + else if (strncasematch (buf, "ignorecase", 10)) + { + allow_glob = TRUE; + ignore_case_with_glob = TRUE; + } + else + { + allow_glob = TRUE; + ignore_case_with_glob = FALSE; + } +} + /* The structure below is used to set up an array which is used to * parse the CYGWIN environment variable or, if enabled, options from * the registry. @@ -409,7 +435,7 @@ struct parse_thing {"error_start", {func: &error_start_init}, isfunc, NULL, {{0}, {0}}}, {"export", {&export_settings}, justset, NULL, {{FALSE}, {TRUE}}}, {"forkchunk", {x: &chunksize}, justset, NULL, {{8192}, {0}}}, - {"glob", {&allow_glob}, justset, NULL, {{FALSE}, {TRUE}}}, + {"glob", {func: &glob_init}, isfunc, NULL, {{0}, {s: "normal"}}}, {"ntea", {&allow_ntea}, justset, NULL, {{FALSE}, {TRUE}}}, {"ntsec", {&allow_ntsec}, justset, NULL, {{FALSE}, {TRUE}}}, {"reset_com", {&reset_com}, justset, NULL, {{FALSE}, {TRUE}}}, diff --git a/winsup/cygwin/glob.c b/winsup/cygwin/glob.c index 2224bc2fc..59e6bbf29 100644 --- a/winsup/cygwin/glob.c +++ b/winsup/cygwin/glob.c @@ -72,6 +72,7 @@ #include #include +#include #include #include #include @@ -81,6 +82,7 @@ #include #include #include +#include #ifdef __weak_alias #ifdef __LIBC12_SOURCE__ @@ -174,6 +176,8 @@ static void qprintf __P((const char *, Char *)); #undef MAXPATHLEN #define MAXPATHLEN 16384 +extern BOOL ignore_case_with_glob; + int glob(pattern, flags, errfunc, pglob) const char *pattern; @@ -727,19 +731,41 @@ match(name, pat, patend) return(0); if ((negate_range = ((*pat & M_MASK) == M_NOT)) != EOS) ++pat; - while (((c = *pat++) & M_MASK) != M_END) - if ((*pat & M_MASK) == M_RNG) { - if (c <= k && k <= pat[1]) - ok = 1; - pat += 2; - } else if (c == k) - ok = 1; + if (ignore_case_with_glob) + { + while (((c = *pat++) & M_MASK) != M_END) + if ((*pat & M_MASK) == M_RNG) { + if (tolower(c) <= tolower(k) && tolower(k) <= tolower(pat[1])) + ok = 1; + pat += 2; + } else if (tolower(c) == tolower(k)) + ok = 1; + } + else + { + while (((c = *pat++) & M_MASK) != M_END) + if ((*pat & M_MASK) == M_RNG) { + if (c <= k && k <= pat[1]) + ok = 1; + pat += 2; + } else if (c == k) + ok = 1; + } if (ok == negate_range) return(0); break; default: - if (*name++ != c) - return(0); + if (ignore_case_with_glob) + { + if (tolower(*name) != tolower(c)) + return(0); + ++name; + } + else + { + if (*name++ != c) + return(0); + } break; } }