Mercurial > emacs
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;