]> git.eshelyaron.com Git - emacs.git/commitdiff
* character.c (alphabeticp, decimalnump): Avoid undefined behavior
authorPaul Eggert <eggert@cs.ucla.edu>
Sat, 28 Feb 2015 21:19:55 +0000 (13:19 -0800)
committerPaul Eggert <eggert@cs.ucla.edu>
Sat, 28 Feb 2015 21:20:51 +0000 (13:20 -0800)
if CATEGORY is not an integer, or is an integer out of
unicode_category_t range.

src/ChangeLog
src/character.c

index 63ee7dffa21c0d3c2161151182555c4e9d29e720..4aa64c1d6f9403ec10404616e909c8ea8f0ed127 100644 (file)
@@ -1,3 +1,9 @@
+2015-02-28  Paul Eggert  <eggert@cs.ucla.edu>
+
+       * character.c (alphabeticp, decimalnump): Avoid undefined behavior
+       if CATEGORY is not an integer, or is an integer out of
+       unicode_category_t range.
+
 2015-02-28  Martin Rudalics  <rudalics@gmx.at>
 
        * frame.c (make_initial_frame, Fmake_terminal_frame): Set
index 999f99aa0030c0416c1ffcf721b023401007625e..ad78f512f43b57355143ede329bcbd4c808a0686 100644 (file)
@@ -990,24 +990,22 @@ bool
 alphabeticp (int c)
 {
   Lisp_Object category = CHAR_TABLE_REF (Vunicode_category_table, c);
-
-  if (INTEGERP (category))
-    {
-      unicode_category_t gen_cat = XINT (category);
-
-      /* See UTS #18.  There are additional characters that should be
-        here, those designated as Other_uppercase, Other_lowercase,
-        and Other_alphabetic; FIXME.  */
-      return (gen_cat == UNICODE_CATEGORY_Lu
-             || gen_cat == UNICODE_CATEGORY_Ll
-             || gen_cat == UNICODE_CATEGORY_Lt
-             || gen_cat == UNICODE_CATEGORY_Lm
-             || gen_cat == UNICODE_CATEGORY_Lo
-             || gen_cat == UNICODE_CATEGORY_Mn
-             || gen_cat == UNICODE_CATEGORY_Mc
-             || gen_cat == UNICODE_CATEGORY_Me
-             || gen_cat == UNICODE_CATEGORY_Nl) ? true : false;
-    }
+  if (! INTEGERP (category))
+    return false;
+  EMACS_INT gen_cat = XINT (category);
+
+  /* See UTS #18.  There are additional characters that should be
+     here, those designated as Other_uppercase, Other_lowercase,
+     and Other_alphabetic; FIXME.  */
+  return (gen_cat == UNICODE_CATEGORY_Lu
+         || gen_cat == UNICODE_CATEGORY_Ll
+         || gen_cat == UNICODE_CATEGORY_Lt
+         || gen_cat == UNICODE_CATEGORY_Lm
+         || gen_cat == UNICODE_CATEGORY_Lo
+         || gen_cat == UNICODE_CATEGORY_Mn
+         || gen_cat == UNICODE_CATEGORY_Mc
+         || gen_cat == UNICODE_CATEGORY_Me
+         || gen_cat == UNICODE_CATEGORY_Nl);
 }
 
 /* Return 'true' if C is an decimal-number character as defined by its
@@ -1016,14 +1014,12 @@ bool
 decimalnump (int c)
 {
   Lisp_Object category = CHAR_TABLE_REF (Vunicode_category_table, c);
+  if (! INTEGERP (category))
+    return false;
+  EMACS_INT gen_cat = XINT (category);
 
-  if (INTEGERP (category))
-    {
-      unicode_category_t gen_cat = XINT (category);
-
-      /* See UTS #18.  */
-      return (gen_cat == UNICODE_CATEGORY_Nd) ? true : false;
-    }
+  /* See UTS #18.  */
+  return gen_cat == UNICODE_CATEGORY_Nd;
 }
 
 void