comparison src/charset.h @ 44323:fcc0f55d734f

(DEC_POS, BUF_DEC_POS): Use BEG_BYTE. Bound the search with MAX_MULTIBYTE_LENGTH to avoid pathological case.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Mon, 01 Apr 2002 22:58:39 +0000
parents ab30bd62a6a8
children 40db0673e6f0
comparison
equal deleted inserted replaced
44322:fca902769bf4 44323:fcc0f55d734f
673 do { \ 673 do { \
674 unsigned char *p, *p_min; \ 674 unsigned char *p, *p_min; \
675 \ 675 \
676 pos_byte--; \ 676 pos_byte--; \
677 if (pos_byte < GPT_BYTE) \ 677 if (pos_byte < GPT_BYTE) \
678 p = BEG_ADDR + pos_byte - 1, p_min = BEG_ADDR; \ 678 p = BEG_ADDR + pos_byte - BEG_BYTE, p_min = BEG_ADDR; \
679 else \ 679 else \
680 p = BEG_ADDR + GAP_SIZE + pos_byte - 1, p_min = GAP_END_ADDR; \ 680 p = BEG_ADDR + GAP_SIZE + pos_byte - BEG_BYTE, p_min = GAP_END_ADDR;\
681 if (p > p_min && !CHAR_HEAD_P (*p)) \ 681 if (p > p_min && !CHAR_HEAD_P (*p)) \
682 { \ 682 { \
683 unsigned char *pend = p--; \ 683 unsigned char *pend = p--; \
684 int len, bytes; \ 684 int len, bytes; \
685 if (p_min < p - MAX_MULTIBYTE_LENGTH) \
686 p_min = p - MAX_MULTIBYTE_LENGTH; \
685 while (p > p_min && !CHAR_HEAD_P (*p)) p--; \ 687 while (p > p_min && !CHAR_HEAD_P (*p)) p--; \
686 len = pend + 1 - p; \ 688 len = pend + 1 - p; \
687 PARSE_MULTIBYTE_SEQ (p, len, bytes); \ 689 PARSE_MULTIBYTE_SEQ (p, len, bytes); \
688 if (bytes == len) \ 690 if (bytes == len) \
689 pos_byte -= len - 1; \ 691 pos_byte -= len - 1; \
753 do { \ 755 do { \
754 unsigned char *p, *p_min; \ 756 unsigned char *p, *p_min; \
755 pos_byte--; \ 757 pos_byte--; \
756 if (pos_byte < BUF_GPT_BYTE (buf)) \ 758 if (pos_byte < BUF_GPT_BYTE (buf)) \
757 { \ 759 { \
758 p = BUF_BEG_ADDR (buf) + pos_byte - 1; \ 760 p = BUF_BEG_ADDR (buf) + pos_byte - BEG_BYTE; \
759 p_min = BUF_BEG_ADDR (buf); \ 761 p_min = BUF_BEG_ADDR (buf); \
760 } \ 762 } \
761 else \ 763 else \
762 { \ 764 { \
763 p = BUF_BEG_ADDR (buf) + BUF_GAP_SIZE (buf) + pos_byte - 1; \ 765 p = BUF_BEG_ADDR (buf) + BUF_GAP_SIZE (buf) + pos_byte - BEG_BYTE;\
764 p_min = BUF_GAP_END_ADDR (buf); \ 766 p_min = BUF_GAP_END_ADDR (buf); \
765 } \ 767 } \
766 if (p > p_min && !CHAR_HEAD_P (*p)) \ 768 if (p > p_min && !CHAR_HEAD_P (*p)) \
767 { \ 769 { \
768 unsigned char *pend = p--; \ 770 unsigned char *pend = p--; \
769 int len, bytes; \ 771 int len, bytes; \
772 if (p_min < p - MAX_MULTIBYTE_LENGTH) \
773 p_min = p - MAX_MULTIBYTE_LENGTH; \
770 while (p > p_min && !CHAR_HEAD_P (*p)) p--; \ 774 while (p > p_min && !CHAR_HEAD_P (*p)) p--; \
771 len = pend + 1 - p; \ 775 len = pend + 1 - p; \
772 PARSE_MULTIBYTE_SEQ (p, len, bytes); \ 776 PARSE_MULTIBYTE_SEQ (p, len, bytes); \
773 if (bytes == len) \ 777 if (bytes == len) \
774 pos_byte -= len - 1; \ 778 pos_byte -= len - 1; \