~p-ch-e/gnuhello/gnuhello

« back to all changes in this revision

Viewing changes to gnulib/lib/intprops.h

  • Committer: Reuben Thomas
  • Date: 2011-12-17 11:23:38 UTC
  • Revision ID: rrt@sc3d.org-20111217112338-kurwdy8nu69g3t6f
Update gnulib and convert .cvsignore to .bzrignore.

        * gnulib: Update.
        * .bzrignore: Add.
        * .cvsignore: Remove.
        * contrib/.cvsignore: Likewise.
        * doc/.cvsignore: Likewise.
        * man/.cvsignore: Likewise.
        * po/.cvsignore: Likewise.
        * src/.cvsignore: Likewise.
        * tests/.cvsignore: Likewise.
        * build/mkinstalldirs: Remove: no longer needed.
        * po: Update.

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
 
18
18
/* Written by Paul Eggert.  */
19
19
 
20
 
#ifndef GL_INTPROPS_H
21
 
# define GL_INTPROPS_H
22
 
 
23
 
# include <limits.h>
 
20
#ifndef _GL_INTPROPS_H
 
21
#define _GL_INTPROPS_H
 
22
 
 
23
#include <limits.h>
 
24
 
 
25
/* Return an integer value, converted to the same type as the integer
 
26
   expression E after integer type promotion.  V is the unconverted value.  */
 
27
#define _GL_INT_CONVERT(e, v) (0 * (e) + (v))
 
28
 
 
29
/* Act like _GL_INT_CONVERT (E, -V) but work around a bug in IRIX 6.5 cc; see
 
30
   <http://lists.gnu.org/archive/html/bug-gnulib/2011-05/msg00406.html>.  */
 
31
#define _GL_INT_NEGATE_CONVERT(e, v) (0 * (e) - (v))
24
32
 
25
33
/* The extra casts in the following macros work around compiler bugs,
26
34
   e.g., in Cray C 5.0.3.0.  */
27
35
 
28
36
/* True if the arithmetic type T is an integer type.  bool counts as
29
37
   an integer.  */
30
 
# define TYPE_IS_INTEGER(t) ((t) 1.5 == 1)
 
38
#define TYPE_IS_INTEGER(t) ((t) 1.5 == 1)
31
39
 
32
40
/* True if negative values of the signed integer type T use two's
33
41
   complement, ones' complement, or signed magnitude representation,
34
42
   respectively.  Much GNU code assumes two's complement, but some
35
43
   people like to be portable to all possible C hosts.  */
36
 
# define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1)
37
 
# define TYPE_ONES_COMPLEMENT(t) ((t) ~ (t) 0 == 0)
38
 
# define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1)
 
44
#define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1)
 
45
#define TYPE_ONES_COMPLEMENT(t) ((t) ~ (t) 0 == 0)
 
46
#define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1)
 
47
 
 
48
/* True if the signed integer expression E uses two's complement.  */
 
49
#define _GL_INT_TWOS_COMPLEMENT(e) (~ _GL_INT_CONVERT (e, 0) == -1)
39
50
 
40
51
/* True if the arithmetic type T is signed.  */
41
 
# define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
42
 
 
43
 
/* The maximum and minimum values for the integer type T.  These
 
52
#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
 
53
 
 
54
/* Return 1 if the integer expression E, after integer promotion, has
 
55
   a signed type.  */
 
56
#define _GL_INT_SIGNED(e) (_GL_INT_NEGATE_CONVERT (e, 1) < 0)
 
57
 
 
58
 
 
59
/* Minimum and maximum values for integer types and expressions.  These
44
60
   macros have undefined behavior if T is signed and has padding bits.
45
61
   If this is a problem for you, please let us know how to fix it for
46
62
   your host.  */
47
 
