This is the mail archive of the cygwin@sourceware.cygnus.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: Case sensitive filenames


This has gone around and around.  My opinion is that gnuwin32 is broken if it
imposes semantics on the filesystem that the filesystem doesn't support.  I'm
a UNIX programmer, and I think it's a pain.

It's also pretty easy to fix.  I posted a patch back in May of last year to do
this; apparently no one like it enough to incorporate it into the official
sources.  I have included my original message below.

--Curtis

Earnie Boyd wrote:
> [snip]
> TOO BAD
> WIN32 ISN'T CASE SENSITIVE.

==== my original message: =====

Subject: Re: Fix to readline for case-insensitive file-name completion
   Date: Wed, 21 May 1997 08:55:02 -0700
   From: Curtis Galloway <curtis@pdi.com>
     To: "gnu-win32@cygnus.com" <gnu-win32@cygnus.com>

You can argue this several ways, but my opinion is that the function of
the shell should follow the function of the OS.  On UNIX, I want my
shell to be case-sensitive; on Win32, I want it to be case-insensitive. 
But I can see why you would want the filename completion to pay
attention to case.  I think it's even possible to have a case-sensitive
filesystem on a Win32 machine with an NFS client.

Here are diffs to do case-insensitive globbing and filename completion. 
They are set to be case-insensitive by default on Win32, but can be
turned off by unsetting the special variables "glob_case_fold" and
"completion_case_fold".

--Curtis Galloway

*** subst.c.00  Tue May 20 16:25:54 1997
--- subst.c     Wed May 21 07:28:22 1997
***************
*** 74,79 ****
--- 74,83 ----
  extern int no_line_editing;
  extern int hostname_list_initialized;
  #endif
+ #if defined(__GO32__) || defined(__CYGWIN32__)
+ extern int glob_case_fold;
+ extern int completion_case_fold;
+ #endif
  
  #if !defined (USE_POSIX_GLOB_LIBRARY)
  extern int glob_dot_filenames, noglob_dot_filenames;
***************
*** 4477,4482 ****
--- 4481,4491 ----
    sv_glob_dot_filenames (), sv_nolinks (),
    sv_noclobber (), sv_allow_null_glob_expansion (), sv_strict_posix
();
  
+ #if defined(__GO32__) || defined(__CYGWIN32__)
+ void sv_glob_case_fold ();
+ void sv_completion_case_fold ();
+ #endif
+ 
  #if defined (READLINE)
  void sv_terminal (), sv_hostname_completion_file ();
  #endif
***************
*** 4549,4554 ****
--- 4558,4567 ----
    { "allow_null_glob_expansion", sv_allow_null_glob_expansion },
    { "noclobber", sv_noclobber },
    { "nolinks", sv_nolinks },
+ #if defined(__GO32__) || defined(__CYGWIN32__)
+   { "glob_case_fold", sv_glob_case_fold },
+   { "completion_case_fold", sv_completion_case_fold },
+ #endif /* __GO32__ || __CYGWIN32__ */
    { (char *)0x00, (VFunction *)0x00 }
  };
  
***************
*** 4865,4867 ****
--- 4878,4896 ----
    posix_readline_initialize (posixly_correct);
  #endif /* READLINE */
  }
+ 
+ #if defined(__GO32__) || defined(__CYGWIN32__)
+ void
+ sv_glob_case_fold (name)
+     char *name;
+ {
+   SET_INT_VAR (name, glob_case_fold);
+ }
+ 
+ void
+ sv_completion_case_fold (name)
+     char *name;
+ {
+   SET_INT_VAR (name, completion_case_fold);
+ }
+ #endif /* __GO32__ || __CYGWIN32__ */


*** variables.c.00      Wed May 21 07:17:27 1997
--- variables.c Wed May 21 07:28:42 1997
***************
*** 44,49 ****
--- 44,53 ----
  extern char *primary_prompt, *secondary_prompt;
  extern Function *this_shell_builtin;
  extern time_t shell_start_time;
