changeset 67906:28939487a2d5

(readevalloop): Test for reading a whole buffer before actually reading anything. Handle all cases, including START = END = nil and an already-narrowed buffer. Convert END to a marker if it is a number.
author Richard M. Stallman <rms@gnu.org>
date Fri, 30 Dec 2005 04:54:57 +0000
parents 71ec21feb311
children c8f97199cfbc
files src/lread.c
diffstat 1 files changed, 29 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/lread.c	Fri Dec 30 04:52:32 2005 +0000
+++ b/src/lread.c	Fri Dec 30 04:54:57 2005 +0000
@@ -1318,7 +1318,18 @@
   int count = SPECPDL_INDEX ();
   struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
   struct buffer *b = 0;
+  int bpos;
   int continue_reading_p;
+  /* Nonzero if reading an entire buffer.  */
+  int whole_buffer = 0;
+  /* 1 on the first time around.  */
+  int first_sexp = 1;
+
+  if (MARKERP (readcharfun))
+    {
+      if (NILP (start))
+	start = readcharfun;	
+    }
 
   if (BUFFERP (readcharfun))
     b = XBUFFER (readcharfun);
@@ -1344,7 +1355,6 @@
       if (b != 0 && NILP (b->name))
 	error ("Reading from killed buffer");
 
-
       if (!NILP (start))
 	{
 	  /* Switch to the buffer we are reading from.  */
@@ -1359,9 +1369,20 @@
 
 	  /* Set point and ZV around stuff to be read.  */
 	  Fgoto_char (start);
-	  Fnarrow_to_region (make_number (BEGV), end);
+	  if (!NILP (end))
+	    Fnarrow_to_region (make_number (BEGV), end);
+
+	  /* Just for cleanliness, convert END to a marker
+	     if it is an integer.  */
+	  if (INTEGERP (end))
+	    end = Fpoint_max_marker ();
 	}
 
+      /* On the first cycle, we can easily test here
+	 whether we are reading the whole buffer.  */
+      if (b && first_sexp)
+	whole_buffer = (PT == BEG && ZV == Z);
+
       instream = stream;
     read_next:
       c = READCHAR;
@@ -1411,8 +1432,11 @@
 
       if (!NILP (start) && continue_reading_p)
 	start = Fpoint_marker ();
+
+      /* Restore saved point and BEGV.  */
       unbind_to (count1, Qnil);
 
+      /* Now eval what we just read.  */
       val = (*evalfun) (val);
 
       if (printflag)
@@ -1423,11 +1447,12 @@
 	  else
 	    Fprint (val, Qnil);
 	}
+
+      first_sexp = 0;
     }
 
   build_load_history (sourcename, 
-		      stream || (INTEGERP (start) && INTEGERP (end)
-				 && XINT (start) == BEG && XINT (end) == Z));
+		      stream || whole_buffer);
 
   UNGCPRO;