diff options
Diffstat (limited to 'src/coding.c')
| -rw-r--r-- | src/coding.c | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/src/coding.c b/src/coding.c index 462f88b23cc..2d37386070d 100644 --- a/src/coding.c +++ b/src/coding.c | |||
| @@ -5235,7 +5235,7 @@ decode_coding_string (str, coding, nocopy) | |||
| 5235 | int require_decoding; | 5235 | int require_decoding; |
| 5236 | int shrinked_bytes = 0; | 5236 | int shrinked_bytes = 0; |
| 5237 | Lisp_Object newstr; | 5237 | Lisp_Object newstr; |
| 5238 | int consumed, produced, produced_char; | 5238 | int consumed, consumed_char, produced, produced_char; |
| 5239 | 5239 | ||
| 5240 | from = 0; | 5240 | from = 0; |
| 5241 | to = XSTRING (str)->size; | 5241 | to = XSTRING (str)->size; |
| @@ -5306,16 +5306,19 @@ decode_coding_string (str, coding, nocopy) | |||
| 5306 | len = decoding_buffer_size (coding, to_byte - from); | 5306 | len = decoding_buffer_size (coding, to_byte - from); |
| 5307 | allocate_conversion_buffer (buf, len); | 5307 | allocate_conversion_buffer (buf, len); |
| 5308 | 5308 | ||
| 5309 | consumed = produced = produced_char = 0; | 5309 | consumed = consumed_char = produced = produced_char = 0; |
| 5310 | while (1) | 5310 | while (1) |
| 5311 | { | 5311 | { |
| 5312 | result = decode_coding (coding, XSTRING (str)->data + from + consumed, | 5312 | result = decode_coding (coding, XSTRING (str)->data + from + consumed, |
| 5313 | buf.data + produced, to_byte - from - consumed, | 5313 | buf.data + produced, to_byte - from - consumed, |
| 5314 | buf.size - produced); | 5314 | buf.size - produced); |
| 5315 | consumed += coding->consumed; | 5315 | consumed += coding->consumed; |
| 5316 | consumed_char += coding->consumed_char; | ||
| 5316 | produced += coding->produced; | 5317 | produced += coding->produced; |
| 5317 | produced_char += coding->produced_char; | 5318 | produced_char += coding->produced_char; |
| 5318 | if (result == CODING_FINISH_NORMAL) | 5319 | if (result == CODING_FINISH_NORMAL |
| 5320 | || (result == CODING_FINISH_INSUFFICIENT_SRC | ||
| 5321 | && coding->consumed == 0)) | ||
| 5319 | break; | 5322 | break; |
| 5320 | if (result == CODING_FINISH_INSUFFICIENT_CMP) | 5323 | if (result == CODING_FINISH_INSUFFICIENT_CMP) |
| 5321 | coding_allocate_composition_data (coding, from + produced_char); | 5324 | coding_allocate_composition_data (coding, from + produced_char); |
| @@ -5351,6 +5354,11 @@ decode_coding_string (str, coding, nocopy) | |||
| 5351 | } | 5354 | } |
| 5352 | } | 5355 | } |
| 5353 | 5356 | ||
| 5357 | coding->consumed = consumed; | ||
| 5358 | coding->consumed_char = consumed_char; | ||
| 5359 | coding->produced = produced; | ||
| 5360 | coding->produced_char = produced_char; | ||
| 5361 | |||
| 5354 | if (coding->dst_multibyte) | 5362 | if (coding->dst_multibyte) |
| 5355 | newstr = make_uninit_multibyte_string (produced_char + shrinked_bytes, | 5363 | newstr = make_uninit_multibyte_string (produced_char + shrinked_bytes, |
| 5356 | produced + shrinked_bytes); | 5364 | produced + shrinked_bytes); |
| @@ -5390,7 +5398,7 @@ encode_coding_string (str, coding, nocopy) | |||
| 5390 | int result; | 5398 | int result; |
| 5391 | int shrinked_bytes = 0; | 5399 | int shrinked_bytes = 0; |
| 5392 | Lisp_Object newstr; | 5400 | Lisp_Object newstr; |
| 5393 | int consumed, consumed_char, produced; | 5401 | int consumed, consumed_char, produced, produced_char; |
| 5394 | 5402 | ||
| 5395 | if (SYMBOLP (coding->pre_write_conversion) | 5403 | if (SYMBOLP (coding->pre_write_conversion) |
| 5396 | && !NILP (Ffboundp (coding->pre_write_conversion))) | 5404 | && !NILP (Ffboundp (coding->pre_write_conversion))) |
| @@ -5403,11 +5411,15 @@ encode_coding_string (str, coding, nocopy) | |||
| 5403 | saved_coding_symbol = Qnil; | 5411 | saved_coding_symbol = Qnil; |
| 5404 | if (! CODING_REQUIRE_ENCODING (coding)) | 5412 | if (! CODING_REQUIRE_ENCODING (coding)) |
| 5405 | { | 5413 | { |
| 5414 | coding->consumed = STRING_BYTES (XSTRING (str)); | ||
| 5415 | coding->consumed_char = XSTRING (str)->size; | ||
| 5406 | if (STRING_MULTIBYTE (str)) | 5416 | if (STRING_MULTIBYTE (str)) |
| 5407 | { | 5417 | { |
| 5408 | str = Fstring_as_unibyte (str); | 5418 | str = Fstring_as_unibyte (str); |
| 5409 | nocopy = 1; | 5419 | nocopy = 1; |
| 5410 | } | 5420 | } |
| 5421 | coding->produced = STRING_BYTES (XSTRING (str)); | ||
| 5422 | coding->produced_char = XSTRING (str)->size; | ||
| 5411 | return (nocopy ? str : Fcopy_sequence (str)); | 5423 | return (nocopy ? str : Fcopy_sequence (str)); |
| 5412 | } | 5424 | } |
| 5413 | 5425 | ||
| @@ -5432,21 +5444,28 @@ encode_coding_string (str, coding, nocopy) | |||
| 5432 | len = encoding_buffer_size (coding, to_byte - from); | 5444 | len = encoding_buffer_size (coding, to_byte - from); |
| 5433 | allocate_conversion_buffer (buf, len); | 5445 | allocate_conversion_buffer (buf, len); |
| 5434 | 5446 | ||
| 5435 | consumed = consumed_char = produced = 0; | 5447 | consumed = consumed_char = produced = produced_char = 0; |
| 5436 | |||
| 5437 | while (1) | 5448 | while (1) |
| 5438 | { | 5449 | { |
| 5439 | result = encode_coding (coding, XSTRING (str)->data + from + consumed, | 5450 | result = encode_coding (coding, XSTRING (str)->data + from + consumed, |
| 5440 | buf.data + produced, to_byte - from - consumed, | 5451 | buf.data + produced, to_byte - from - consumed, |
| 5441 | buf.size - produced); | 5452 | buf.size - produced); |
| 5442 | consumed += coding->consumed; | 5453 | consumed += coding->consumed; |
| 5443 | produced += coding->produced; | 5454 | consumed_char += coding->consumed_char; |
| 5444 | if (result == CODING_FINISH_NORMAL) | 5455 | produced_char += coding->produced_char; |
| 5456 | if (result == CODING_FINISH_NORMAL | ||
| 5457 | || (result == CODING_FINISH_INSUFFICIENT_SRC | ||
| 5458 | && coding->consumed == 0)) | ||
| 5445 | break; | 5459 | break; |
| 5446 | /* Now result should be CODING_FINISH_INSUFFICIENT_DST. */ | 5460 | /* Now result should be CODING_FINISH_INSUFFICIENT_DST. */ |
| 5447 | extend_conversion_buffer (&buf); | 5461 | extend_conversion_buffer (&buf); |
| 5448 | } | 5462 | } |
| 5449 | 5463 | ||
| 5464 | coding->consumed = consumed; | ||
| 5465 | coding->consumed_char = consumed_char; | ||
| 5466 | coding->produced = produced; | ||
| 5467 | coding->produced_char = produced_char; | ||
| 5468 | |||
| 5450 | newstr = make_uninit_string (produced + shrinked_bytes); | 5469 | newstr = make_uninit_string (produced + shrinked_bytes); |
| 5451 | if (from > 0) | 5470 | if (from > 0) |
| 5452 | bcopy (XSTRING (str)->data, XSTRING (newstr)->data, from); | 5471 | bcopy (XSTRING (str)->data, XSTRING (newstr)->data, from); |