diff options
author | Stefan Monnier <[email protected]> | 2006-09-22 17:30:02 +0000 |
---|---|---|
committer | Stefan Monnier <[email protected]> | 2006-09-22 17:30:02 +0000 |
commit | 3ffcda547185fe2950f0ffe108604a1a13dd7b8b (patch) | |
tree | 08591a7b97d476ffbb9d67a33a012baebaf9f805 /src | |
parent | 339250d54fa826eed7c190c1d730c461d83d4164 (diff) |
(PREV_CHAR_BOUNDARY): Make it work from within a char's byte sequence.
(AT_CHAR_BOUNDARY): New macro.
Diffstat (limited to 'src')
-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 b7ab4cb8b5..b25a2ffa85 100644 --- a/src/charset.h +++ b/src/charset.h @@ -658,22 +658,34 @@ else } while (0) -/* If P is after LIMIT, advance P to the previous character boundary. - It assumes that P is already at a character boundary of the sane - mulitbyte form whose beginning address is LIMIT. */ +/* If P is after LIMIT, advance P to the previous character boundary. */ #define PREV_CHAR_BOUNDARY(p, limit) \ do { \ if ((p) > (limit)) \ { \ const unsigned char *p0 = (p); \ + const unsigned char *p_limit = max (limit, p0 - MAX_MULTIBYTE_LENGTH);\ do { \ p0--; \ - } while (p0 >= limit && ! CHAR_HEAD_P (*p0)); \ - (p) = (BYTES_BY_CHAR_HEAD (*p0) == (p) - p0) ? p0 : (p) - 1; \ + } while (p0 >= p_limit && ! CHAR_HEAD_P (*p0)); \ + /* If BBCH(*p0) > p-p0, it means we were not on a boundary. */ \ + (p) = (BYTES_BY_CHAR_HEAD (*p0) >= (p) - p0) ? p0 : (p) - 1; \ } \ } while (0) +#define AT_CHAR_BOUNDARY_P(result, p, limit) \ + do { \ + if (CHAR_HEAD_P (*(p)) || (p) <= limit) \ + /* Optimization for the common case. */ \ + (result) = 1; \ + else \ + { \ + const unsigned char *p_aux = (p)+1; \ + PREV_CHAR_BOUNDARY (p_aux, limit); \ + (result) = (p_aux == (p)); \ + } \ +} while (0) #ifdef emacs |