aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Monnier2006-09-22 17:30:02 +0000
committerStefan Monnier2006-09-22 17:30:02 +0000
commit3ffcda547185fe2950f0ffe108604a1a13dd7b8b (patch)
tree08591a7b97d476ffbb9d67a33a012baebaf9f805
parent339250d54fa826eed7c190c1d730c461d83d4164 (diff)
downloademacs-3ffcda547185fe2950f0ffe108604a1a13dd7b8b.tar.gz
emacs-3ffcda547185fe2950f0ffe108604a1a13dd7b8b.zip
(PREV_CHAR_BOUNDARY): Make it work from within a char's byte sequence.
(AT_CHAR_BOUNDARY): New macro.
-rw-r--r--src/charset.h22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/charset.h b/src/charset.h
index b7ab4cb8b53..b25a2ffa85a 100644
--- a/src/charset.h
+++ b/src/charset.h
@@ -658,22 +658,34 @@ else
658 } while (0) 658 } while (0)
659 659
660 660
661/* If P is after LIMIT, advance P to the previous character boundary. 661/* If P is after LIMIT, advance P to the previous character boundary. */
662 It assumes that P is already at a character boundary of the sane
663 mulitbyte form whose beginning address is LIMIT. */
664 662
665#define PREV_CHAR_BOUNDARY(p, limit) \ 663#define PREV_CHAR_BOUNDARY(p, limit) \
666 do { \ 664 do { \
667 if ((p) > (limit)) \ 665 if ((p) > (limit)) \
668 { \ 666 { \
669 const unsigned char *p0 = (p); \ 667 const unsigned char *p0 = (p); \
668 const unsigned char *p_limit = max (limit, p0 - MAX_MULTIBYTE_LENGTH);\
670 do { \ 669 do { \
671 p0--; \ 670 p0--; \
672 } while (p0 >= limit && ! CHAR_HEAD_P (*p0)); \ 671 } while (p0 >= p_limit && ! CHAR_HEAD_P (*p0)); \
673 (p) = (BYTES_BY_CHAR_HEAD (*p0) == (p) - p0) ? p0 : (p) - 1; \ 672 /* If BBCH(*p0) > p-p0, it means we were not on a boundary. */ \
673 (p) = (BYTES_BY_CHAR_HEAD (*p0) >= (p) - p0) ? p0 : (p) - 1; \
674 } \ 674 } \
675 } while (0) 675 } while (0)
676 676
677#define AT_CHAR_BOUNDARY_P(result, p, limit) \
678 do { \
679 if (CHAR_HEAD_P (*(p)) || (p) <= limit) \
680 /* Optimization for the common case. */ \
681 (result) = 1; \
682 else \
683 { \
684 const unsigned char *p_aux = (p)+1; \
685 PREV_CHAR_BOUNDARY (p_aux, limit); \
686 (result) = (p_aux == (p)); \
687 } \
688} while (0)
677 689
678#ifdef emacs 690#ifdef emacs
679 691