emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] Changes to emacs/src/character.c,v


From: Kenichi Handa
Subject: [Emacs-diffs] Changes to emacs/src/character.c,v
Date: Wed, 05 Mar 2008 04:18:01 +0000

CVSROOT:        /cvsroot/emacs
Module name:    emacs
Changes by:     Kenichi Handa <handa>   08/03/05 04:18:00

Index: character.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/character.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- character.c 5 Mar 2008 02:08:30 -0000       1.5
+++ character.c 5 Mar 2008 04:18:00 -0000       1.6
@@ -103,16 +103,11 @@
 char_resolve_modifier_mask (c)
      int c;
 {
-  /* An non-ASCII character can't reflect modifier bits to the code.  */
+  /* A 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].  */
@@ -120,6 +115,15 @@
        c &= ~CHAR_SHIFT;
       else if ((c & 0377) >= 'a' && (c & 0377) <= 'z')
        c = (c & ~CHAR_SHIFT) - ('a' - 'A');
+      /* Shift modifier with ASCII control characters should be
+        ignored.  */
+      else if ((c & ~CHAR_MODIFIER_MASK) < 0x20)
+       c &= ~CHAR_SHIFT;
+    }
+  if (c & CHAR_META)
+    {
+      /* Move the meta bit to the right place for a string.  */
+      c = (c & ~CHAR_META) | 0x80;
     }
   if (c & CHAR_CTL)
     {
@@ -967,6 +971,22 @@
   return make_string_from_bytes ((char *) buf, n, p - buf);
 }
 
+DEFUN ("char-resolve-modifers", Fchar_resolve_modifiers,
+       Schar_resolve_modifiers, 1, 1, 0,
+       doc: /* Resolve modifiers in the character CHAR.
+The value is a character with modifiers resolved into the character
+code.  Unresolved modifiers are kept in the value.
+usage: (char-resolve-modifers CHAR)  */)
+     (character)
+     Lisp_Object character;
+{
+  int c;
+
+  CHECK_NUMBER (character);
+  c = XINT (character);
+  return make_number (char_resolve_modifier_mask (c));
+}
+
 void
 init_character_once ()
 {
@@ -993,6 +1013,7 @@
   defsubr (&Schar_direction);
   defsubr (&Sstring);
   defsubr (&Sunibyte_string);
+  defsubr (&Schar_resolve_modifiers);
 
   DEFVAR_LISP ("translation-table-vector",  &Vtranslation_table_vector,
               doc: /*




reply via email to

[Prev in Thread] Current Thread [Next in Thread]