Mercurial > emacs
changeset 25251:1fb18e7e3f35
(read_escape): For Control modifier, pay attention to
multibyte character.
(read1): Likewise. Singal error or a multibyte character which
has a modifer bit. Check validity of Shift modifer.
author | Kenichi Handa <handa@m17n.org> |
---|---|
date | Fri, 13 Aug 1999 12:54:36 +0000 |
parents | 2228d0a678ef |
children | fc1b2b29e66d |
files | src/lread.c |
diffstat | 1 files changed, 19 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lread.c Fri Aug 13 12:54:08 1999 +0000 +++ b/src/lread.c Fri Aug 13 12:54:36 1999 +0000 @@ -1492,8 +1492,10 @@ c = READCHAR; if (c == '\\') c = read_escape (readcharfun, 0); - if ((c & 0177) == '?') - return 0177 | c; + if ((c & ~CHAR_MODIFIER_MASK) == '?') + return 0177 | (c & CHAR_MODIFIER_MASK); + else if (! SINGLE_BYTE_CHAR_P ((c & ~CHAR_MODIFIER_MASK))) + return c | ctrl_modifier; /* ASCII control chars are made from letters (both cases), as well as the non-letters within 0100...0137. */ else if ((c & 0137) >= 0101 && (c & 0137) <= 0132) @@ -1949,17 +1951,20 @@ /* If an escape specifies a non-ASCII single-byte character, this must be a unibyte string. */ - if (SINGLE_BYTE_CHAR_P ((c & ~CHAR_META)) - && ! ASCII_BYTE_P (c)) + if (SINGLE_BYTE_CHAR_P ((c & ~CHAR_MODIFIER_MASK)) + && ! ASCII_BYTE_P ((c & ~CHAR_MODIFIER_MASK))) force_singlebyte = 1; } - if (! SINGLE_BYTE_CHAR_P ((c & ~CHAR_META))) + if (! SINGLE_BYTE_CHAR_P ((c & ~CHAR_MODIFIER_MASK))) { unsigned char workbuf[4]; unsigned char *str = workbuf; int length; + /* Any modifiers for a multibyte character are invalid. */ + if (c & CHAR_MODIFIER_MASK) + error ("Invalid modifier in string"); length = non_ascii_char_to_string (c, workbuf, &str); if (length > 1) force_multibyte = 1; @@ -1975,6 +1980,15 @@ else if (c == (CHAR_CTL | '?')) c = 127; + if (c & CHAR_SHIFT) + { + /* Shift modifier is valid only with [A-Za-z]. */ + if ((c & 0377) >= 'A' && (c & 0377) <= 'Z') + c &= ~CHAR_SHIFT; + else if ((c & 0377) >= 'a' && (c & 0377) <= 'z') + c = (c & ~CHAR_SHIFT) - ('a' - 'A'); + } + if (c & CHAR_META) /* Move the meta bit to the right place for a string. */ c = (c & ~CHAR_META) | 0x80;