Commit d11db2c8 authored by Richard M. Stallman's avatar Richard M. Stallman
Browse files

(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.
parent c36238ee
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.
......
......@@ -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;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment