]> git.eshelyaron.com Git - emacs.git/commitdiff
(readevalloop): Test for reading a whole buffer
authorRichard M. Stallman <rms@gnu.org>
Fri, 30 Dec 2005 04:55:06 +0000 (04:55 +0000)
committerRichard M. Stallman <rms@gnu.org>
Fri, 30 Dec 2005 04:55:06 +0000 (04:55 +0000)
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.

src/ChangeLog
src/lread.c

index 019e12fed2ed2868af96fda8797606b1bd554d7b..ad9084b4b46c68c3a5e2cc3f4c81a953f8a5a388 100644 (file)
@@ -1,5 +1,10 @@
 2005-12-29  Richard M. Stallman  <rms@gnu.org>
 
+       * lread.c (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.
+
        * keymap.c (describe_map): Put sparse map elements into an array,
        sort them, then output a sequence of identical bindings on one line.
        (struct describe_map_elt): New data type.
index c8aa55780c245703e1f3fb16a548739e6db0caf0..4d9ddfbd0092dac0efd2a7e4b4b57da2cae26392 100644 (file)
@@ -1318,7 +1318,18 @@ readevalloop (readcharfun, stream, sourcename, evalfun,
   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 @@ readevalloop (readcharfun, stream, sourcename, evalfun,
       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 @@ readevalloop (readcharfun, stream, sourcename, evalfun,
 
          /* 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 @@ readevalloop (readcharfun, stream, sourcename, evalfun,
 
       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 @@ readevalloop (readcharfun, stream, sourcename, evalfun,
          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;