comparison src/coding.c @ 23315:86a8b8566369

(decode_eol): While decoding DOS-like eol, handle a single CR code correctly. (shrink_decoding_region) <CODING_CATEGORY_IDX_ISO_7 or CODING_CATEGORY_IDX_ISO_7_TIGHT>: Skip also 8-bit codes.
author Kenichi Handa <handa@m17n.org>
date Fri, 25 Sep 1998 07:32:05 +0000
parents ca159e828a68
children bbd06336cd0c
comparison
equal deleted inserted replaced
23314:87acd2b6ce97 23315:86a8b8566369
2527 2527
2528 c = *src++; 2528 c = *src++;
2529 if (c == '\r') 2529 if (c == '\r')
2530 { 2530 {
2531 ONE_MORE_BYTE (c); 2531 ONE_MORE_BYTE (c);
2532 if (c != '\n') 2532 if (c == '\n')
2533 *dst++ = c;
2534 else
2533 { 2535 {
2534 if (coding->mode & CODING_MODE_INHIBIT_INCONSISTENT_EOL) 2536 if (coding->mode & CODING_MODE_INHIBIT_INCONSISTENT_EOL)
2535 { 2537 {
2536 result = CODING_FINISH_INCONSISTENT_EOL; 2538 result = CODING_FINISH_INCONSISTENT_EOL;
2537 goto label_end_of_loop_2; 2539 goto label_end_of_loop_2;
2538 } 2540 }
2541 src--;
2539 *dst++ = '\r'; 2542 *dst++ = '\r';
2540 if (BASE_LEADING_CODE_P (c)) 2543 if (BASE_LEADING_CODE_P (c))
2541 coding->fake_multibyte = 1; 2544 coding->fake_multibyte = 1;
2542 } 2545 }
2543 *dst++ = c;
2544 } 2546 }
2545 else if (c == '\n' 2547 else if (c == '\n'
2546 && (coding->mode & CODING_MODE_INHIBIT_INCONSISTENT_EOL)) 2548 && (coding->mode & CODING_MODE_INHIBIT_INCONSISTENT_EOL))
2547 { 2549 {
2548 result = CODING_FINISH_INCONSISTENT_EOL; 2550 result = CODING_FINISH_INCONSISTENT_EOL;
2560 result = CODING_FINISH_INSUFFICIENT_SRC; 2562 result = CODING_FINISH_INSUFFICIENT_SRC;
2561 label_end_of_loop_2: 2563 label_end_of_loop_2:
2562 src = src_base; 2564 src = src_base;
2563 break; 2565 break;
2564 } 2566 }
2565 if (result == CODING_FINISH_NORMAL 2567 if (src < src_end)
2566 && src < src_end) 2568 {
2567 result = CODING_FINISH_INSUFFICIENT_DST; 2569 if (result == CODING_FINISH_NORMAL)
2570 result = CODING_FINISH_INSUFFICIENT_DST;
2571 else if (result != CODING_FINISH_INCONSISTENT_EOL
2572 && coding->mode & CODING_MODE_LAST_BLOCK)
2573 {
2574 /* This is the last block of the text to be decoded.
2575 We flush out all remaining codes. */
2576 src_bytes = src_end - src;
2577 if (dst_bytes && (dst_end - dst < src_bytes))
2578 src_bytes = dst_end - dst;
2579 bcopy (src, dst, src_bytes);
2580 dst += src_bytes;
2581 src += src_bytes;
2582 }
2583 }
2568 } 2584 }
2569 break; 2585 break;
2570 2586
2571 case CODING_EOL_CR: 2587 case CODING_EOL_CR:
2572 if (coding->mode & CODING_MODE_INHIBIT_INCONSISTENT_EOL) 2588 if (coding->mode & CODING_MODE_INHIBIT_INCONSISTENT_EOL)
3924 case CODING_CATEGORY_IDX_ISO_7_TIGHT: 3940 case CODING_CATEGORY_IDX_ISO_7_TIGHT:
3925 /* We can skip all charactes at the tail except for ESC and 3941 /* We can skip all charactes at the tail except for ESC and
3926 the following 2-byte at the tail. */ 3942 the following 2-byte at the tail. */
3927 if (eol_conversion) 3943 if (eol_conversion)
3928 while (begp < endp 3944 while (begp < endp
3929 && (c = endp[-1]) < 0x80 && c != ISO_CODE_ESC && c != '\r') 3945 && (c = endp[-1]) != ISO_CODE_ESC && c != '\r')
3930 endp--; 3946 endp--;
3931 else 3947 else
3932 while (begp < endp 3948 while (begp < endp
3933 && (c = endp[-1]) < 0x80 && c != ISO_CODE_ESC) 3949 && (c = endp[-1]) != ISO_CODE_ESC)
3934 endp--; 3950 endp--;
3935 /* Do not consider LF as ascii if preceded by CR, since that 3951 /* Do not consider LF as ascii if preceded by CR, since that
3936 confuses eol decoding. */ 3952 confuses eol decoding. */
3937 if (begp < endp && endp < endp_orig && endp[-1] == '\r' && endp[0] == '\n') 3953 if (begp < endp && endp < endp_orig && endp[-1] == '\r' && endp[0] == '\n')
3938 endp++; 3954 endp++;