diff options
Diffstat (limited to 'gl/intprops.h')
-rw-r--r-- | gl/intprops.h | 50 |
1 files changed, 28 insertions, 22 deletions
diff --git a/gl/intprops.h b/gl/intprops.h index 002161ee..46f4d47d 100644 --- a/gl/intprops.h +++ b/gl/intprops.h | |||
@@ -1,6 +1,7 @@ | |||
1 | /* intprops.h -- properties of integer types | 1 | /* intprops.h -- properties of integer types |
2 | 2 | ||
3 | Copyright (C) 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. | 3 | Copyright (C) 2001, 2002, 2003, 2004, 2005, 2009, 2010 Free Software |
4 | Foundation, Inc. | ||
4 | 5 | ||
5 | This program is free software: you can redistribute it and/or modify | 6 | 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 | it under the terms of the GNU General Public License as published by |
@@ -17,40 +18,43 @@ | |||
17 | 18 | ||
18 | /* Written by Paul Eggert. */ | 19 | /* Written by Paul Eggert. */ |
19 | 20 | ||
20 | #include <limits.h> | 21 | #ifndef GL_INTPROPS_H |
22 | # define GL_INTPROPS_H | ||
23 | |||
24 | # include <limits.h> | ||
21 | 25 | ||
22 | /* The extra casts in the following macros work around compiler bugs, | 26 | /* The extra casts in the following macros work around compiler bugs, |
23 | e.g., in Cray C 5.0.3.0. */ | 27 | e.g., in Cray C 5.0.3.0. */ |
24 | 28 | ||
25 | /* True if the arithmetic type T is an integer type. bool counts as | 29 | /* True if the arithmetic type T is an integer type. bool counts as |
26 | an integer. */ | 30 | an integer. */ |
27 | #define TYPE_IS_INTEGER(t) ((t) 1.5 == 1) | 31 | # define TYPE_IS_INTEGER(t) ((t) 1.5 == 1) |
28 | 32 | ||
29 | /* True if negative values of the signed integer type T use two's | 33 | /* True if negative values of the signed integer type T use two's |
30 | complement, ones' complement, or signed magnitude representation, | 34 | complement, ones' complement, or signed magnitude representation, |
31 | respectively. Much GNU code assumes two's complement, but some | 35 | respectively. Much GNU code assumes two's complement, but some |
32 | people like to be portable to all possible C hosts. */ | 36 | people like to be portable to all possible C hosts. */ |
33 | #define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1) | 37 | # define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1) |
34 | #define TYPE_ONES_COMPLEMENT(t) ((t) ~ (t) 0 == 0) | 38 | # define TYPE_ONES_COMPLEMENT(t) ((t) ~ (t) 0 == 0) |
35 | #define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1) | 39 | # define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1) |
36 | 40 | ||
37 | /* True if the arithmetic type T is signed. */ | 41 | /* True if the arithmetic type T is signed. */ |
38 | #define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) | 42 | # define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) |
39 | 43 | ||
40 | /* The maximum and minimum values for the integer type T. These | 44 | /* The maximum and minimum values for the integer type T. These |
41 | macros have undefined behavior if T is signed and has padding bits. | 45 | macros have undefined behavior if T is signed and has padding bits. |
42 | If this is a problem for you, please let us know how to fix it for | 46 | If this is a problem for you, please let us know how to fix it for |
43 | your host. */ | 47 | your host. */ |
44 | #define TYPE_MINIMUM(t) \ | 48 | # define TYPE_MINIMUM(t) \ |
45 | ((t) (! TYPE_SIGNED (t) \ | 49 | ((t) (! TYPE_SIGNED (t) \ |
46 | ? (t) 0 \ | 50 | ? (t) 0 \ |
47 | : TYPE_SIGNED_MAGNITUDE (t) \ | 51 | : TYPE_SIGNED_MAGNITUDE (t) \ |
48 | ? ~ (t) 0 \ | 52 | ? ~ (t) 0 \ |
49 | : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))) | 53 | : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))) |
50 | #define TYPE_MAXIMUM(t) \ | 54 | # define TYPE_MAXIMUM(t) \ |
51 | ((t) (! TYPE_SIGNED (t) \ | 55 | ((t) (! TYPE_SIGNED (t) \ |
52 | ? (t) -1 \ | 56 | ? (t) -1 \ |
53 | : ~ (~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)))) | 57 | : ~ (~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)))) |
54 | 58 | ||
55 | /* Return zero if T can be determined to be an unsigned type. | 59 | /* Return zero if T can be determined to be an unsigned type. |
56 | Otherwise, return 1. | 60 | Otherwise, return 1. |
@@ -58,20 +62,22 @@ | |||
58 | tighter bound. Otherwise, it overestimates the true bound by one byte | 62 | tighter bound. Otherwise, it overestimates the true bound by one byte |
59 | when applied to unsigned types of size 2, 4, 16, ... bytes. | 63 | when applied to unsigned types of size 2, 4, 16, ... bytes. |
60 | The symbol signed_type_or_expr__ is private to this header file. */ | 64 | The symbol signed_type_or_expr__ is private to this header file. */ |
61 | #if __GNUC__ >= 2 | 65 | # if __GNUC__ >= 2 |
62 | # define signed_type_or_expr__(t) TYPE_SIGNED (__typeof__ (t)) | 66 | # define signed_type_or_expr__(t) TYPE_SIGNED (__typeof__ (t)) |
63 | #else | 67 | # else |
64 | # define signed_type_or_expr__(t) 1 | 68 | # define signed_type_or_expr__(t) 1 |
65 | #endif | 69 | # endif |
66 | 70 | ||
67 | /* Bound on length of the string representing an integer type or expression T. | 71 | /* Bound on length of the string representing an integer type or expression T. |
68 | Subtract 1 for the sign bit if T is signed; log10 (2.0) < 146/485; | 72 | Subtract 1 for the sign bit if T is signed; log10 (2.0) < 146/485; |
69 | add 1 for integer division truncation; add 1 more for a minus sign | 73 | add 1 for integer division truncation; add 1 more for a minus sign |
70 | if needed. */ | 74 | if needed. */ |
71 | #define INT_STRLEN_BOUND(t) \ | 75 | # define INT_STRLEN_BOUND(t) \ |
72 | ((sizeof (t) * CHAR_BIT - signed_type_or_expr__ (t)) * 146 / 485 \ | 76 | ((sizeof (t) * CHAR_BIT - signed_type_or_expr__ (t)) * 146 / 485 \ |
73 | + signed_type_or_expr__ (t) + 1) | 77 | + signed_type_or_expr__ (t) + 1) |
74 | 78 | ||
75 | /* Bound on buffer size needed to represent an integer type or expression T, | 79 | /* Bound on buffer size needed to represent an integer type or expression T, |
76 | including the terminating null. */ | 80 | including the terminating null. */ |
77 | #define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1) | 81 | # define INT_BUFSIZE_BOUND(t) (INT_STRLEN_BOUND (t) + 1) |
82 | |||
83 | #endif /* GL_INTPROPS_H */ | ||