changeset 17286:4ee0f02eff87

(Finsert_file_contents): Handle non-regular files.
author Richard M. Stallman <rms@gnu.org>
date Wed, 02 Apr 1997 06:12:48 +0000
parents b065ab2a2e22
children b1cb0037ecec
files src/fileio.c
diffstat 1 files changed, 49 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/src/fileio.c	Wed Apr 02 05:03:06 1997 +0000
+++ b/src/fileio.c	Wed Apr 02 06:12:48 1997 +0000
@@ -3101,13 +3101,15 @@
      least signal an error.  */
   if (!S_ISREG (st.st_mode))
     {
-      if (NILP (visit))
+      not_regular = 1;
+
+      if (! NILP (visit))
+	goto notfound;
+
+      if (! NILP (replace) || ! NILP (beg) || ! NILP (end))
 	Fsignal (Qfile_error,
 		 Fcons (build_string ("not a regular file"),
 			Fcons (filename, Qnil)));
-
-      not_regular = 1;
-      goto notfound;
     }
 #endif
 
@@ -3122,7 +3124,7 @@
   record_unwind_protect (close_file_unwind, make_number (fd));
 
   /* Supposedly happens on VMS.  */
-  if (st.st_size < 0)
+  if (! not_regular && st.st_size < 0)
     error ("File size is negative");
 
   if (!NILP (beg) || !NILP (end))
@@ -3138,9 +3140,12 @@
     CHECK_NUMBER (end, 0);
   else
     {
-      XSETINT (end, st.st_size);
-      if (XINT (end) != st.st_size)
-	error ("maximum buffer size exceeded");
+      if (! not_regular)
+	{
+	  XSETINT (end, st.st_size);
+	  if (XINT (end) != st.st_size)
+	    error ("Maximum buffer size exceeded");
+	}
     }
 
   /* If requested, replace the accessible part of the buffer
@@ -3472,16 +3477,20 @@
       goto handled;
     }
 
-  total = XINT (end) - XINT (beg);
-
-  {
-    register Lisp_Object temp;
-
-    /* Make sure point-max won't overflow after this insertion.  */
-    XSETINT (temp, total);
-    if (total != XINT (temp))
-      error ("maximum buffer size exceeded");
-  }
+  if (! not_regular)
+    {
+      register Lisp_Object temp;
+
+      total = XINT (end) - XINT (beg);
+
+      /* Make sure point-max won't overflow after this insertion.  */
+      XSETINT (temp, total);
+      if (total != XINT (temp))
+	error ("Maximum buffer size exceeded");
+    }
+  else
+    /* 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);
@@ -3525,7 +3534,13 @@
 	  break;
 	}
 
-      how_much += this;
+      /* For a regular file, where TOTAL is the real size,
+	 count HOW_MUCH to compare with it.
+	 For a special file, where TOTAL is just a buffer size,
+	 so don't bother counting in HOW_MUCH.
+	 (INSERTED is where we count the number of characters inserted.)  */
+      if (! not_regular)
+	how_much += this;
 
       if (CODING_REQUIRE_CONVERSION (&coding))
 	{
@@ -3536,8 +3551,21 @@
 	  require = decoding_buffer_size (&coding, this);
 	  if (GAP_SIZE < require)
 	    make_gap (require - GAP_SIZE);
-	  if (how_much >= total)  /* This is the last block.  */
-	    coding.last_block = 1;
+
+	  if (! not_regular)
+	    {
+	      if (how_much >= total)  /* This is the last block.  */
+		coding.last_block = 1;
+	    }
+	  else
+	    {
+	      /* If we encounter EOF, say it is the last block.  (The
+		 data this will apply to is the UNPROCESSED characters
+		 carried over from the last batch.)  */
+	      if (this == 0)
+		coding.last_block = 1;
+	    }
+
 	  produced = decode_coding (&coding, read_buf,
 				    POS_ADDR (PT + inserted - 1) + 1,
 				    this, GAP_SIZE, &consumed);