1 /* 2 * Type and type-support definitions 3 * 4 * Copyright (C) 2014-2021, Joachim Metz <joachim.metz@gmail.com> 5 * 6 * Refer to AUTHORS for acknowledgements. 7 * 8 * This program is free software: you can redistribute it and/or modify 9 * it under the terms of the GNU Lesser General Public License as published by 10 * the Free Software Foundation, either version 3 of the License, or 11 * (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * You should have received a copy of the GNU Lesser General Public License 19 * along with this program. If not, see <https://www.gnu.org/licenses/>. 20 */ 21 22 #if !defined( _TYPES_H ) 23 #define _TYPES_H 24 25 #include "common.h" 26 27 #if defined( HAVE_LIMITS_H ) || defined( WINAPI ) 28 #include <limits.h> 29 #endif 30 31 /* Make sure to include inttypes.h or stdint.h before 32 * PRI definitions are defined 33 */ 34 #include <libvslvm/types.h> 35 36 #if defined( WINAPI ) && ( defined( _UNICODE ) || defined( UNICODE ) ) 37 38 #define HAVE_WIDE_SYSTEM_CHARACTER 1 39 40 /* The system character type is wide 41 * A system string contains either UTF-16 or UTF-32 42 */ 43 typedef wchar_t system_character_t; 44 typedef wint_t system_integer_t; 45 46 #define PRIc_SYSTEM "lc" 47 #define PRIs_SYSTEM "ls" 48 49 #else 50 51 /* The system character type is narrow 52 * A system string contains either UTF-8 or extended ASCII with a codepage 53 */ 54 typedef char system_character_t; 55 typedef int system_integer_t; 56 57 #define PRIc_SYSTEM "c" 58 #define PRIs_SYSTEM "s" 59 60 #endif /* defined( WINAPI ) && ( defined( _UNICODE ) || defined( UNICODE ) ) */ 61 62 /* Fallback for systems without PRI definitions 63 */ 64 #if !defined( PRId8 ) 65 #define PRId8 "d" 66 #endif 67 68 #if !defined( PRId16 ) 69 #define PRId16 "d" 70 #endif 71 72 #if !defined( PRId32 ) 73 #if defined( WINAPI ) 74 #define PRId32 "I32d" 75 76 #else 77 #define PRId32 "d" 78 79 #endif 80 #endif /* !defined( PRId32 ) */ 81 82 #if !defined( PRId64 ) 83 #if defined( WINAPI ) 84 #define PRId64 "I64d" 85 86 #elif __WORDSIZE == 64 87 #define PRId64 "ld" 88 89 #else 90 #define PRId64 "lld" 91 92 #endif 93 #endif /* !defined( PRId64 ) */ 94 95 #if !defined( PRIi8 ) 96 #define PRIi8 "i" 97 #endif 98 99 #if !defined( PRIi16 ) 100 #define PRIi16 "i" 101 #endif 102 103 #if !defined( PRIi32 ) 104 #if defined( WINAPI ) 105 #define PRIi32 "I32i" 106 107 #else 108 #define PRIi32 "i" 109 110 #endif 111 #endif /* !defined( PRIi32 ) */ 112 113 #if !defined( PRIi64 ) 114 #if defined( WINAPI ) 115 #define PRIi64 "I64i" 116 117 #elif __WORDSIZE == 64 118 #define PRIi64 "li" 119 120 #else 121 #define PRIi64 "lli" 122 123 #endif 124 #endif /* !defined( PRIi64 ) */ 125 126 #if !defined( PRIu8 ) 127 #define PRIu8 "u" 128 #endif 129 130 #if !defined( PRIu16 ) 131 #define PRIu16 "u" 132 #endif 133 134 #if !defined( PRIu32 ) 135 #if defined( WINAPI ) 136 #define PRIu32 "I32u" 137 138 #else 139 #define PRIu32 "u" 140 141 #endif 142 #endif /* !defined( PRIu32 ) */ 143 144 #if !defined( PRIu64 ) 145 #if defined( WINAPI ) 146 #define PRIu64 "I64u" 147 148 #elif __WORDSIZE == 64 149 #define PRIu64 "lu" 150 151 #else 152 #define PRIu64 "llu" 153 154 #endif 155 #endif /* !defined( PRIu64 ) */ 156 157 #if !defined( PRIo8 ) 158 #define PRIo8 "o" 159 #endif 160 161 #if !defined( PRIo16 ) 162 #define PRIo16 "o" 163 #endif 164 165 #if !defined( PRIo32 ) 166 #if defined( WINAPI ) 167 #define PRIo32 "I32o" 168 169 #else 170 #define PRIo32 "o" 171 172 #endif 173 #endif /* !defined( PRIo32 ) */ 174 175 #if !defined( PRIo64 ) 176 #if defined( WINAPI ) 177 #define PRIo64 "I64o" 178 179 #elif __WORDSIZE == 64 180 #define PRIo64 "lo" 181 182 #else 183 #define PRIo64 "llo" 184 185 #endif 186 #endif /* !defined( PRIo64 ) */ 187 188 #if !defined( PRIx8 ) 189 #define PRIx8 "x" 190 #endif 191 192 #if !defined( PRIx16 ) 193 #define PRIx16 "x" 194 #endif 195 196 #if !defined( PRIx32 ) 197 #if defined( WINAPI ) 198 #define PRIx32 "I32x" 199 200 #else 201 #define PRIx32 "x" 202 203 #endif 204 #endif /* !defined( PRIx32 ) */ 205 206 #if !defined( PRIx64 ) 207 #if defined( WINAPI ) 208 #define PRIx64 "I64x" 209 210 #elif __WORDSIZE == 64 211 #define PRIx64 "lx" 212 213 #else 214 #define PRIx64 "llx" 215 216 #endif 217 #endif /* !defined( PRIx64 ) */ 218 219 /* Fallback for systems without printf %jd definition 220 */ 221 #if defined( HAVE_PRINTF_JD ) 222 #define PRIjd "jd" 223 #define PRIji "ji" 224 #define PRIju "ju" 225 #define PRIjx "jx" 226 227 #elif SIZEOF_OFF_T == 8 228 #define PRIjd PRId64 229 #define PRIji PRIi64 230 #define PRIju PRIu64 231 #define PRIjx PRIx64 232 233 #else 234 #define PRIjd PRId32 235 #define PRIji PRIi32 236 #define PRIju PRIu32 237 #define PRIjx PRIx32 238 239 #endif /* defined( HAVE_PRINTF_JD ) */ 240 241 /* Fallback for systems without printf %zd definition 242 */ 243 #if defined( HAVE_PRINTF_ZD ) 244 #define PRIzd "zd" 245 #define PRIzi "zi" 246 #define PRIzu "zu" 247 #define PRIzx "zx" 248 249 #elif defined( _MSC_VER ) 250 #define PRIzd "Id" 251 #define PRIzi "Ii" 252 #define PRIzu "Iu" 253 #define PRIzx "Ix" 254 255 #elif SIZEOF_SIZE_T == 8 256 #define PRIzd PRId64 257 #define PRIzi PRIi64 258 #define PRIzu PRIu64 259 #define PRIzx PRIx64 260 261 #else 262 #define PRIzd PRId32 263 #define PRIzi PRIi32 264 #define PRIzu PRIu32 265 #define PRIzx PRIx32 266 267 #endif /* defined( HAVE_PRINTF_ZD ) */ 268 269 /* Fallback for systems without (U)INTx_MAX definitions 270 */ 271 272 /* The maximum signed 8-bit integer is 127 (0x7f) 273 */ 274 #if !defined( INT8_MAX ) 275 #define INT8_MAX (0x7f) 276 #endif 277 278 /* The maximum unsigned 8-bit integer is 256 (0xff) 279 */ 280 #if !defined( UINT8_MAX ) 281 #define UINT8_MAX (0xff) 282 #endif 283 284 /* The maximum signed 16-bit integer is 32767 (0x7ffff) 285 */ 286 #if !defined( INT16_MAX ) 287 #define INT16_MAX (0x7fff) 288 #endif 289 290 /* The maximum unsigned 16-bit integer is 65535 (0xffff) 291 */ 292 #if !defined( UINT16_MAX ) 293 #define UINT16_MAX (0xffff) 294 #endif 295 296 /* The maximum signed 32-bit integer is 2147483647 (0x7fffffff) 297 */ 298 #if !defined( INT32_MAX ) 299 #define INT32_MAX (0x7fffffffL) 300 #endif 301 302 /* The maximum unsigned 32-bit integer is 4294967295 (0xffffffff) 303 */ 304 #if !defined( UINT32_MAX ) 305 #define UINT32_MAX (0xffffffffUL) 306 #endif 307 308 /* The minimum signed 64-bit integer is -9223372036854775808 (0x8000000000000000) 309 */ 310 #if !defined( INT64_MIN ) 311 #if defined( __BORLANDC__ ) && ( __BORLANDC__ < 0x0560 ) 312 #define INT64_MIN (0x8000000000000000UL) 313 #else 314 #define INT64_MIN (0x8000000000000000ULL) 315 #endif 316 #endif /* !defined( INT64_MIN ) */ 317 318 /* The maximum signed 64-bit integer is 9223372036854775807 (0x7fffffffffffffff) 319 */ 320 #if !defined( INT64_MAX ) 321 #if defined( __BORLANDC__ ) && ( __BORLANDC__ < 0x0560 ) 322 #define INT64_MAX (0x7fffffffffffffffUL) 323 #else 324 #define INT64_MAX (0x7fffffffffffffffULL) 325 #endif 326 #endif /* !defined( INT64_MAX ) */ 327 328 /* The maximum unsigned 64-bit integer is 18446744073709551615 (0xffffffffffffffff) 329 */ 330 #if !defined( UINT64_MAX ) 331 #if defined( __BORLANDC__ ) && ( __BORLANDC__ < 0x0560 ) 332 #define UINT64_MAX (0xffffffffffffffffUL) 333 #else 334 #define UINT64_MAX (0xffffffffffffffffULL) 335 #endif 336 #endif /* !defined( UINT64_MAX ) */ 337 338 /* The maximum signed integer 339 */ 340 #if !defined( INT_MAX ) 341 #define INT_MAX INT32_MAX 342 #endif 343 344 /* The maximum unsigned integer 345 */ 346 #if !defined( UINT_MAX ) 347 #define UINT_MAX UINT32_MAX 348 #endif 349 350 /* The maximum signed long integer 351 */ 352 #if !defined( LONG_MAX ) 353 #define LONG_MAX INT32_MAX 354 #endif 355 356 /* The maximum unsigned long integer 357 */ 358 #if !defined( ULONG_MAX ) 359 #define ULONG_MAX UINT32_MAX 360 #endif 361 362 /* The maximum signed size type is platform dependent 363 */ 364 #if !defined( SSIZE_MAX ) 365 366 #if defined( WINAPI ) 367 368 #if defined( _WIN64 ) 369 #define SSIZE_MAX INT64_MAX 370 #else 371 #define SSIZE_MAX INT32_MAX 372 #endif 373 374 #else 375 376 #if __WORDSIZE == 64 377 #define SSIZE_MAX INT64_MAX 378 #else 379 #define SSIZE_MAX INT32_MAX 380 #endif 381 382 #endif /* WINAPI */ 383 384 #endif /* SSIZE_MAX */ 385 386 #endif /* !defined( _TYPES_H ) */ 387 388