# define TYPE_MINIMUM(t) \
48
 
  ((t) (! TYPE_SIGNED (t) \
49
 
        ? (t) 0 \
50
 
        : TYPE_SIGNED_MAGNITUDE (t) \
51
 
        ? ~ (t) 0 \
 
63
 
 
64
/* The maximum and minimum values for the integer type T.  */
 
65
#define TYPE_MINIMUM(t)                                                 \
 
66
  ((t) (! TYPE_SIGNED (t)                                               \
 
67
        ? (t) 0                                                         \
 
68
        : TYPE_SIGNED_MAGNITUDE (t)                                     \
 
69
        ? ~ (t) 0                                                       \
52
70
        : ~ TYPE_MAXIMUM (t)))
53
 
# define TYPE_MAXIMUM(t) \
54
 
  ((t) (! TYPE_SIGNED (t) \
55
 
        ? (t) -1 \
 
71
#define TYPE_MAXIMUM(t)                                                 \
 
72
  ((t) (! TYPE_SIGNED (t)                                               \
 
73
        ? (t) -1                                                        \
56
74
        : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1)))
57
75
 
58
 
/* Return zero if T can be determined to be an unsigned type.
59
 
   Otherwise, return 1.
60
 
   When compiling with GCC, INT_STRLEN_BOUND uses this macro to obtain a
61
 
   tighter bound.  Otherwise, it overestimates the true bound by one byte
62
 
   when applied to unsigned types of size 2, 4, 16, ... bytes.
63
 
   The symbol signed_type_or_expr__ is private to this header file.  */
64
 
# if __GNUC__ >= 2
65
 
#  define signed_type_or_expr__(t) TYPE_SIGNED (__typeof__ (t))
66
 
# else
67
 
#  define signed_type_or_expr__(t) 1
68
 
# endif
 
76
/* The maximum and minimum values for the type of the expression E,
 
77
   after integer promotion.  E should not have side effects.  */
 
78
#define _GL_INT_MINIMUM(e)                                              \
 
79
  (_GL_INT_SIGNED (e)                                                   \
 
80
   ? - _GL_INT_TWOS_COMPLEMENT (e) - _GL_SIGNED_INT_MAXIMUM (e)         \
 
81
   : _GL_INT_CONVERT (e, 0))
 
82
#define _GL_INT_MAXIMUM(e)                                              \
 
83
  (_GL_INT_SIGNED (e)                                                   \
 
84
   ? _GL_SIGNED_INT_MAXIMUM (e)                                         \
 
85
   : _GL_INT_NEGATE_CONVERT (e, 1))
 
86
#define _GL_SIGNED_INT_MAXIMUM(e)                                       \
 
87
  (((_GL_INT_CONVERT (e, 1) << (sizeof ((e) + 0) * CHAR_BIT - 2)) - 1) * 2 + 1)
 
88
 
 
89
 
 
90
/* Return 1 if the __typeof__ keyword works.  This could be done by
 
91
   'configure', but for now it's easier to do it by hand.  */
 
92
#if 2 <= __GNUC__ || 0x5110 <= __SUNPRO_C
 
93
# define _GL_HAVE___TYPEOF__ 1
 
94
#else
 
95
# define _GL_HAVE___TYPEOF__ 0
 
96
#endif
 
97
 
 
98
/* Return 1 if the integer type or expression T might be signed.  Return 0
 
99
   if it is definitely unsigned.  This macro does not evaluate its argument,
 
100
   and expands to an integer constant expression.  */
 
101
#if _GL_HAVE___TYPEOF__
 
102
# define _GL_SIGNED_TYPE_OR_EXPR(t) TYPE_SIGNED (__typeof__ (t))
 
103
#else
 
104
# define _GL_SIGNED_TYPE_OR_EXPR(t) 1
 
105
#endif
69
106
 
70
107
/* Bound on length of the string representing an unsigned integer
71
108
   value representable in B bits.  log10 (2.0) < 146/485.  The
72
109
   smallest value of B where this bound is not tight is 2621.  */
73
 
# define INT_BITS_STRLEN_BOUND(b) (((b) * 146 + 484) / 485)
 
110
#define INT_BITS_STRLEN_BOUND(b) (((b) * 146 + 484) / 485)
74
111
 
75
112
/* Bound on length of the string representing an integer type or expression T.
76
113
   Subtract 1 for the sign bit if T is signed, and then add 1 more for
77
 
   a minus sign if needed.  */
78
 
# define INT_STRLEN_BOUND(t) \
79
 
  (INT_BITS_STRLEN_BOUND (sizeof (t) * CHAR_BIT - signed_type_or_expr__ (t)) \
80
 
   + signed_type_or_expr__ (t))
 
114
   a minus sign if needed.
 
115
 
 
116
   Because _GL_SIGNED_TYPE_OR_EXPR sometimes returns 0 when its argument is
 
117
   signed, this macro may overestimate the true bound by one byte when
 
118
   applied to unsigned types of size 2, 4, 16, ... bytes.  */
 
119
#define INT_STRLEN_BOUND(t)                                     \
 
120
  (INT_BITS_STRLEN_BOUND (sizeof (t) * CHAR_BIT                 \
 
121
                          - _GL_SIGNED_TYPE_OR_EXPR (t))        \
 
122
   + _GL_SIGNED_TYPE_OR_EXPR (t))
81
123
 
82
124
/* Bound on buffer size needed to represent an integer type or expression T,
83
125
   including the terminating null.  */
84
 
# define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1)
85
 
 
86
 
#endif /* GL_INTPROPS_H */
 
126
#define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1)
 
127
 
 
128
 
 
129
/* Range overflow checks.
 
130
 
 
131
   The INT_<op>_RANGE_OVERFLOW macros return 1 if the corresponding C
 
132
   operators might not yield numerically correct answers due to
 
133
   arithmetic overflow.  They do not rely on undefined or
 
134
   implementation-defined behavior.  Their implementations are simple
 
135
   and straightforward, but they are a bit harder to use than the
 
136
   INT_<op>_OVERFLOW macros described below.
 
137
 
 
138
   Example usage:
 
139
 
 
140
     long int i = ...;
 
141
     long int j = ...;
 
142
     if (INT_MULTIPLY_RANGE_OVERFLOW (i, j, LONG_MIN, LONG_MAX))
 
143
       printf ("multiply would overflow");
 
144
     else
 
145
       printf ("product is %ld", i * j);
 
146
 
 
147
   Restrictions on *_RANGE_OVERFLOW macros:
 
148
 
 
149
   These macros do not check for all possible numerical problems or
 
150
   undefined or unspecified behavior: they do not check for division
 
151
   by zero, for bad shift counts, or for shifting negative numbers.
 
152
 
 
153
   These macros may evaluate their arguments zero or multiple times,
 
154
   so the arguments should not have side effects.  The arithmetic
 
155
   arguments (including the MIN and MAX arguments) must be of the same
 
156
   integer type after the usual arithmetic conversions, and the type
 
157
   must have minimum value MIN and maximum MAX.  Unsigned types should
 
158
   use a zero MIN of the proper type.
 
159
 
 
160
   These macros are tuned for constant MIN and MAX.  For commutative
 
161
   operations such as A + B, they are also tuned for constant B.  */
 
162
 
 
163
/* Return 1 if A + B would overflow in [MIN,MAX] arithmetic.
 
164
   See above for restrictions.  */
 
165
#define INT_ADD_RANGE_OVERFLOW(a, b, min, max)          \
 
166
  ((b) < 0                                              \
 
167
   ? (a) < (min) - (b)                                  \
 
168
   : (max) - (b) < (a))
 
169
 
 
170
/* Return 1 if A - B would overflow in [MIN,MAX] arithmetic.
 
171
   See above for restrictions.  */
 
172
#define INT_SUBTRACT_RANGE_OVERFLOW(a, b, min, max)     \
 
173
  ((b) < 0                                              \
 
174
   ? (max) + (b) < (a)                                  \
 
175
   : (a) < (min) + (b))
 
176
 
 
177
/* Return 1 if - A would overflow in [MIN,MAX] arithmetic.
 
178
   See above for restrictions.  */
 
179
#define INT_NEGATE_RANGE_OVERFLOW(a, min, max)          \
 
180
  ((min) < 0                                            \
 
181
   ? (a) < - (max)                                      \
 
182
   : 0 < (a))
 
183
 
 
184
/* Return 1 if A * B would overflow in [MIN,MAX] arithmetic.
 
185
   See above for restrictions.  Avoid && and || as they tickle
 
186
   bugs in Sun C 5.11 2010/08/13 and other compilers; see
 
187
   <http://lists.gnu.org/archive/html/bug-gnulib/2011-05/msg00401.html>.  */
 
188
#define INT_MULTIPLY_RANGE_OVERFLOW(a, b, min, max)     \
 
189
  ((b) < 0                                              \
 
190
   ? ((a) < 0                                           \
 
191
      ? (a) < (max) / (b)                               \
 
192
      : (b) == -1                                       \
 
193
      ? 0                                               \
 
194
      : (min) / (b) < (a))                              \
 
195
   : (b) == 0                                           \
 
196
   ? 0                                                  \
 
197
   : ((a) < 0                                           \
 
198
      ? (a) < (min) / (b)                               \
 
199
      : (max) / (b) < (a)))
 
200
 
 
201
/* Return 1 if A / B would overflow in [MIN,MAX] arithmetic.
 
202
   See above for restrictions.  Do not check for division by zero.  */
 
203
#define INT_DIVIDE_RANGE_OVERFLOW(a, b, min, max)       \
 
204
  ((min) < 0 && (b) == -1 && (a) < - (max))
 
205
 
 
206
/* Return 1 if A % B would overflow in [MIN,MAX] arithmetic.
 
207
   See above for restrictions.  Do not check for division by zero.
 
208
   Mathematically, % should never overflow, but on x86-like hosts
 
209
   INT_MIN % -1 traps, and the C standard permits this, so treat this
 
210
   as an overflow too.  */
 
211
#define INT_REMAINDER_RANGE_OVERFLOW(a, b, min, max)    \
 
212
  INT_DIVIDE_RANGE_OVERFLOW (a, b, min, max)
 
213
 
 
214
/* Return 1 if A << B would overflow in [MIN,MAX] arithmetic.
 
215
   See above for restrictions.  Here, MIN and MAX are for A only, and B need
 
216
   not be of the same type as the other arguments.  The C standard says that
 
217
   behavior is undefined for shifts unless 0 <= B < wordwidth, and that when
 
218
   A is negative then A << B has undefined behavior and A >> B has
 
219
   implementation-defined behavior, but do not check these other
 
220
   restrictions.  */
 
221
#define INT_LEFT_SHIFT_RANGE_OVERFLOW(a, b, min, max)   \
 
222
  ((a) < 0                                              \
 
223
   ? (a) < (min) >> (b)                                 \
 
224
   : (max) >> (b) < (a))
 
225
 
 
226
 
 
227
/* The _GL*_OVERFLOW macros have the same restrictions as the
 
228
   *_RANGE_OVERFLOW macros, except that they do not assume that operands
 
229
   (e.g., A and B) have the same type as MIN and MAX.  Instead, they assume
 
230
   that the result (e.g., A + B) has that type.  */
 
231
#define _GL_ADD_OVERFLOW(a, b, min, max)                                \
 
232
  ((min) < 0 ? INT_ADD_RANGE_OVERFLOW (a, b, min, max)                  \
 
233
   : (a) < 0 ? (b) <= (a) + (b)                                         \
 
234
   : (b) < 0 ? (a) <= (a) + (b)                                         \
 
235
   : (a) + (b) < (b))
 
236
#define _GL_SUBTRACT_OVERFLOW(a, b, min, max)                           \
 
237
  ((min) < 0 ? INT_SUBTRACT_RANGE_OVERFLOW (a, b, min, max)             \
 
238
   : (a) < 0 ? 1                                                        \
 
239
   : (b) < 0 ? (a) - (b) <= (a)                                         \
 
240
   : (a) < (b))
 
241
#define _GL_MULTIPLY_OVERFLOW(a, b, min, max)                           \
 
242
  (((min) == 0 && (((a) < 0 && 0 < (b)) || ((b) < 0 && 0 < (a))))       \
 
243
   || INT_MULTIPLY_RANGE_OVERFLOW (a, b, min, max))
 
244
#define _GL_DIVIDE_OVERFLOW(a, b, min, max)                             \
 
245
  ((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max)  \
 
246
   : (a) < 0 ? (b) <= (a) + (b) - 1                                     \
 
247
   : (b) < 0 && (a) + (b) <= (a))
 
248
#define _GL_REMAINDER_OVERFLOW(a, b, min, max)                          \
 
249
  ((min) < 0 ? (b) == _GL_INT_NEGATE_CONVERT (min, 1) && (a) < - (max)  \
 
250
   : (a) < 0 ? (a) % (b) != ((max) - (b) + 1) % (b)                     \
 
251
   : (b) < 0 && ! _GL_UNSIGNED_NEG_MULTIPLE (a, b, max))
 
252
 
 
253
/* Return a nonzero value if A is a mathematical multiple of B, where
 
254
   A is unsigned, B is negative, and MAX is the maximum value of A's
 
255
   type.  A's type must be the same as (A % B)'s type.  Normally (A %
 
256
   -B == 0) suffices, but things get tricky if -B would overflow.  */
 
257
#define _GL_UNSIGNED_NEG_MULTIPLE(a, b, max)                            \
 
258
  (((b) < -_GL_SIGNED_INT_MAXIMUM (b)                                   \
 
259
    ? (_GL_SIGNED_INT_MAXIMUM (b) == (max)                              \
 
260
       ? (a)                                                            \
 
261
       : (a) % (_GL_INT_CONVERT (a, _GL_SIGNED_INT_MAXIMUM (b)) + 1))   \
 
262
    : (a) % - (b))                                                      \
 
263
   == 0)
 
264
 
 
265
 
 
266
/* Integer overflow checks.
 
267
 
 
268
   The INT_<op>_OVERFLOW macros return 1 if the corresponding C operators
 
269
   might not yield numerically correct answers due to arithmetic overflow.
 
270
   They work correctly on all known practical hosts, and do not rely
 
271
   on undefined behavior due to signed arithmetic overflow.
 
272
 
 
273
   Example usage:
 
274
 
 
275
     long int i = ...;
 
276
     long int j = ...;
 
277
     if (INT_MULTIPLY_OVERFLOW (i, j))
 
278
       printf ("multiply would overflow");
 
279
     else
 
280
       printf ("product is %ld", i * j);
 
281
 
 
282
   These macros do not check for all possible numerical problems or
 
283
   undefined or unspecified behavior: they do not check for division
 
284
   by zero, for bad shift counts, or for shifting negative numbers.
 
285
 
 
286
   These macros may evaluate their arguments zero or multiple times, so the
 
287
   arguments should not have side effects.
 
288
 
 
289
   These macros are tuned for their last argument being a constant.
 
290
 
 
291
   Return 1 if the integer expressions A * B, A - B, -A, A * B, A / B,
 
292
   A % B, and A << B would overflow, respectively.  */
 
293
 
 
294
#define INT_ADD_OVERFLOW(a, b) \
 
295
  _GL_BINARY_OP_OVERFLOW (a, b, _GL_ADD_OVERFLOW)
 
296
#define INT_SUBTRACT_OVERFLOW(a, b) \
 
297
  _GL_BINARY_OP_OVERFLOW (a, b, _GL_SUBTRACT_OVERFLOW)
 
298
#define INT_NEGATE_OVERFLOW(a) \
 
299
  INT_NEGATE_RANGE_OVERFLOW (a, _GL_INT_MINIMUM (a), _GL_INT_MAXIMUM (a))
 
300
#define INT_MULTIPLY_OVERFLOW(a, b) \
 
301
  _GL_BINARY_OP_OVERFLOW (a, b, _GL_MULTIPLY_OVERFLOW)
 
302
#define INT_DIVIDE_OVERFLOW(a, b) \
 
303
  _GL_BINARY_OP_OVERFLOW (a, b, _GL_DIVIDE_OVERFLOW)
 
304
#define INT_REMAINDER_OVERFLOW(a, b) \
 
305
  _GL_BINARY_OP_OVERFLOW (a, b, _GL_REMAINDER_OVERFLOW)
 
306
#define INT_LEFT_SHIFT_OVERFLOW(a, b) \
 
307
  INT_LEFT_SHIFT_RANGE_OVERFLOW (a, b, \
 
308
                                 _GL_INT_MINIMUM (a), _GL_INT_MAXIMUM (a))
 
309
 
 
310
/* Return 1 if the expression A <op> B would overflow,
 
311
   where OP_RESULT_OVERFLOW (A, B, MIN, MAX) does the actual test,
 
312
   assuming MIN and MAX are the minimum and maximum for the result type.
 
313
   Arguments should be free of side effects.  */
 
314
#define _GL_BINARY_OP_OVERFLOW(a, b, op_result_overflow)        \
 
315
  op_result_overflow (a, b,                                     \
 
316
                      _GL_INT_MINIMUM (0 * (b) + (a)),          \
 
317
                      _GL_INT_MAXIMUM (0 * (b) + (a)))
 
318
 
 
319
#endif /* _GL_INTPROPS_H */