changeset 1178:fb4ec23ef80f

Don't include sys/dir.h. (Fverify_visited_file_modtime): Pass buffer itself to handler, if have handler. (Fwrite_region): GCPRO around Fexpand_file_name, Ffie_name_directory. (Fread_file_name_internal): GCPRO around file name manip. (Ffile_writable_p, Ffile_readable_p): Use abspath, not filename, (Ffile_executable_p, Ffile_exists_p): to run the handler. (Fset_file_modes, Ffile_directory_p, Ffile_modes): Likewise. (Ffile_newer_than_file_p): GCPRO around expand_and_dir_to_file.
author Richard M. Stallman <rms@gnu.org>
date Sun, 20 Sep 1992 20:17:16 +0000
parents 835b1e570621
children 7961d1af11a7
files src/fileio.c
diffstat 1 files changed, 52 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/src/fileio.c	Sun Sep 20 19:06:51 1992 +0000
+++ b/src/fileio.c	Sun Sep 20 20:17:16 1992 +0000
@@ -35,8 +35,6 @@
 #include <perror.h>
 #include <stddef.h>
 #include <string.h>
-#else
-#include <sys/dir.h>
 #endif
 
 #include <errno.h>
@@ -174,7 +172,7 @@
 	  Lisp_Object string;
 	  string = XCONS (elt)->car;
 	  if (XTYPE (string) == Lisp_String
-	      && fast_string_match (string, filename))
+	      && fast_string_match (string, filename) >= 0)
 	    return XCONS (elt)->cdr;
 	}
     }
@@ -584,7 +582,7 @@
      call the corresponding file handler.  */
   handler = find_file_handler (name);
   if (!NILP (handler))
-    return call2 (handler, Qexpand_file_name, name);
+    return call3 (handler, Qexpand_file_name, name, defalt);
 
 #ifdef VMS
   /* Filenames on VMS are always upper case.  */
@@ -1875,9 +1873,9 @@
 
   /* If the file name has special constructs in it,
      call the corresponding file handler.  */
-  handler = find_file_handler (filename);
+  handler = find_file_handler (abspath);
   if (!NILP (handler))
-    return call2 (handler, Qfile_exists_p, filename);
+    return call2 (handler, Qfile_exists_p, abspath);
 
   return (access (XSTRING (abspath)->data, 0) >= 0) ? Qt : Qnil;
 }
@@ -1897,9 +1895,9 @@
 
   /* If the file name has special constructs in it,
      call the corresponding file handler.  */
-  handler = find_file_handler (filename);
+  handler = find_file_handler (abspath);
   if (!NILP (handler))
-    return call2 (handler, Qfile_executable_p, filename);
+    return call2 (handler, Qfile_executable_p, abspath);
 
   return (access (XSTRING (abspath)->data, 1) >= 0) ? Qt : Qnil;
 }
@@ -1918,9 +1916,9 @@
 
   /* If the file name has special constructs in it,
      call the corresponding file handler.  */
-  handler = find_file_handler (filename);
+  handler = find_file_handler (abspath);
   if (!NILP (handler))
-    return call2 (handler, Qfile_readable_p, filename);
+    return call2 (handler, Qfile_readable_p, abspath);
 
   return (access (XSTRING (abspath)->data, 4) >= 0) ? Qt : Qnil;
 }
@@ -1987,9 +1985,9 @@
 
   /* If the file name has special constructs in it,
      call the corresponding file handler.  */
-  handler = find_file_handler (filename);
+  handler = find_file_handler (abspath);
   if (!NILP (handler))
-    return call2 (handler, Qfile_writable_p, filename);
+    return call2 (handler, Qfile_writable_p, abspath);
 
   if (access (XSTRING (abspath)->data, 0) >= 0)
     return (access (XSTRING (abspath)->data, 2) >= 0) ? Qt : Qnil;
@@ -2017,9 +2015,9 @@
 
   /* If the file name has special constructs in it,
      call the corresponding file handler.  */
-  handler = find_file_handler (filename);
+  handler = find_file_handler (abspath);
   if (!NILP (handler))
-    return call2 (handler, Qfile_directory_p, filename);
+    return call2 (handler, Qfile_directory_p, abspath);
 
   if (stat (XSTRING (abspath)->data, &st) < 0)
     return Qnil;
@@ -2064,9 +2062,9 @@
 
   /* If the file name has special constructs in it,
      call the corresponding file handler.  */
-  handler = find_file_handler (filename);
+  handler = find_file_handler (abspath);
   if (!NILP (handler))
-    return call2 (handler, Qfile_modes, filename);
+    return call2 (handler, Qfile_modes, abspath);
 
   if (stat (XSTRING (abspath)->data, &st) < 0)
     return Qnil;
@@ -2087,9 +2085,9 @@
 
   /* If the file name has special constructs in it,
      call the corresponding file handler.  */
-  handler = find_file_handler (filename);
+  handler = find_file_handler (abspath);
   if (!NILP (handler))
