# HG changeset patch # User Kenichi Handa # Date 1204682910 0 # Node ID 95fab641656788cc74a16f08ac5d14feba1c260e # Parent 83962f8104551fc575923eea7621b6cfb627351f (char_resolve_modifier_mask): New function. (char_string): Use char_resolve_modifier_mask. diff -r 83962f810455 -r 95fab6416567 src/character.c --- a/src/character.c Wed Mar 05 01:57:57 2008 +0000 +++ b/src/character.c Wed Mar 05 02:08:30 2008 +0000 @@ -96,6 +96,51 @@ +/* If character code C has modifier masks, reflect them to the + character code if possible. Return the resulting code. */ + +int +char_resolve_modifier_mask (c) + int c; +{ + /* An non-ASCII character can't reflect modifier bits to the code. */ + if (! ASCII_CHAR_P ((c & ~CHAR_MODIFIER_MASK))) + return c; + + /* For Meta, Shift, and Control modifiers, we need special care. */ + if (c & CHAR_META) + { + /* Move the meta bit to the right place for a string. */ + c = (c & ~CHAR_META) | 0x80; + } + 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_CTL) + { + /* Simulate the code in lread.c. */ + /* Allow `\C- ' and `\C-?'. */ + if ((c & ~CHAR_CTL) == ' ') + c = 0; + else if ((c & ~CHAR_CTL) == '?') + c = 127; + /* 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) + c &= (037 | (~0177 & ~CHAR_CTL)); + else if ((c & 0177) >= 0100 && (c & 0177) <= 0137) + c &= (037 | (~0177 & ~CHAR_CTL)); + } + + return c; +} + + /* Store multibyte form of character C at P. If C has modifier bits, handle them appropriately. */ @@ -108,41 +153,7 @@ if (c & CHAR_MODIFIER_MASK) { - /* As an non-ASCII character can't have modifier bits, we just - ignore the bits. */ - if (ASCII_CHAR_P ((c & ~CHAR_MODIFIER_MASK))) - { - /* For Meta, Shift, and Control modifiers, we need special care. */ - if (c & CHAR_META) - { - /* Move the meta bit to the right place for a string. */ - c = (c & ~CHAR_META) | 0x80; - } - 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_CTL) - { - /* Simulate the code in lread.c. */ - /* Allow `\C- ' and `\C-?'. */ - if (c == (CHAR_CTL | ' ')) - c = 0; - else if (c == (CHAR_CTL | '?')) - c = 127; - /* 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) - c &= (037 | (~0177 & ~CHAR_CTL)); - else if ((c & 0177) >= 0100 && (c & 0177) <= 0137) - c &= (037 | (~0177 & ~CHAR_CTL)); - } - } - + c = (unsigned) char_resolve_modifier_mask ((int) c); /* If C still has any modifier bits, just ignore it. */ c &= ~CHAR_MODIFIER_MASK; }