1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _SYS_INT_LIMITS_H 28 #define _SYS_INT_LIMITS_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 /* 33 * This file, <sys/int_limits.h>, is part of the Sun Microsystems implementation 34 * of <inttypes.h> as defined in the ISO C standard, ISO/IEC 9899:1999 35 * Programming language - C. 36 * 37 * Programs/Modules should not directly include this file. Access to the 38 * types defined in this file should be through the inclusion of one of the 39 * following files: 40 * 41 * <limits.h> This nested inclusion is disabled for strictly 42 * ANSI-C conforming compilations. The *_MIN 43 * definitions are not visible to POSIX or XPG 44 * conforming applications (due to what may be 45 * a bug in the specification - this is under 46 * investigation) 47 * 48 * <sys/inttypes.h> Provides the Kernel and Driver appropriate 49 * components of <inttypes.h>. 50 * 51 * <inttypes.h> For use by applications. 52 * 53 * See these files for more details. 54 */ 55 56 #include <sys/feature_tests.h> 57 58 #ifdef __cplusplus 59 extern "C" { 60 #endif 61 62 /* 63 * Limits 64 * 65 * The following define the limits for the types defined in <sys/int_types.h>. 66 * 67 * INTMAX_MIN (minimum value of the largest supported signed integer type), 68 * INTMAX_MAX (maximum value of the largest supported signed integer type), 69 * and UINTMAX_MAX (maximum value of the largest supported unsigned integer 70 * type) can be set to implementation defined limits. 71 * 72 * NOTE : A programmer can test to see whether an implementation supports 73 * a particular size of integer by testing if the macro that gives the 74 * maximum for that datatype is defined. For example, if #ifdef UINT64_MAX 75 * tests false, the implementation does not support unsigned 64 bit integers. 76 * 77 * The type of these macros is intentionally unspecified. 78 * 79 * The types int8_t, int_least8_t, and int_fast8_t are not defined for ISAs 80 * where the ABI specifies "char" as unsigned when the translation mode is 81 * not ANSI-C. 82 */ 83 #if defined(_CHAR_IS_SIGNED) || defined(__STDC__) 84 #define INT8_MAX (127) 85 #endif 86 #define INT16_MAX (32767) 87 #define INT32_MAX (2147483647) 88 #if defined(_LP64) 89 #define INT64_MAX (9223372036854775807L) 90 #elif defined(_LONGLONG_TYPE) 91 #define INT64_MAX (9223372036854775807LL) 92 #endif 93 94 #define UINT8_MAX (255U) 95 #define UINT16_MAX (65535U) 96 #define UINT32_MAX (4294967295U) 97 #if defined(_LP64) 98 #define UINT64_MAX (18446744073709551615UL) 99 #elif defined(_LONGLONG_TYPE) 100 #define UINT64_MAX (18446744073709551615ULL) 101 #endif 102 103 #ifdef INT64_MAX 104 #define INTMAX_MAX INT64_MAX 105 #else 106 #define INTMAX_MAX INT32_MAX 107 #endif 108 109 #ifdef UINT64_MAX 110 #define UINTMAX_MAX UINT64_MAX 111 #else 112 #define UINTMAX_MAX UINT32_MAX 113 #endif 114 115 #if defined(_CHAR_IS_SIGNED) || defined(__STDC__) 116 #define INT_LEAST8_MAX INT8_MAX 117 #endif 118 #define INT_LEAST16_MAX INT16_MAX 119 #define INT_LEAST32_MAX INT32_MAX 120 #ifdef INT64_MAX 121 #define INT_LEAST64_MAX INT64_MAX 122 #endif 123 124 #define UINT_LEAST8_MAX UINT8_MAX 125 #define UINT_LEAST16_MAX UINT16_MAX 126 #define UINT_LEAST32_MAX UINT32_MAX 127 #ifdef UINT64_MAX 128 #define UINT_LEAST64_MAX UINT64_MAX 129 #endif 130 131 #if defined(_CHAR_IS_SIGNED) || defined(__STDC__) 132 #define INT_FAST8_MAX INT8_MAX 133 #endif 134 #define INT_FAST16_MAX INT16_MAX 135 #define INT_FAST32_MAX INT32_MAX 136 #ifdef INT64_MAX 137 #define INT_FAST64_MAX INT64_MAX 138 #endif 139 140 #define UINT_FAST8_MAX UINT8_MAX 141 #define UINT_FAST16_MAX UINT16_MAX 142 #define UINT_FAST32_MAX UINT32_MAX 143 #ifdef UINT64_MAX 144 #define UINT_FAST64_MAX UINT64_MAX 145 #endif 146 147 /* 148 * The following 2 macros are provided for testing whether the types 149 * intptr_t and uintptr_t (integers large enough to hold a void *) are 150 * defined in this header. They are needed in case the architecture can't 151 * represent a pointer in any standard integral type. 152 */ 153 #if defined(_LP64) || defined(_I32LPx) 154 #define INTPTR_MAX INT64_MAX 155 #define UINTPTR_MAX UINT64_MAX 156 #else 157 #define INTPTR_MAX INT32_MAX 158 #define UINTPTR_MAX UINT32_MAX 159 #endif 160 161 /* Maximum limits of ptrdiff_t defined in <sys/types.h> */ 162 #if defined(_LP64) || defined(_I32LPx) 163 #define PTRDIFF_MAX 9223372036854775807L 164 #else 165 #define PTRDIFF_MAX 2147483647 166 #endif 167 168 /* 169 * Maximum value of a "size_t". SIZE_MAX was previously defined 170 * in <limits.h>, however, the standards specify it be defined 171 * in <stdint.h>. The <stdint.h> headers includes this header as 172 * does <limits.h>. The value of SIZE_MAX should not deviate 173 * from the value of ULONG_MAX defined <sys/types.h>. 174 */ 175 #if defined(_LP64) 176 #define SIZE_MAX 18446744073709551615UL 177 #else 178 #define SIZE_MAX 4294967295UL 179 #endif 180 181 /* Maximum limit of sig_atomic_t defined in <sys/types.h> */ 182 #ifndef SIG_ATOMIC_MAX 183 #define SIG_ATOMIC_MAX 2147483647 184 #endif 185 186 /* 187 * Maximum limit of wchar_t. The WCHAR_* macros are also 188 * defined in <iso/wchar_iso.h>, but inclusion of that header 189 * will break ISO/IEC C namespace. 190 */ 191 #ifndef WCHAR_MAX 192 #define WCHAR_MAX 2147483647 193 #endif 194 195 /* Maximum limit of wint_t */ 196 #ifndef WINT_MAX 197 #define WINT_MAX 2147483647 198 #endif 199 200 /* 201 * It is probably a bug in the POSIX specification (IEEE-1003.1-1990) that 202 * when including <limits.h> that the suffix _MAX is reserved but not the 203 * suffix _MIN. However, until that issue is resolved.... 204 */ 205 #if defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) || defined(_XPG6) 206 207 #if defined(_CHAR_IS_SIGNED) || defined(__STDC__) 208 #define INT8_MIN (-128) 209 #endif 210 #define INT16_MIN (-32767-1) 211 #define INT32_MIN (-2147483647-1) 212 #if defined(_LP64) 213 #define INT64_MIN (-9223372036854775807L-1) 214 #elif defined(_LONGLONG_TYPE) 215 #define INT64_MIN (-9223372036854775807LL-1) 216 #endif 217 218 #ifdef INT64_MIN 219 #define INTMAX_MIN INT64_MIN 220 #else 221 #define INTMAX_MIN INT32_MIN 222 #endif 223 224 #if defined(_CHAR_IS_SIGNED) || defined(__STDC__) 225 #define INT_LEAST8_MIN INT8_MIN 226 #endif 227 #define INT_LEAST16_MIN INT16_MIN 228 #define INT_LEAST32_MIN INT32_MIN 229 #ifdef INT64_MIN 230 #define INT_LEAST64_MIN INT64_MIN 231 #endif 232 233 #if defined(_CHAR_IS_SIGNED) || defined(__STDC__) 234 #define INT_FAST8_MIN INT8_MIN 235 #endif 236 #define INT_FAST16_MIN INT16_MIN 237 #define INT_FAST32_MIN INT32_MIN 238 #ifdef INT64_MIN 239 #define INT_FAST64_MIN INT64_MIN 240 #endif 241 242 /* Minimum value of a pointer-holding signed integer type */ 243 #if defined(_LP64) || defined(_I32LPx) 244 #define INTPTR_MIN INT64_MIN 245 #else 246 #define INTPTR_MIN INT32_MIN 247 #endif 248 249 /* Minimum limits of ptrdiff_t defined in <sys/types.h> */ 250 #if defined(_LP64) || defined(_I32LPx) 251 #define PTRDIFF_MIN (-9223372036854775807L-1L) 252 #else 253 #define PTRDIFF_MIN (-2147483647-1) 254 #endif 255 256 /* Minimum limit of sig_atomic_t defined in <sys/types.h> */ 257 #ifndef SIG_ATOMIC_MIN 258 #define SIG_ATOMIC_MIN (-2147483647-1) 259 #endif 260 261 /* 262 * Minimum limit of wchar_t. The WCHAR_* macros are also 263 * defined in <iso/wchar_iso.h>, but inclusion of that header 264 * will break ISO/IEC C namespace. 265 */ 266 #ifndef WCHAR_MIN 267 #define WCHAR_MIN (-2147483647-1) 268 #endif 269 270 /* Minimum limit of wint_t */ 271 #ifndef WINT_MIN 272 #define WINT_MIN (-2147483647-1) 273 #endif 274 275 #endif /* defined(__EXTENSIONS__) || !defined(__XOPEN_OR_POSIX) ... */ 276 277 #ifdef __cplusplus 278 } 279 #endif 280 281 #endif /* _SYS_INT_LIMITS_H */ 282