mirror of
https://github.com/masscollaborationlabs/emacs.git
synced 2025-07-16 00:40:06 +00:00
(coding_restore_composition): Pay attention to the case that
cmp_data is not set properly (because of invalid code in the source text). (run_pre_post_conversion_on_str): Include text properties in the resulting string. (decode_coding_string): Set members of coding correctly.
This commit is contained in:
parent
ed7a4b2d60
commit
78108bcdcc
1 changed files with 32 additions and 20 deletions
52
src/coding.c
52
src/coding.c
|
@ -4660,7 +4660,8 @@ coding_restore_composition (coding, obj)
|
|||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < cmp_data->used; i += cmp_data->data[i])
|
||||
for (i = 0; i < cmp_data->used && cmp_data->data[i] > 0;
|
||||
i += cmp_data->data[i])
|
||||
{
|
||||
int *data = cmp_data->data + i;
|
||||
enum composition_method method = (enum composition_method) data[3];
|
||||
|
@ -5184,7 +5185,7 @@ run_pre_post_conversion_on_str (str, coding, encodep)
|
|||
call1 (coding->post_read_conversion, make_number (Z - BEG));
|
||||
}
|
||||
inhibit_pre_post_conversion = 0;
|
||||
str = make_buffer_string (BEG, Z, 0);
|
||||
str = make_buffer_string (BEG, Z, 1);
|
||||
return unbind_to (count, str);
|
||||
}
|
||||
|
||||
|
@ -5200,6 +5201,7 @@ decode_coding_string (str, coding, nocopy)
|
|||
struct gcpro gcpro1;
|
||||
Lisp_Object saved_coding_symbol;
|
||||
int result;
|
||||
int require_decoding;
|
||||
|
||||
from = 0;
|
||||
to = XSTRING (str)->size;
|
||||
|
@ -5228,15 +5230,7 @@ decode_coding_string (str, coding, nocopy)
|
|||
}
|
||||
}
|
||||
|
||||
if (! CODING_REQUIRE_DECODING (coding))
|
||||
{
|
||||
if (!STRING_MULTIBYTE (str))
|
||||
{
|
||||
str = Fstring_as_multibyte (str);
|
||||
nocopy = 1;
|
||||
}
|
||||
return (nocopy ? str : Fcopy_sequence (str));
|
||||
}
|
||||
require_decoding = CODING_REQUIRE_DECODING (coding);
|
||||
|
||||
if (STRING_MULTIBYTE (str))
|
||||
{
|
||||
|
@ -5244,24 +5238,39 @@ decode_coding_string (str, coding, nocopy)
|
|||
str = Fstring_as_unibyte (str);
|
||||
to_byte = STRING_BYTES (XSTRING (str));
|
||||
nocopy = 1;
|
||||
coding->src_multibyte = 0;
|
||||
}
|
||||
coding->dst_multibyte = 1;
|
||||
|
||||
if (coding->composing != COMPOSITION_DISABLED)
|
||||
coding_allocate_composition_data (coding, from);
|
||||
coding->src_multibyte = 0;
|
||||
coding->dst_multibyte = (coding->type != coding_type_no_conversion
|
||||
&& coding->type != coding_type_raw_text);
|
||||
|
||||
/* Try to skip the heading and tailing ASCIIs. */
|
||||
if (coding->type != coding_type_ccl)
|
||||
if (require_decoding && coding->type != coding_type_ccl)
|
||||
{
|
||||
int from_orig = from;
|
||||
|
||||
SHRINK_CONVERSION_REGION (&from, &to_byte, coding, XSTRING (str)->data,
|
||||
0);
|
||||
if (from == to_byte)
|
||||
return (nocopy ? str : Fcopy_sequence (str));
|
||||
require_decoding = 0;
|
||||
}
|
||||
|
||||
if (!require_decoding)
|
||||
{
|
||||
coding->consumed = STRING_BYTES (XSTRING (str));
|
||||
coding->consumed_char = XSTRING (str)->size;
|
||||
if (coding->dst_multibyte)
|
||||
{
|
||||
str = Fstring_as_multibyte (str);
|
||||
nocopy = 1;
|
||||
}
|
||||
coding->produced = STRING_BYTES (XSTRING (str));
|
||||
coding->produced_char = XSTRING (str)->size;
|
||||
return (nocopy ? str : Fcopy_sequence (str));
|
||||
}
|
||||
|
||||
if (coding->composing != COMPOSITION_DISABLED)
|
||||
coding_allocate_composition_data (coding, from);
|
||||
|
||||
len = decoding_buffer_size (coding, to_byte - from);
|
||||
len += from + STRING_BYTES (XSTRING (str)) - to_byte;
|
||||
GCPRO1 (str);
|
||||
|
@ -5286,8 +5295,11 @@ decode_coding_string (str, coding, nocopy)
|
|||
STRING_BYTES (XSTRING (str)) - to_byte);
|
||||
|
||||
len = from + STRING_BYTES (XSTRING (str)) - to_byte;
|
||||
str = make_multibyte_string (buf, len + coding->produced_char,
|
||||
len + coding->produced);
|
||||
if (coding->dst_multibyte)
|
||||
str = make_multibyte_string (buf, len + coding->produced_char,
|
||||
len + coding->produced);
|
||||
else
|
||||
str = make_unibyte_string (buf, len + coding->produced);
|
||||
|
||||
if (coding->cmp_data && coding->cmp_data->used)
|
||||
coding_restore_composition (coding, str);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue