Subject: bug#5251: 23.1; problem in decode_eol of coding.c

From: Andrew Hyatt <[email-masked]>
Date: Tue, 16 Feb 2016 22:41:32 -0500

I can verify that this issue still happens in Emacs 25.  This simple fix
seems to have slipped by unnoticed many years ago, hopefully someone
that is qualified to comment on the patch will see it now.

BTW, this seems like a nice thing to unit test with ert, if a fix does
take place.

Toru TSUNEYOSHI <[email-masked]> writes:

> In GNU Emacs 23.1, there is a problem in decode_eol of coding.c.
>
> In buffer of which enable-multibyte-characters is nil,
> the function `decode-coding-region' should delete the character '^M'
> (code: 0x0d) at the end of line,
> in case that the function parameter `coding-system' is *-dos (and
> the variable `inhibit-eol-conversion' is nil).
> But, in practice, the function doesn't delete all of the character '^M'.
>
> You can watch the problem with the following.
>
> ========================================================================
> (progn
>   (pop-to-buffer (generate-new-buffer-name "*scratch*"))
>   (set-buffer-multibyte nil)
>   (insert (encode-coding-string "あ" 'euc-jp) "\xd" "\n")
>   (read-char "(press any key)")
>   (decode-coding-region (point-min) (point-max) 'euc-jp-dos)
>   (read-char "doesn't delete all of the character '^M'. (press any key)")
>   (set-buffer-multibyte t))
> ========================================================================
>
> I made a patch to fix the problem. Please check it.
>
> --- coding.c.orig	2009-07-08 12:09:16.000000000 +0900
> +++ coding.c	2009-12-20 16:36:45.887121600 +0900
> @@ -6598,7 +6598,8 @@
>  	{
>  	  int pos_byte = coding->dst_pos_byte;
>  	  int pos = coding->dst_pos;
> -	  int pos_end = pos + coding->produced_char - 1;
> +	  int pos_end = pos + (coding->dst_multibyte
> +			       ? coding->produced_char : coding->produced) - 1;
>  
>  	  while (pos < pos_end)
>  	    {