diff src/fileio.c @ 62296:3302236fcb60

(Ffind_file_name_handler): Handle lambda-exp as handler. (Finsert_file_contents): If we read 0 bytes from a special file, unlock the visited file if we locked it. (Fmake_symbolic_link, Frecent_auto_save_p): Doc fixes. (Ffile_exists_p, Ffile_symlink_p): Doc fixes.
author Richard M. Stallman <rms@gnu.org>
date Fri, 13 May 2005 13:33:53 +0000
parents a89a98d0bb8c
children 3fa6e7b9d397
line wrap: on
line diff
--- a/src/fileio.c	Fri May 13 08:55:33 2005 +0000
+++ b/src/fileio.c	Fri May 13 13:33:53 2005 +0000
@@ -373,7 +373,10 @@
 	  Lisp_Object string = XCAR (elt);
 	  int match_pos;
 	  Lisp_Object handler = XCDR (elt);
-	  Lisp_Object operations = Fget (handler, Qoperations);
+	  Lisp_Object operations = Qnil;
+
+	  if (SYMBOLP (handler))
+	    operations = Fget (handler, Qoperations);
 
 	  if (STRINGP (string)
 	      && (match_pos = fast_string_match (string, filename)) > pos
@@ -2862,7 +2865,8 @@
 #ifdef S_IFLNK
 DEFUN ("make-symbolic-link", Fmake_symbolic_link, Smake_symbolic_link, 2, 3,
        "FMake symbolic link to file: \nGMake symbolic link to file %s: \np",
-       doc: /* Make a symbolic link to FILENAME, named LINKNAME.  Both args must be strings.
+       doc: /* Make a symbolic link to FILENAME, named LINKNAME.
+Both args must be strings.
 Signals a `file-already-exists' error if a file LINKNAME already exists
 unless optional third argument OK-IF-ALREADY-EXISTS is non-nil.
 A number as third arg means request confirmation if LINKNAME already exists.
@@ -3060,8 +3064,10 @@
 }
 
 DEFUN ("file-exists-p", Ffile_exists_p, Sfile_exists_p, 1, 1, 0,
-       doc: /* Return t if file FILENAME exists.  (This does not mean you can read it.)
-See also `file-readable-p' and `file-attributes'.  */)
+       doc: /* Return t if file FILENAME exists (whether or not you can read it.)
+See also `file-readable-p' and `file-attributes'.
+This returns nil for a symlink to a nonexistent file.
+Use `file-symlink-p' to test for such links.  */)
      (filename)
      Lisp_Object filename;
 {
@@ -3238,7 +3244,10 @@
 DEFUN ("file-symlink-p", Ffile_symlink_p, Sfile_symlink_p, 1, 1, 0,
        doc: /* Return non-nil if file FILENAME is the name of a symbolic link.
 The value is the link target, as a string.
-Otherwise returns nil.  */)
+Otherwise it returns nil.
+
+This function returns t when given the name of a symlink that
+points to a nonexistent file.  */)
      (filename)
      Lisp_Object filename;
 {
@@ -3728,6 +3737,8 @@
   int set_coding_system = 0;
   int coding_system_decided = 0;
   int read_quit = 0;
+  int old_Vdeactivate_mark = Vdeactivate_mark;
+  int we_locked_file = 0;
 
   if (current_buffer->base_buffer && ! NILP (visit))
     error ("Cannot do file visiting in an indirect buffer");
@@ -4400,8 +4411,17 @@
     /* For a special file, all we can do is guess.  */
     total = READ_BUF_SIZE;
 
-  if (NILP (visit) && total > 0)
-    prepare_to_modify_buffer (PT, PT, NULL);
+  if (NILP (visit) && inserted > 0)
+    {
+#ifdef CLASH_DETECTION
+      if (!NILP (current_buffer->file_truename)
+	  /* Make binding buffer-file-name to nil effective.  */
+	  && !NILP (current_buffer->filename)
+	  && SAVE_MODIFF >= MODIFF)
+	we_locked_file = 1;
+#endif /* CLASH_DETECTION */
+      prepare_to_modify_buffer (GPT, GPT, NULL);
+    }
 
   move_gap (PT);
   if (GAP_SIZE < total)
@@ -4491,6 +4511,16 @@
       }
   }
 
+  /* Now we have read all the file data into the gap.
+     If it was empty, undo marking the buffer modified.  */
+
+  if (inserted == 0)
+    {
+      if (we_locked_file)
+	unlock_file (current_buffer->file_truename);
+      Vdeactivate_mark = old_Vdeactivate_mark;
+    }
+
   /* Make the text read part of the buffer.  */
   GAP_SIZE -= inserted;
   GPT      += inserted;
@@ -6036,7 +6066,10 @@
 
 DEFUN ("recent-auto-save-p", Frecent_auto_save_p, Srecent_auto_save_p,
        0, 0, 0,
-       doc: /* Return t if current buffer has been auto-saved since last read in or saved.  */)
+       doc: /* Return t if current buffer has been auto-saved recently.
+More precisely, if it has been auto-saved since last read from or saved
+in the visited file.  If the buffer has no visited file,
+then any auto-save counts as "recent".  */)
      ()
 {
   return (SAVE_MODIFF < current_buffer->auto_save_modified) ? Qt : Qnil;