Commit | Line | Data |
---|---|---|
a451f14b PE |
1 | /* intprops.h -- properties of integer types |
2 | ||
3 | Copyright (C) 2001-2005, 2009-2011 Free Software Foundation, Inc. | |
4 | ||
5 | This program is free software: you can redistribute it and/or modify | |
6 | it under the terms of the GNU General Public License as published by | |
7 | the Free Software Foundation; either version 3 of the License, or | |
8 | (at your option) any later version. | |
9 | ||
10 | This program is distributed in the hope that it will be useful, | |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 | GNU General Public License for more details. | |
14 | ||
15 | You should have received a copy of the GNU General Public License | |
16 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | |
17 | ||
18 | /* Written by Paul Eggert. */ | |
19 | ||
20 | #ifndef GL_INTPROPS_H | |
21 | # define GL_INTPROPS_H | |
22 | ||
23 | # include <limits.h> | |
24 | ||
25 | /* The extra casts in the following macros work around compiler bugs, | |
26 | e.g., in Cray C 5.0.3.0. */ | |
27 | ||
28 | /* True if the arithmetic type T is an integer type. bool counts as | |
29 | an integer. */ | |
30 | # define TYPE_IS_INTEGER(t) ((t) 1.5 == 1) | |
31 | ||
32 | /* True if negative values of the signed integer type T use two's | |
33 | complement, ones' complement, or signed magnitude representation, | |
34 | respectively. Much GNU code assumes two's complement, but some | |
35 | 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) | |
39 | ||
40 | /* 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 | |
44 | macros have undefined behavior if T is signed and has padding bits. | |
45 | If this is a problem for you, please let us know how to fix it for | |
46 | your host. */ | |
47 | # define TYPE_MINIMUM(t) \ | |
48 | ((t) (! TYPE_SIGNED (t) \ | |
49 | ? (t) 0 \ | |
50 | : TYPE_SIGNED_MAGNITUDE (t) \ | |
51 | ? ~ (t) 0 \ | |
3de84ad9 | 52 | : ~ TYPE_MAXIMUM (t))) |
a451f14b PE |
53 | # define TYPE_MAXIMUM(t) \ |
54 | ((t) (! TYPE_SIGNED (t) \ | |
55 | ? (t) -1 \ | |
3de84ad9 | 56 | : ((((t) 1 << (sizeof (t) * CHAR_BIT - 2)) - 1) * 2 + 1))) |
a451f14b PE |
57 | |
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 | |
69 | ||
70 | /* Bound on length of the string representing an unsigned integer | |
71 | value representable in B bits. log10 (2.0) < 146/485. The | |
72 | smallest value of B where this bound is not tight is 2621. */ | |
73 | # define INT_BITS_STRLEN_BOUND(b) (((b) * 146 + 484) / 485) | |
74 | ||
75 | /* Bound on length of the string representing an integer type or expression T. | |
76 | 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)) | |
81 | ||
82 | /* Bound on buffer size needed to represent an integer type or expression T, | |
83 | including the terminating null. */ | |
84 | # define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1) | |
85 | ||
86 | #endif /* GL_INTPROPS_H */ |