Mercurial > emacs
changeset 20473:f8b70ad2fc2a
(message_dolog): Update PT and ZV properly when at end of
buffer, when we convert between multibyte and single-byte.
Properly initialize i.
(message_dolog): Convert between single-byte and multibyte
when inserting text into *Messages*.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Sun, 21 Dec 1997 01:20:26 +0000 |
parents | 79ea90039b23 |
children | 2ff24b456bb7 |
files | src/xdisp.c |
diffstat | 1 files changed, 49 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/xdisp.c Sun Dec 21 00:50:07 1997 +0000 +++ b/src/xdisp.c Sun Dec 21 01:20:26 1997 +0000 @@ -285,6 +285,8 @@ struct buffer *oldbuf; int oldpoint, oldbegv, oldzv; int old_windows_or_buffers_changed = windows_or_buffers_changed; + int point_at_end = 0; + int zv_at_end = 0; oldbuf = current_buffer; Fset_buffer (Fget_buffer_create (build_string ("*Messages*"))); @@ -295,12 +297,48 @@ BEGV = BEG; ZV = Z; if (oldpoint == Z) - oldpoint += len + nlflag; + point_at_end = 1; if (oldzv == Z) - oldzv += len + nlflag; + zv_at_end = 1; TEMP_SET_PT (Z); - if (len) + + /* Insert the string--maybe converting multibyte to single byte + or vice versa, so that all the text fits the buffer. */ + if (! NILP (oldbuf->enable_multibyte_characters) + && NILP (current_buffer->enable_multibyte_characters)) + { + int c, i = 0, nbytes; + /* Convert a multibyte string to single-byte + for the *Message* buffer. */ + while (i < len) + { + c = STRING_CHAR (m + i, len - i); + i += XFASTINT (Fchar_bytes (make_number (c))); + /* Truncate the character to its last byte--we can only hope + the user is happy with the character he gets, + since if it isn't right, there is no way to do it right. */ + c &= 0xff; + insert_char (c); + } + } + else if (NILP (oldbuf->enable_multibyte_characters) + && ! NILP (current_buffer->enable_multibyte_characters)) + { + int c, i = 0; + /* Convert a single-byte string to multibyte + for the *Message* buffer. */ + while (i < len) + { + c = m[i++]; + /* Convert non-ascii chars as if for self-insert. */ + if (c >= 0200 && c <= 0377) + c += nonascii_insert_offset; + insert_char (c); + } + } + else if (len) insert_1 (m, len, 1, 0); + if (nlflag) { int this_bol, prev_bol, dup; @@ -350,8 +388,14 @@ } } BEGV = oldbegv; - ZV = oldzv; - TEMP_SET_PT (oldpoint); + if (zv_at_end) + ZV = Z; + else + ZV = oldzv; + if (point_at_end) + TEMP_SET_PT (Z); + else + TEMP_SET_PT (oldpoint); set_buffer_internal (oldbuf); windows_or_buffers_changed = old_windows_or_buffers_changed; message_log_need_newline = !nlflag;