mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-27 07:41:28 -08:00
(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.
This commit is contained in:
parent
c36238ee75
commit
d11db2c8dd
2 changed files with 34 additions and 4 deletions
|
|
@ -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.
|
||||
|
|
|
|||
33
src/lread.c
33
src/lread.c
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue