diff options
| author | Stefan Monnier | 2006-09-22 17:30:02 +0000 |
|---|---|---|
| committer | Stefan Monnier | 2006-09-22 17:30:02 +0000 |
| commit | 3ffcda547185fe2950f0ffe108604a1a13dd7b8b (patch) | |
| tree | 08591a7b97d476ffbb9d67a33a012baebaf9f805 | |
| parent | 339250d54fa826eed7c190c1d730c461d83d4164 (diff) | |
| download | emacs-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.h | 22 |
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 | ||