aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Eggert2011-06-12 16:25:12 -0700
committerPaul Eggert2011-06-12 16:25:12 -0700
commitea204efb8a3e81a4d9b04d2a36cb8c2a1c74662c (patch)
treeb209feeebf1bdb6994f46217e29ba860dcc6c7ba /src
parent78cf1fe8a256ffc91533b43eb851bf4519e9fbcc (diff)
downloademacs-ea204efb8a3e81a4d9b04d2a36cb8c2a1c74662c.tar.gz
emacs-ea204efb8a3e81a4d9b04d2a36cb8c2a1c74662c.zip
* lisp.h (UNSIGNED_CMP): New macro.
This fixes comparison bugs on 64-bit hosts. (ASCII_CHAR_P): Use it. * casefiddle.c (casify_object): * character.h (ASCII_BYTE_P, CHAR_VALID_P): (SINGLE_BYTE_CHAR_P, CHAR_STRING): * composite.h (COMPOSITION_ENCODE_RULE_VALID): * dispextern.h (FACE_FROM_ID): * keyboard.c (read_char): Use UNSIGNED_CMP.
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog12
-rw-r--r--src/casefiddle.c2
-rw-r--r--src/character.h12
-rw-r--r--src/composite.h2
-rw-r--r--src/dispextern.h2
-rw-r--r--src/keyboard.c8
-rw-r--r--src/lisp.h12
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 @@
12011-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
12011-06-11 Paul Eggert <eggert@cs.ucla.edu> 132011-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. */