Mercurial > emacs
changeset 20531:f019e056ad9a
(CHAR_HEAD_P): Take char, not pointer, as arg.
(INC_POS, DEC_POS): Fix because arg is a bufpos.
(BUF_INC_POS, BUF_DEC_POS): New macros.
(INC_BOTH, DEC_BOTH): New macros.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Wed, 31 Dec 1997 21:49:31 +0000 |
parents | 88d7475304df |
children | 7ffd3d9afeb4 |
files | src/charset.h |
diffstat | 1 files changed, 59 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/src/charset.h Wed Dec 31 21:48:28 1997 +0000 +++ b/src/charset.h Wed Dec 31 21:49:31 1997 +0000 @@ -134,9 +134,9 @@ extern int charset_big5_1; /* Big5 Level 1 (Chinese Traditional) */ extern int charset_big5_2; /* Big5 Level 2 (Chinese Traditional) */ -/* Check if STR points the head of multi-byte form, i.e. *STR is an - ASCII character or a base leading-code. */ -#define CHAR_HEAD_P(str) ((unsigned char) *(str) < 0xA0) +/* Check if CH is the head of multi-byte form, i.e., + an ASCII character or a base leading-code. */ +#define CHAR_HEAD_P(ch) ((unsigned char) (ch) < 0xA0) /*** GENERAL NOTE on CHARACTER REPRESENTATION *** @@ -599,10 +599,10 @@ range checking of POS. */ #define INC_POS(pos) \ do { \ - unsigned char *p = POS_ADDR (pos); \ + unsigned char *p = BYTE_POS_ADDR (pos); \ pos++; \ if (*p++ >= 0x80) \ - while (!CHAR_HEAD_P (p)) p++, pos++; \ + while (!CHAR_HEAD_P (*p)) p++, pos++; \ } while (0) /* Decrease the buffer point POS of the current buffer to the previous @@ -611,11 +611,63 @@ do { \ unsigned char *p, *p_min; \ int pos_saved = --pos; \ - if (pos < GPT) \ + if (pos < GPT_BYTE) \ p = BEG_ADDR + pos - 1, p_min = BEG_ADDR; \ else \ p = BEG_ADDR + GAP_SIZE + pos - 1, p_min = GAP_END_ADDR; \ - while (p > p_min && !CHAR_HEAD_P (p)) p--, pos--; \ + while (p > p_min && !CHAR_HEAD_P (*p)) p--, pos--; \ + if (*p < 0x80 && pos != pos_saved) pos = pos_saved; \ + } while (0) + +/* Increment both CHARPOS and BYTEPOS, each in the appropriate way. */ + +#define INC_BOTH(charpos, bytepos) \ +do \ + { \ + (charpos)++; \ + INC_POS ((bytepos)); \ + } \ +while (0) + +/* Decrement both CHARPOS and BYTEPOS, each in the appropriate way. */ + +#define DEC_BOTH(charpos, bytepos) \ +do \ + { \ + (charpos)--; \ + DEC_POS ((bytepos)); \ + } \ +while (0) + +/* Increase the buffer point POS of the current buffer to the next + character boundary. This macro relies on the fact that *GPT_ADDR + and *Z_ADDR are always accessible and the values are '\0'. No + range checking of POS. */ +#define BUF_INC_POS(buf, pos) \ + do { \ + unsigned char *p = BUF_BYTE_ADDRESS (buf, pos); \ + pos++; \ + if (*p++ >= 0x80) \ + while (!CHAR_HEAD_P (*p)) p++, pos++; \ + } while (0) + +/* Decrease the buffer point POS of the current buffer to the previous + character boundary. No range checking of POS. */ +#define BUF_DEC_POS(buf, pos) \ + do { \ + unsigned char *p, *p_min; \ + int pos_saved = --pos; \ + if (pos < BUF_GPT_BYTE (buf)) \ + { \ + p = BUF_BEG_ADDR (buf) + pos - 1; \ + p_min = BUF_BEG_ADDR (buf); \ + } \ + else \ + { \ + p = BUF_BEG_ADDR (buf) + BUF_GAP_SIZE (buf) + pos - 1; \ + p_min = BUF_GAP_END_ADDR (buf); \ + } \ + while (p > p_min && !CHAR_HEAD_P (*p)) p--, pos--; \ if (*p < 0x80 && pos != pos_saved) pos = pos_saved; \ } while (0)