diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ChangeLog | 12 | ||||
| -rw-r--r-- | src/casefiddle.c | 2 | ||||
| -rw-r--r-- | src/character.h | 12 | ||||
| -rw-r--r-- | src/composite.h | 2 | ||||
| -rw-r--r-- | src/dispextern.h | 2 | ||||
| -rw-r--r-- | src/keyboard.c | 8 | ||||
| -rw-r--r-- | src/lisp.h | 12 |
7 files changed, 38 insertions, 12 deletions
diff --git a/src/ChangeLog b/src/ChangeLog index 82fd3526785..cb3ed502c96 100644 --- a/src/ChangeLog +++ b/src/ChangeLog | |||
| @@ -1,3 +1,15 @@ | |||
| 1 | 2011-06-12 Paul Eggert <eggert@cs.ucla.edu> | ||
| 2 | |||
| 3 | * lisp.h (UNSIGNED_CMP): New macro. | ||
| 4 | This fixes comparison bugs on 64-bit hosts. | ||
| 5 | (ASCII_CHAR_P): Use it. | ||
| 6 | * casefiddle.c (casify_object): | ||
| 7 | * character.h (ASCII_BYTE_P, CHAR_VALID_P): | ||
| 8 | (SINGLE_BYTE_CHAR_P, CHAR_STRING): | ||
| 9 | * composite.h (COMPOSITION_ENCODE_RULE_VALID): | ||
| 10 | * dispextern.h (FACE_FROM_ID): | ||
| 11 | * keyboard.c (read_char): Use UNSIGNED_CMP. | ||
| 12 | |||
| 1 | 2011-06-11 Paul Eggert <eggert@cs.ucla.edu> | 13 | 2011-06-11 Paul Eggert <eggert@cs.ucla.edu> |
| 2 | 14 | ||
| 3 | * xmenu.c (dialog_selection_callback) [!USE_GTK]: Cast to intptr_t, | 15 | * xmenu.c (dialog_selection_callback) [!USE_GTK]: Cast to intptr_t, |
diff --git a/src/casefiddle.c b/src/casefiddle.c index 9f286d73a5e..1a0a62f273c 100644 --- a/src/casefiddle.c +++ b/src/casefiddle.c | |||
| @@ -52,7 +52,7 @@ casify_object (enum case_action flag, Lisp_Object obj) | |||
| 52 | /* If the character has higher bits set | 52 | /* If the character has higher bits set |
| 53 | above the flags, return it unchanged. | 53 | above the flags, return it unchanged. |
| 54 | It is not a real character. */ | 54 | It is not a real character. */ |
| 55 | if ((unsigned) XFASTINT (obj) > (unsigned) flagbits) | 55 | if (UNSIGNED_CMP (XFASTINT (obj), >, flagbits)) |
| 56 | return obj; | 56 | return obj; |
| 57 | 57 | ||
| 58 | c1 = XFASTINT (obj) & ~flagbits; | 58 | c1 = XFASTINT (obj) & ~flagbits; |
diff --git a/src/character.h b/src/character.h index 884833775de..695a55be3fa 100644 --- a/src/character.h +++ b/src/character.h | |||
| @@ -102,13 +102,13 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 102 | #define make_char(c) make_number (c) | 102 | #define make_char(c) make_number (c) |
| 103 | 103 | ||
| 104 | /* Nonzero iff C is an ASCII byte. */ | 104 | /* Nonzero iff C is an ASCII byte. */ |
| 105 | #define ASCII_BYTE_P(c) ((unsigned) (c) < 0x80) | 105 | #define ASCII_BYTE_P(c) UNSIGNED_CMP (c, <, 0x80) |
| 106 | 106 | ||
| 107 | /* Nonzero iff X is a character. */ | 107 | /* Nonzero iff X is a character. */ |
| 108 | #define CHARACTERP(x) (NATNUMP (x) && XFASTINT (x) <= MAX_CHAR) | 108 | #define CHARACTERP(x) (NATNUMP (x) && XFASTINT (x) <= MAX_CHAR) |
| 109 | 109 | ||
| 110 | /* Nonzero iff C is valid as a character code. GENERICP is not used. */ | 110 | /* Nonzero iff C is valid as a character code. GENERICP is not used. */ |
| 111 | #define CHAR_VALID_P(c, genericp) ((unsigned) (c) <= MAX_CHAR) | 111 | #define CHAR_VALID_P(c, genericp) UNSIGNED_CMP (c, <=, MAX_CHAR) |
| 112 | 112 | ||
| 113 | /* Check if Lisp object X is a character or not. */ | 113 | /* Check if Lisp object X is a character or not. */ |
| 114 | #define CHECK_CHARACTER(x) \ | 114 | #define CHECK_CHARACTER(x) \ |
| @@ -129,7 +129,7 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 129 | } while (0) | 129 | } while (0) |
| 130 | 130 | ||
| 131 | /* Nonzero iff C is a character of code less than 0x100. */ | 131 | /* Nonzero iff C is a character of code less than 0x100. */ |
| 132 | #define SINGLE_BYTE_CHAR_P(c) ((unsigned) (c) < 0x100) | 132 | #define SINGLE_BYTE_CHAR_P(c) UNSIGNED_CMP (c, <, 0x100) |
| 133 | 133 | ||
| 134 | /* Nonzero if character C has a printable glyph. */ | 134 | /* Nonzero if character C has a printable glyph. */ |
| 135 | #define CHAR_PRINTABLE_P(c) \ | 135 | #define CHAR_PRINTABLE_P(c) \ |
| @@ -161,14 +161,14 @@ along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ | |||
| 161 | Returns the length of the multibyte form. */ | 161 | Returns the length of the multibyte form. */ |
| 162 | 162 | ||
| 163 | #define CHAR_STRING(c, p) \ | 163 | #define CHAR_STRING(c, p) \ |
| 164 | ((unsigned) (c) <= MAX_1_BYTE_CHAR \ | 164 | (UNSIGNED_CMP (c, <=, MAX_1_BYTE_CHAR) \ |
| 165 | ? ((p)[0] = (c), \ | 165 | ? ((p)[0] = (c), \ |
| 166 | 1) \ | 166 | 1) \ |
| 167 | : (unsigned) (c) <= MAX_2_BYTE_CHAR \ | 167 | : UNSIGNED_CMP (c, <=, MAX_2_BYTE_CHAR) \ |
| 168 | ? ((p)[0] = (0xC0 | ((c) >> 6)), \ | 168 | ? ((p)[0] = (0xC0 | ((c) >> 6)), \ |
| 169 | (p)[1] = (0x80 | ((c) & 0x3F)), \ | 169 | (p)[1] = (0x80 | ((c) & 0x3F)), \ |
| 170 | 2) \ | 170 | 2) \ |
| 171 | : (unsigned) (c) <= MAX_3_BYTE_CHAR \ | 171 | : UNSIGNED_CMP (c, <=, MAX_3_BYTE_CHAR) \ |
| 172 | ? ((p)[0] = (0xE0 | ((c) >> 12)), \ | 172 | ? ((p)[0] = (0xE0 | ((c) >> 12)), \ |
| 173 | (p)[1] = (0x80 | (((c) >> 6) & 0x3F)), \ | 173 | (p)[1] = (0x80 | (((c) >> 6) & 0x3F)), \ |
| 174 | (p)[2] = (0x80 | ((c) & 0x3F)), \ | 174 | (p)[2] = (0x80 | ((c) & 0x3F)), \ |
diff --git a/src/composite.h b/src/composite.h index 0f81911f0b0..8cedfdbe352 100644 --- a/src/composite.h +++ b/src/composite.h | |||
| @@ -151,7 +151,7 @@ extern Lisp_Object composition_temp; | |||
| 151 | /* Nonzero if the global reference point GREF and new reference point NREF are | 151 | /* Nonzero if the global reference point GREF and new reference point NREF are |
| 152 | valid. */ | 152 | valid. */ |
| 153 | #define COMPOSITION_ENCODE_RULE_VALID(gref, nref) \ | 153 | #define COMPOSITION_ENCODE_RULE_VALID(gref, nref) \ |
| 154 | ((unsigned) (gref) < 12 && (unsigned) (nref) < 12) | 154 | (UNSIGNED_CMP (gref, <, 12) && UNSIGNED_CMP (nref, <, 12)) |
| 155 | 155 | ||
| 156 | /* Return encoded composition rule for the pair of global reference | 156 | /* Return encoded composition rule for the pair of global reference |
| 157 | point GREF and new reference point NREF. Arguments must be valid. */ | 157 | point GREF and new reference point NREF. Arguments must be valid. */ |
diff --git a/src/dispextern.h b/src/dispextern.h index 211a1b06659..75ebc462ce4 100644 --- a/src/dispextern.h +++ b/src/dispextern.h | |||
| @@ -1729,7 +1729,7 @@ struct face_cache | |||
| 1729 | face doesn't exist. */ | 1729 | face doesn't exist. */ |
| 1730 | 1730 | ||
| 1731 | #define FACE_FROM_ID(F, ID) \ | 1731 | #define FACE_FROM_ID(F, ID) \ |
| 1732 | (((unsigned) (ID) < FRAME_FACE_CACHE (F)->used) \ | 1732 | (UNSIGNED_CMP (ID, <, FRAME_FACE_CACHE (F)->used) \ |
| 1733 | ? FRAME_FACE_CACHE (F)->faces_by_id[ID] \ | 1733 | ? FRAME_FACE_CACHE (F)->faces_by_id[ID] \ |
| 1734 | : NULL) | 1734 | : NULL) |
| 1735 | 1735 | ||
diff --git a/src/keyboard.c b/src/keyboard.c index 89483972a65..0bacc2fa28f 100644 --- a/src/keyboard.c +++ b/src/keyboard.c | |||
| @@ -2906,9 +2906,13 @@ read_char (int commandflag, int nmaps, Lisp_Object *maps, Lisp_Object prev_event | |||
| 2906 | goto exit; | 2906 | goto exit; |
| 2907 | 2907 | ||
| 2908 | if ((STRINGP (KVAR (current_kboard, Vkeyboard_translate_table)) | 2908 | if ((STRINGP (KVAR (current_kboard, Vkeyboard_translate_table)) |
| 2909 | && SCHARS (KVAR (current_kboard, Vkeyboard_translate_table)) > (unsigned) XFASTINT (c)) | 2909 | && UNSIGNED_CMP (XFASTINT (c), <, |
| 2910 | SCHARS (KVAR (current_kboard, | ||
| 2911 | Vkeyboard_translate_table)))) | ||
| 2910 | || (VECTORP (KVAR (current_kboard, Vkeyboard_translate_table)) | 2912 | || (VECTORP (KVAR (current_kboard, Vkeyboard_translate_table)) |
| 2911 | && ASIZE (KVAR (current_kboard, Vkeyboard_translate_table)) > (unsigned) XFASTINT (c)) | 2913 | && UNSIGNED_CMP (XFASTINT (c), <, |
| 2914 | ASIZE (KVAR (current_kboard, | ||
| 2915 | Vkeyboard_translate_table)))) | ||
| 2912 | || (CHAR_TABLE_P (KVAR (current_kboard, Vkeyboard_translate_table)) | 2916 | || (CHAR_TABLE_P (KVAR (current_kboard, Vkeyboard_translate_table)) |
| 2913 | && CHARACTERP (c))) | 2917 | && CHARACTERP (c))) |
| 2914 | { | 2918 | { |
diff --git a/src/lisp.h b/src/lisp.h index 6003daee8fa..4dfed319490 100644 --- a/src/lisp.h +++ b/src/lisp.h | |||
| @@ -911,8 +911,18 @@ struct Lisp_Vector | |||
| 911 | 911 | ||
| 912 | #endif /* not __GNUC__ */ | 912 | #endif /* not __GNUC__ */ |
| 913 | 913 | ||
| 914 | /* Compute A OP B, using the unsigned comparison operator OP. A and B | ||
| 915 | should be integer expressions. This is not the same as | ||
| 916 | mathemeatical comparison; for example, UNSIGNED_CMP (0, <, -1) | ||
| 917 | returns 1. For efficiency, prefer plain unsigned comparison if A | ||
| 918 | and B's sizes both fit (after integer promotion). */ | ||
| 919 | #define UNSIGNED_CMP(a, op, b) \ | ||
| 920 | (max (sizeof ((a) + 0), sizeof ((b) + 0)) <= sizeof (unsigned) \ | ||
| 921 | ? ((a) + (unsigned) 0) op ((b) + (unsigned) 0) \ | ||
| 922 | : ((a) + (uintmax_t) 0) op ((b) + (uintmax_t) 0)) | ||
| 923 | |||
| 914 | /* Nonzero iff C is an ASCII character. */ | 924 | /* Nonzero iff C is an ASCII character. */ |
| 915 | #define ASCII_CHAR_P(c) ((unsigned) (c) < 0x80) | 925 | #define ASCII_CHAR_P(c) UNSIGNED_CMP (c, <, 0x80) |
| 916 | 926 | ||
| 917 | /* Almost equivalent to Faref (CT, IDX) with optimization for ASCII | 927 | /* Almost equivalent to Faref (CT, IDX) with optimization for ASCII |
| 918 | characters. Do not check validity of CT. */ | 928 | characters. Do not check validity of CT. */ |