-    return call3 (handler, Qset_file_modes, filename, mode);
+    return call3 (handler, Qset_file_modes, abspath, mode);
 
 #ifndef APOLLO
   if (chmod (XSTRING (abspath)->data, XINT (mode)) < 0)
@@ -2179,12 +2177,16 @@
   struct stat st;
   int mtime1;
   Lisp_Object handler;
+  struct gcpro gcpro1, gcpro2;
 
   CHECK_STRING (file1, 0);
   CHECK_STRING (file2, 0);
 
+  abspath1 = Qnil;
+  GCPRO2 (abspath1, file2);
   abspath1 = expand_and_dir_to_file (file1, current_buffer->directory);
   abspath2 = expand_and_dir_to_file (file2, current_buffer->directory);
+  UNGCPRO;
 
   /* If the file name has special constructs in it,
      call the corresponding file handler.  */
@@ -2392,6 +2394,7 @@
   unsigned char *fname = 0;	/* If non-0, original filename (must rename) */
 #endif /* VMS */
   Lisp_Object handler;
+  struct gcpro gcpro1, gcpro2;
 
   /* Special kludge to simplify auto-saving */
   if (NILP (start))
@@ -2402,8 +2405,8 @@
   else if (XTYPE (start) != Lisp_String)
     validate_region (&start, &end);
 
+  GCPRO2 (start, filename);
   filename = Fexpand_file_name (filename, Qnil);
-  fn = XSTRING (filename)->data;
 
   /* If the file name has special constructs in it,
      call the corresponding file handler.  */
@@ -2432,6 +2435,7 @@
 	  XFASTINT (current_buffer->save_length) = Z - BEG;
 	  current_buffer->filename = filename;
 	}
+      UNGCPRO;
       return val;
     }
 
@@ -2440,6 +2444,7 @@
     lock_file (filename);
 #endif /* CLASH_DETECTION */
 
+  fn = XSTRING (filename)->data;
   desc = -1;
   if (!NILP (append))
     desc = open (fn, O_WRONLY);
@@ -2494,6 +2499,8 @@
   desc = creat (fn, auto_saving ? auto_save_mode_bits : 0666);
 #endif /* not VMS */
 
+  UNGCPRO;
+
   if (desc < 0)
     {
 #ifdef CLASH_DETECTION
@@ -2700,7 +2707,7 @@
      call the corresponding file handler.  */
   handler = find_file_handler (b->filename);
   if (!NILP (handler))
-    return call2 (handler, Qverify_visited_file_modtime, b->filename);
+    return call2 (handler, Qverify_visited_file_modtime, buf);
 
   if (stat (XSTRING (b->filename)->data, &st) < 0)
     {
@@ -2901,36 +2908,46 @@
      lambda for verify final value */
 {
   Lisp_Object name, specdir, realdir, val, orig_string;
+  int changed;
+  struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+
+  realdir = dir;
+  name = string;
+  orig_string = Qnil;
+  specdir = Qnil;
+  changed = 0;
+  /* No need to protect ACTION--we only compare it with t and nil.  */
+  GCPRO4 (string, realdir, name, specdir);
 
   if (XSTRING (string)->size == 0)
     {
-      orig_string = Qnil; 
-      name = string;
-      realdir = dir;
       if (EQ (action, Qlambda))
-	return Qnil;
+	{
+	  UNGCPRO;
+	  return Qnil;
+	}
     }
   else
     {
       orig_string = string;
       string = Fsubstitute_in_file_name (string);
+      changed = NILP (Fstring_equal (string, orig_string));
       name = Ffile_name_nondirectory (string);
-      realdir = Ffile_name_directory (string);
-      if (NILP (realdir))
-	realdir = dir;
-      else
-	realdir = Fexpand_file_name (realdir, dir);
+      val = Ffile_name_directory (string);
+      if (! NILP (val))
+	realdir = Fexpand_file_name (val, realdir);
     }
 
   if (NILP (action))
     {
       specdir = Ffile_name_directory (string);
       val = Ffile_name_completion (name, realdir);
+      UNGCPRO;
       if (XTYPE (val) != Lisp_String)
 	{
-	  if (NILP (Fstring_equal (string, orig_string)))
+	  if (changed)
 	    return string;
-	  return (val);
+	  return val;
 	}
 
       if (!NILP (specdir))
@@ -2962,8 +2979,9 @@
 	  }
       }
 #endif /* Not VMS */
-      return (val);
+      return val;
     }
+  UNGCPRO;
 
   if (EQ (action, Qt))
     return Ffile_name_all_completions (name, realdir);
@@ -3208,6 +3226,8 @@
     (file-exists-p FILENAME)\n\
 and FILENAME is handled by HANDLER, then HANDLER is called like this:\n\
     (funcall HANDLER 'file-exists-p FILENAME)");
+  Vfile_name_handler_alist = Qnil;
+
   defsubr (&Sfile_name_directory);
   defsubr (&Sfile_name_nondirectory);
   defsubr (&Sfile_name_as_directory);