+ #if defined(__GO32__) || defined(__CYGWIN32__)
+ extern int glob_case_fold;
+ extern int completion_case_fold;
+ #endif
  
  /* The list of shell variables that the user has created, or that came
from
     the environment. */
***************
*** 249,254 ****
--- 253,263 ----
    bind_variable ("OPTIND", "1");
    bind_variable ("OPTERR", "1");
  #endif /* GETOPTS_BUILTIN */
+ 
+ #if defined(__GO32__) || defined(__CYGWIN32__)
+   bind_variable ("glob_case_fold", itos(glob_case_fold));
+   bind_variable ("completion_case_fold", itos(completion_case_fold));
+ #endif
  
    /* Get the full pathname to THIS shell, and set the BASH variable
       to it. */


*** lib/glob/fnmatch.c.00       Fri May 09 15:10:00 1997
--- lib/glob/fnmatch.c  Wed May 21 07:26:41 1997
***************
*** 25,30 ****
--- 25,36 ----
  #  endif /* !errno */
  #endif
  
+ #if defined(__GO32__) || defined (__CYGWIN32__)
+ int glob_case_fold = 1;
+ #else
+ int glob_case_fold = 0;
+ #endif
+ 
  /* Match STRING against the filename pattern PATTERN, returning zero
if
     it matches, FNM_NOMATCH if not.  */
  int
***************
*** 59,66 ****
        case '\\':
          if (!(flags & FNM_NOESCAPE))
            c = *p++;
!         if (*n != c)
!           return (FNM_NOMATCH);
          break;
  
        case '*':
--- 65,77 ----
        case '\\':
          if (!(flags & FNM_NOESCAPE))
            c = *p++;
!         if (glob_case_fold) {
!           if (tolower(c) != tolower(*n))
!             return (FNM_NOMATCH);
!         } else {
!           if (c != *n)
!             return (FNM_NOMATCH);
!         }
          break;
  
        case '*':
***************
*** 175,182 ****
          break;
  
        default:
!         if (c != *n)
!           return (FNM_NOMATCH);
        }
  
        ++n;
--- 186,198 ----
          break;
  
        default:
!         if (glob_case_fold) {
!           if (tolower(c) != tolower(*n))
!             return (FNM_NOMATCH);
!         } else {
!           if (c != *n)
!             return (FNM_NOMATCH);
!         }
        }
  
        ++n;


*** lib/readline/complete.c.00  Fri May 09 15:10:10 1997
--- lib/readline/complete.c     Tue May 20 08:49:58 1997
***************
*** 1077,1083 ****
--- 1077,1087 ----
  /* **************************************************************** */
  
  /* Non-zero means that case is not significant in completion. */
+ #if defined (__GO32__) || defined (__CYGWIN32__)
+ int completion_case_fold = 1;
+ #else
  int completion_case_fold = 0;
+ #endif
  
  /* Return an array of (char *) which is a list of completions for
TEXT.
     If there are no completions, return a NULL pointer.
***************
*** 1265,1274 ****
--- 1269,1285 ----
        {
          /* Otherwise, if these match up to the length of filename, then
             it is a match. */
+       if (completion_case_fold) {
+           if ((tolower(entry->d_name[0]) == tolower(filename[0])) &&
+               (((int)D_NAMLEN (entry)) >= filename_len) &&
+               (strncasecmp (filename, entry->d_name, filename_len) == 0))
+             break;
+       } else {
            if ((entry->d_name[0] == filename[0]) &&
                (((int)D_NAMLEN (entry)) >= filename_len) &&
                (strncmp (filename, entry->d_name, filename_len) == 0))
              break;
+       }
        }
      }

-
For help on using this list (especially unsubscribing), send a message to
"gnu-win32-request@cygnus.com" with one line of text: "help".


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]