comparison src/coding.c @ 30950:5682de5cfdac

(decode_coding_string): Set members consumed, consumed_char, produced, produced_char of *coding correctly. If decode_coding doesn't consume any byte, don't try anymore. (encode_coding_string): Likewise.
author Kenichi Handa <handa@m17n.org>
date Fri, 18 Aug 2000 06:41:15 +0000
parents 91e24edb537a
children e6acd4b6a8d5
comparison
equal deleted inserted replaced
30949:54e668cd8c0b 30950:5682de5cfdac
5233 Lisp_Object saved_coding_symbol; 5233 Lisp_Object saved_coding_symbol;
5234 int result; 5234 int result;
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;
5242 to_byte = STRING_BYTES (XSTRING (str)); 5242 to_byte = STRING_BYTES (XSTRING (str));
5243 5243
5304 if (coding->composing != COMPOSITION_DISABLED) 5304 if (coding->composing != COMPOSITION_DISABLED)
5305 coding_allocate_composition_data (coding, from); 5305 coding_allocate_composition_data (coding, from);
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);
5322 else if (result == CODING_FINISH_INSUFFICIENT_DST) 5325 else if (result == CODING_FINISH_INSUFFICIENT_DST)
5323 extend_conversion_buffer (&buf); 5326 extend_conversion_buffer (&buf);
5349 coding->eol_type = CODING_EOL_LF; 5352 coding->eol_type = CODING_EOL_LF;
5350 coding->symbol = saved_coding_symbol; 5353 coding->symbol = saved_coding_symbol;
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);
5357 else 5365 else
5358 newstr = make_uninit_string (produced + shrinked_bytes); 5366 newstr = make_uninit_string (produced + shrinked_bytes);
5388 struct gcpro gcpro1; 5396 struct gcpro gcpro1;
5389 Lisp_Object saved_coding_symbol; 5397 Lisp_Object saved_coding_symbol;
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)))
5397 str = run_pre_post_conversion_on_str (str, coding, 1); 5405 str = run_pre_post_conversion_on_str (str, coding, 1);
5398 5406
5401 to_byte = STRING_BYTES (XSTRING (str)); 5409 to_byte = STRING_BYTES (XSTRING (str));
5402 5410
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
5414 /* Encoding routines determine the multibyteness of the source text 5426 /* Encoding routines determine the multibyteness of the source text
5415 by coding->src_multibyte. */ 5427 by coding->src_multibyte. */
5430 } 5442 }
5431 5443
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 }
5463
5464 coding->consumed = consumed;
5465 coding->consumed_char = consumed_char;
5466 coding->produced = produced;
5467 coding->produced_char = produced_char;
5449 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);
5453 bcopy (buf.data, XSTRING (newstr)->data + from, produced); 5472 bcopy (buf.data, XSTRING (newstr)->data + from, produced);