changeset 5211:cdca98f2d36f

Move `default-file-system-ignore-case' to C; fix bug in directory hash tables src/ChangeLog addition: 2010-05-16 Aidan Kehoe <kehoea@parhasard.net> Move `default-file-system-ignore-case' to C; pay attention to it in creating the directory hash tables for #'locate-file. Fix a bug where #'eq was specified when creating directory hash tables in dired.c. * config.h.in (DEFAULT_FILE_SYSTEM_IGNORE_CASE): This is 1 on Darwin. * dired.c (make_directory_hash_table): If #'file-system-ignore-case-p gives non-nil for a directory, created the associated hash table with #'equalp as its test. Never use #'eq as a directory hash table test. * fileio.c (vars_of_fileio): Move `default-file-system-ignore-case' here, so it can be a constant boolean reflecting a compile-time #define. * lisp.h: Update the declaration of make_directory_hash_table; remove the declaration of wasteful_word_to_lisp, which was #ifdef'd out. * lread.c (Flocate_file): Take out a debugging statement from this function. (locate_file_refresh_hashing): Call make_directory_hash_table with a Lisp string, not an Ibyte pointer. (vars_of_lread): If DEFAULT_FILE_SYSTEM_IGNORE_CASE is defined, use #'equalp as the hash table test for locate-file-hash-table, not #'equal. * s/win32-common.h (DEFAULT_FILE_SYSTEM_IGNORE_CASE): Case should normally be ignored in file names on Win32. lisp/ChangeLog addition: 2010-05-16 Aidan Kehoe <kehoea@parhasard.net> * files.el (default-file-system-ignore-case): Move this to fileio.c, where it's a constant boolean variable initialised at dump time.
author Aidan Kehoe <kehoea@parhasard.net>
date Sun, 16 May 2010 12:33:21 +0100
parents 9fa29ec759e3
children 4f98237e23fc
files lisp/ChangeLog lisp/files.el src/ChangeLog src/config.h.in src/dired.c src/fileio.c src/lisp.h src/lread.c src/s/win32-common.h
diffstat 9 files changed, 73 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Thu Apr 29 16:16:47 2010 +0100
+++ b/lisp/ChangeLog	Sun May 16 12:33:21 2010 +0100
@@ -1,3 +1,9 @@
+2010-05-16  Aidan Kehoe  <kehoea@parhasard.net>
+
+	* files.el (default-file-system-ignore-case):
+	Move this to fileio.c, where it's a constant boolean variable
+	initialised at dump time.
+
 2010-04-29  Aidan Kehoe  <kehoea@parhasard.net>
 
 	* cmdloop.el (suggest-key-bindings):
--- a/lisp/files.el	Thu Apr 29 16:16:47 2010 +0100
+++ b/lisp/files.el	Sun May 16 12:33:21 2010 +0100
@@ -4515,17 +4515,8 @@
 
 ;; END SYNC WITH FSF 21.2.
 
