From: Richard M. Stallman Date: Fri, 30 Dec 2005 04:55:06 +0000 (+0000) Subject: (readevalloop): Test for reading a whole buffer X-Git-Tag: emacs-pretest-22.0.90~4990 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=d11db2c8ddb7e6b0ce43db7f7f0582bb5c48cdb2;p=emacs.git (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. --- diff --git a/src/ChangeLog b/src/ChangeLog index 019e12fed2e..ad9084b4b46 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,5 +1,10 @@ 2005-12-29 Richard M. Stallman + * 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. diff --git a/src/lread.c b/src/lread.c index c8aa55780c2..4d9ddfbd009 100644 --- a/src/lread.c +++ b/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;