changeset 92483:95fab6416567

(char_resolve_modifier_mask): New function. (char_string): Use char_resolve_modifier_mask.
author Kenichi Handa <handa@m17n.org>
date Wed, 05 Mar 2008 02:08:30 +0000
parents 83962f810455
children 9c883b96e06a
files src/character.c
diffstat 1 files changed, 46 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- 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;
     }