-;; XEmacs:
-(defvar default-file-system-ignore-case (and
-                                         (memq system-type '(windows-nt
-                                                             cygwin32
-							     darwin))
-                                         t)
-  "What `file-system-ignore-case-p' returns by default.
-This is in the case that nothing in `file-system-case-alist' matches.")
-
-;; Question; do any of the Linuxes mount Windows partitions in a fixed
-;; place?
+;; XEmacs. Question; do any of the Linuxes mount Windows partitions in
+;; a fixed place?
 (defvar file-system-case-alist nil
   "Alist to decide where file name case is significant. 
 
--- a/src/ChangeLog	Thu Apr 29 16:16:47 2010 +0100
+++ b/src/ChangeLog	Sun May 16 12:33:21 2010 +0100
@@ -1,3 +1,32 @@
+2010-05-16  Aidan Kehoe  <kehoea@parhasard.net>
+
+	Move `default-file-system-ignore-case' to C; pay attention to it
+	in creating the directory hash tables for #'locate-file. Fix a bug
+	where #'eq was specified when creating directory hash tables in
+	dired.c. 
+
+	* config.h.in (DEFAULT_FILE_SYSTEM_IGNORE_CASE): This is 1 on
+	Darwin.
+	* dired.c (make_directory_hash_table): If
+	#'file-system-ignore-case-p gives non-nil for a directory, created
+	the associated hash table with #'equalp as its test. Never use
+	#'eq as a directory hash table test.
+	* fileio.c (vars_of_fileio):
+	Move `default-file-system-ignore-case' here, so it can be a
+	constant boolean reflecting a compile-time #define.
+	* lisp.h: Update the declaration of make_directory_hash_table;
+	remove the declaration of wasteful_word_to_lisp, which was
+	#ifdef'd out.
+	* lread.c (Flocate_file): Take out a debugging statement from
+	this function.
+	(locate_file_refresh_hashing): Call make_directory_hash_table with
+	a Lisp string, not an Ibyte pointer.
+	(vars_of_lread): If DEFAULT_FILE_SYSTEM_IGNORE_CASE is defined,
+	use #'equalp as the hash table test for locate-file-hash-table,
+	not #'equal.
+	* s/win32-common.h (DEFAULT_FILE_SYSTEM_IGNORE_CASE):
+	Case should normally be ignored in file names on Win32.
+
 2010-04-29  Aidan Kehoe  <kehoea@parhasard.net>
 
 	* eval.c (Fquote, Ffunction): Error on more than one argument to
--- a/src/config.h.in	Thu Apr 29 16:16:47 2010 +0100
+++ b/src/config.h.in	Sun May 16 12:33:21 2010 +0100
@@ -339,6 +339,7 @@
 /* Darwin; realpath corrects for case: */
 #ifdef HAVE_DYLD
 #define REALPATH_CORRECTS_CASE 1
+#define DEFAULT_FILE_SYSTEM_IGNORE_CASE 1
 #endif
 
 #undef HAVE_LIBINTL
--- a/src/dired.c	Thu Apr 29 16:16:47 2010 +0100
+++ b/src/dired.c	Sun May 16 12:33:21 2010 +0100
@@ -46,6 +46,7 @@
 Lisp_Object Qfile_name_completion;
 Lisp_Object Qfile_name_all_completions;
 Lisp_Object Qfile_attributes;
+Lisp_Object Qfile_system_ignore_case_p;
 
 static Lisp_Object
 close_directory_unwind (Lisp_Object unwind_obj)
@@ -777,14 +778,21 @@
 
 
 Lisp_Object
-make_directory_hash_table (const Ibyte *path)
+make_directory_hash_table (Lisp_Object path)
 {
   DIR *d;
-  if ((d = qxe_opendir (path)))
+  if ((d = qxe_opendir (XSTRING_DATA (path))))
     {
+      Lisp_Object hash_table_test = Qequal, hash = Qnil;
       DIRENTRY *dp;
-      Lisp_Object hash =
-	make_lisp_hash_table (20, HASH_TABLE_NON_WEAK, Qeq);
+
+      if (!UNBOUNDP (XSYMBOL_FUNCTION (Qfile_system_ignore_case_p))
+          && !NILP (call1 (Qfile_system_ignore_case_p, path)))
+        {
+          hash_table_test = Qequalp;
+        }
+
+      hash = make_lisp_hash_table (20, HASH_TABLE_NON_WEAK, hash_table_test);
 
       while ((dp = qxe_readdir (d)))
 	{
@@ -942,6 +950,7 @@
   DEFSYMBOL (Qfile_name_completion);
   DEFSYMBOL (Qfile_name_all_completions);
   DEFSYMBOL (Qfile_attributes);
+  DEFSYMBOL (Qfile_system_ignore_case_p);
 
   DEFSUBR (Fdirectory_files);
   DEFSUBR (Ffile_name_completion);
--- a/src/fileio.c	Thu Apr 29 16:16:47 2010 +0100
+++ b/src/fileio.c	Sun May 16 12:33:21 2010 +0100
@@ -108,6 +108,8 @@
 
 Lisp_Object Vdirectory_sep_char;
 
+int default_file_system_ignore_case;
+
 #ifdef HAVE_FSYNC
 /* Nonzero means skip the call to fsync in Fwrite-region.  */
 int write_region_inhibit_fsync;
@@ -4560,6 +4562,16 @@
 what the normal separator is.
 */ );
   Vdirectory_sep_char = make_char (DEFAULT_DIRECTORY_SEP);
+
+  DEFVAR_CONST_BOOL ("default-file-system-ignore-case", &default_file_system_ignore_case /*
+What `file-system-ignore-case-p' returns by default.
+This is in the case that nothing in `file-system-case-alist' matches.
+*/ );
+#ifdef DEFAULT_FILE_SYSTEM_IGNORE_CASE
+  default_file_system_ignore_case = DEFAULT_FILE_SYSTEM_IGNORE_CASE;
+#else
+  default_file_system_ignore_case = 0;
+#endif
 }
 
 void
--- a/src/lisp.h	Thu Apr 29 16:16:47 2010 +0100
+++ b/src/lisp.h	Sun May 16 12:33:21 2010 +0100
@@ -4504,8 +4504,7 @@
 extern Lisp_Object Vx_initial_argv_list;
 
 /* Defined in dired.c */
-Lisp_Object make_directory_hash_table (const Ibyte *);
-Lisp_Object wasteful_word_to_lisp (unsigned int);
+Lisp_Object make_directory_hash_table (Lisp_Object);
 
 /* Defined in doc.c */
 EXFUN (Fsubstitute_command_keys, 1);
--- a/src/lread.c	Thu Apr 29 16:16:47 2010 +0100
+++ b/src/lread.c	Sun May 16 12:33:21 2010 +0100
@@ -894,9 +894,6 @@
 {
   /* This function can GC */
   Lisp_Object tp;
-  static int locate_file_called;
-
-  ++locate_file_called;
 
   CHECK_STRING (filename);
 
@@ -918,8 +915,7 @@
 static Lisp_Object
 locate_file_refresh_hashing (Lisp_Object directory)
 {
-  Lisp_Object hash =
-    make_directory_hash_table (XSTRING_DATA (directory));
+  Lisp_Object hash = make_directory_hash_table (directory);
 
   if (!NILP (hash))
     Fputhash (directory, hash, Vlocate_file_hash_table);
@@ -3483,7 +3479,12 @@
 
   Vlocate_file_hash_table = make_lisp_hash_table (200,
 						  HASH_TABLE_NON_WEAK,
-						  Qequal);
+#ifdef DEFAULT_FILE_SYSTEM_IGNORE_CASE
+						  Qequalp
+#else
+						  Qequal
+#endif
+						  );
   staticpro (&Vlocate_file_hash_table);
 #ifdef DEBUG_XEMACS
   symbol_value (XSYMBOL (intern ("Vlocate-file-hash-table")))
--- a/src/s/win32-common.h	Thu Apr 29 16:16:47 2010 +0100
+++ b/src/s/win32-common.h	Sun May 16 12:33:21 2010 +0100
@@ -30,3 +30,5 @@
 
 /* Define an identifier for all MS Windows systems -- Cygwin, native, MinGW */
 #define WIN32_ANY
+
+#define DEFAULT_FILE_SYSTEM_IGNORE_CASE 1