[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
bug#9318: 23.3.50; The first call of encode-coding-region() returns wron
From: |
Andreas Schwab |
Subject: |
bug#9318: 23.3.50; The first call of encode-coding-region() returns wrong result |
Date: |
Wed, 24 Aug 2011 19:59:34 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/23.3 (gnu/linux) |
Kazuhiro Ito <kzhr@d1.dion.ne.jp> writes:
> I think relocation of buffer may cause the problem.
Does that help?
diff --git a/src/coding.c b/src/coding.c
index 65c8a76..f34a023 100644
--- a/src/coding.c
+++ b/src/coding.c
@@ -915,8 +915,8 @@ record_conversion_result (struct coding_system *coding,
}
}
-/* This wrapper macro is used to preserve validity of pointers into
- buffer text across calls to decode_char, which could cause
+/* These wrapper macros are used to preserve validity of pointers into
+ buffer text across calls to decode_char/encode_char, which could cause
relocation of buffers if it loads a charset map, because loading a
charset map allocates large structures. */
#define CODING_DECODE_CHAR(coding, src, src_base, src_end, charset, code, c) \
@@ -935,6 +935,21 @@ record_conversion_result (struct coding_system *coding,
src_end += offset; \
}
\
} while (0)
+#define CODING_ENCODE_CHAR(coding, dst, dst_end, charset, c, code) \
+ do { \
+ charset_map_loaded = 0; \
+ code = ENCODE_CHAR (charset, c); \
+ if (charset_map_loaded) \
+ {
\
+ const unsigned char *orig = coding->destination; \
+ EMACS_INT offset; \
+ \
+ coding_set_destination (coding); \
+ offset = coding->destination - orig; \
+ dst += offset; \
+ dst_end += offset; \
+ }
\
+ } while (0)
/* If there are at least BYTES length of room at dst, allocate memory
@@ -2652,7 +2667,7 @@ encode_coding_emacs_mule (struct coding_system *coding)
{
charset = CHARSET_FROM_ID (preferred_charset_id);
if (CHAR_CHARSET_P (c, charset))
- code = ENCODE_CHAR (charset, c);
+ CODING_ENCODE_CHAR (coding, dst, dst_end, charset, c, code);
else
charset = char_charset (c, charset_list, &code);
}
@@ -4185,7 +4200,8 @@ decode_coding_iso_2022 (struct coding_system *coding)
#define ENCODE_ISO_CHARACTER(charset, c) \
do { \
- int code = ENCODE_CHAR ((charset), (c)); \
+ int code; \
+ CODING_ENCODE_CHAR (coding, dst, dst_end, charset, c, code); \
\
if (CHARSET_DIMENSION (charset) == 1) \
ENCODE_ISO_CHARACTER_DIMENSION1 ((charset), code); \
Andreas.
--
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5
"And now for something completely different."
- bug#9318: 23.3.50; The first call of encode-coding-region() returns wrong result on on Windows, Kazuhiro Ito, 2011/08/18
- bug#9318: 23.3.50; The first call of encode-coding-region() returns wrong result on on Windows, Andreas Schwab, 2011/08/18
- bug#9318: 23.3.50; The first call of encode-coding-region() returns wrong result, Kazuhiro Ito, 2011/08/19
- bug#9318: 23.3.50; The first call of encode-coding-region() returns wrong result, Chong Yidong, 2011/08/20
- bug#9318: 23.3.50; The first call of encode-coding-region() returns wrong result,
Andreas Schwab <=
- bug#9318: 23.3.50; The first call of encode-coding-region() returns wrong result, Kazuhiro Ito, 2011/08/25
- bug#9318: 23.3.50; The first call of encode-coding-region() returns wrong result, Kazuhiro Ito, 2011/08/26
- bug#9318: 23.3.50; The first call of encode-coding-region() returns wrong result, Kazuhiro Ito, 2011/08/27
- bug#9318: 23.3.50; The first call of encode-coding-region() returns wrong result, Kazuhiro Ito, 2011/08/30