Subversion Repositories Kolibri OS

Rev

Rev 1693 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Copyright (c) 2004, 2005 by
  3.  * Ralf Corsepius, Ulm/Germany. All rights reserved.
  4.  *
  5.  * Permission to use, copy, modify, and distribute this software
  6.  * is freely granted, provided that this notice is preserved.
  7.  */
  8.  
  9. #ifndef _STDINT_H
  10. #define _STDINT_H
  11.  
  12. #ifdef __cplusplus
  13. extern "C" {
  14. #endif
  15.  
  16. #if defined(__GNUC__) && \
  17.   ( (__GNUC__ >= 4) || \
  18.     ( (__GNUC__ >= 3) && defined(__GNUC_MINOR__) && (__GNUC_MINOR__ > 2) ) )
  19. /* gcc > 3.2 implicitly defines the values we are interested */
  20. #define __STDINT_EXP(x) __##x##__
  21. #else
  22. #define __STDINT_EXP(x) x
  23. #include <limits.h>
  24. #endif
  25.  
  26. /* Check if "long long" is 64bit wide */
  27. /* Modern GCCs provide __LONG_LONG_MAX__, SUSv3 wants LLONG_MAX */
  28. #if ( defined(__LONG_LONG_MAX__) && (__LONG_LONG_MAX__ > 0x7fffffff) ) \
  29.   || ( defined(LLONG_MAX) && (LLONG_MAX > 0x7fffffff) )
  30. #define __have_longlong64 1
  31. #endif
  32.  
  33. /* Check if "long" is 64bit or 32bit wide */
  34. #if __STDINT_EXP(LONG_MAX) > 0x7fffffff
  35. #define __have_long64 1
  36. #elif __STDINT_EXP(LONG_MAX) == 0x7fffffff && !defined(__SPU__)
  37. #define __have_long32 1
  38. #endif
  39.  
  40. #if __STDINT_EXP(SCHAR_MAX) == 0x7f
  41. typedef signed char int8_t ;
  42. typedef unsigned char uint8_t ;
  43. #define __int8_t_defined 1
  44. #endif
  45.  
  46. #if __int8_t_defined
  47. typedef signed char int_least8_t;
  48. typedef unsigned char uint_least8_t;
  49. #define __int_least8_t_defined 1
  50. #endif
  51.  
  52. #if __STDINT_EXP(SHRT_MAX) == 0x7fff
  53. typedef signed short int16_t;
  54. typedef unsigned short uint16_t;
  55. #define __int16_t_defined 1
  56. #elif __STDINT_EXP(INT_MAX) == 0x7fff
  57. typedef signed int int16_t;
  58. typedef unsigned int uint16_t;
  59. #define __int16_t_defined 1
  60. #elif __STDINT_EXP(SCHAR_MAX) == 0x7fff
  61. typedef signed char int16_t;
  62. typedef unsigned char uint16_t;
  63. #define __int16_t_defined 1
  64. #endif
  65.  
  66. #if __int16_t_defined
  67. typedef int16_t         int_least16_t;
  68. typedef uint16_t        uint_least16_t;
  69. #define __int_least16_t_defined 1
  70.  
  71. #if !__int_least8_t_defined
  72. typedef int16_t         int_least8_t;
  73. typedef uint16_t        uint_least8_t;
  74. #define __int_least8_t_defined 1
  75. #endif
  76. #endif
  77.  
  78. //#if __have_long32
  79. //typedef signed long int32_t;
  80. //typedef unsigned long uint32_t;
  81. //#define __int32_t_defined 1
  82. //#elif __STDINT_EXP(INT_MAX) == 0x7fffffffL
  83. typedef signed int int32_t;
  84. typedef unsigned int uint32_t;
  85. #define __int32_t_defined 1
  86. //#elif __STDINT_EXP(SHRT_MAX) == 0x7fffffffL
  87. //typedef signed short int32_t;
  88. //typedef unsigned short uint32_t;
  89. //#define __int32_t_defined 1
  90. //#elif __STDINT_EXP(SCHAR_MAX) == 0x7fffffffL
  91. //typedef signed char int32_t;
  92. //typedef unsigned char uint32_t;
  93. //#define __int32_t_defined 1
  94. //#endif
  95.  
  96. #if __int32_t_defined
  97. typedef int32_t         int_least32_t;
  98. typedef uint32_t        uint_least32_t;
  99. #define __int_least32_t_defined 1
  100.  
  101. #if !__int_least8_t_defined
  102. typedef int32_t         int_least8_t;
  103. typedef uint32_t        uint_least8_t;
  104. #define __int_least8_t_defined 1
  105. #endif
  106.  
  107. #if !__int_least16_t_defined
  108. typedef int32_t         int_least16_t;
  109. typedef uint32_t        uint_least16_t;
  110. #define __int_least16_t_defined 1
  111. #endif
  112. #endif
  113.  
  114. #if __have_long64
  115. typedef signed long int64_t;
  116. typedef unsigned long uint64_t;
  117. #define __int64_t_defined 1
  118. #elif __have_longlong64
  119. typedef signed long long int64_t;
  120. typedef unsigned long long uint64_t;
  121. #define __int64_t_defined 1
  122. #elif  __STDINT_EXP(INT_MAX) > 0x7fffffff
  123. typedef signed int int64_t;
  124. typedef unsigned int uint64_t;
  125. #define __int64_t_defined 1
  126. #endif
  127.  
  128. #if __int64_t_defined
  129. typedef int64_t         int_least64_t;
  130. typedef uint64_t        uint_least64_t;
  131. #define __int_least64_t_defined 1
  132.  
  133. #if !__int_least8_t_defined
  134. typedef int64_t         int_least8_t;
  135. typedef uint64_t        uint_least8_t;
  136. #define __int_least8_t_defined 1
  137. #endif
  138.  
  139. #if !__int_least16_t_defined
  140. typedef int64_t         int_least16_t;
  141. typedef uint64_t        uint_least16_t;
  142. #define __int_least16_t_defined 1
  143. #endif
  144.  
  145. #if !__int_least32_t_defined
  146. typedef int64_t         int_least32_t;
  147. typedef uint64_t        uint_least32_t;
  148. #define __int_least32_t_defined 1
  149. #endif
  150. #endif
  151.  
  152. /*
  153.  * Fastest minimum-width integer types
  154.  *
  155.  * Assume int to be the fastest type for all types with a width
  156.  * less than __INT_MAX__ rsp. INT_MAX
  157.  */
  158. #if __STDINT_EXP(INT_MAX) >= 0x7f
  159.   typedef signed int int_fast8_t;
  160.   typedef unsigned int uint_fast8_t;
  161. #define __int_fast8_t_defined 1
  162. #endif
  163.  
  164. #if __STDINT_EXP(INT_MAX) >= 0x7fff
  165.   typedef signed int int_fast16_t;
  166.   typedef unsigned int uint_fast16_t;
  167. #define __int_fast16_t_defined 1
  168. #endif
  169.  
  170. #if __STDINT_EXP(INT_MAX) >= 0x7fffffff
  171.   typedef signed int int_fast32_t;
  172.   typedef unsigned int uint_fast32_t;
  173. #define __int_fast32_t_defined 1
  174. #endif
  175.  
  176. #if __STDINT_EXP(INT_MAX) > 0x7fffffff
  177.   typedef signed int int_fast64_t;
  178.   typedef unsigned int uint_fast64_t;
  179. #define __int_fast64_t_defined 1
  180. #endif
  181.  
  182. /*
  183.  * Fall back to [u]int_least<N>_t for [u]int_fast<N>_t types
  184.  * not having been defined, yet.
  185.  * Leave undefined, if [u]int_least<N>_t should not be available.
  186.  */
  187. #if !__int_fast8_t_defined
  188. #if __int_least8_t_defined
  189.   typedef int_least8_t int_fast8_t;
  190.   typedef uint_least8_t uint_fast8_t;
  191. #define __int_fast8_t_defined 1
  192. #endif
  193. #endif
  194.  
  195. #if !__int_fast16_t_defined
  196. #if __int_least16_t_defined
  197.   typedef int_least16_t int_fast16_t;
  198.   typedef uint_least16_t uint_fast16_t;
  199. #define __int_fast16_t_defined 1
  200. #endif
  201. #endif
  202.  
  203. #if !__int_fast32_t_defined
  204. #if __int_least32_t_defined
  205.   typedef int_least32_t int_fast32_t;
  206.   typedef uint_least32_t uint_fast32_t;
  207. #define __int_fast32_t_defined 1
  208. #endif
  209. #endif
  210.  
  211. #if !__int_fast64_t_defined
  212. #if __int_least64_t_defined
  213.   typedef int_least64_t int_fast64_t;
  214.   typedef uint_least64_t uint_fast64_t;
  215. #define __int_fast64_t_defined 1
  216. #endif
  217. #endif
  218.  
  219. /* Greatest-width integer types */
  220. /* Modern GCCs provide __INTMAX_TYPE__ */
  221. #if defined(__INTMAX_TYPE__)
  222.   typedef __INTMAX_TYPE__ intmax_t;
  223. #elif __have_longlong64
  224.   typedef signed long long intmax_t;
  225. #else
  226.   typedef signed long intmax_t;
  227. #endif
  228.  
  229. /* Modern GCCs provide __UINTMAX_TYPE__ */
  230. #if defined(__UINTMAX_TYPE__)
  231.   typedef __UINTMAX_TYPE__ uintmax_t;
  232. #elif __have_longlong64
  233.   typedef unsigned long long uintmax_t;
  234. #else
  235.   typedef unsigned long uintmax_t;
  236. #endif
  237.  
  238. /*
  239.  * GCC doesn't provide an appropriate macro for [u]intptr_t
  240.  * For now, use __PTRDIFF_TYPE__
  241.  */
  242. #if defined(__PTRDIFF_TYPE__)
  243. typedef signed __PTRDIFF_TYPE__ intptr_t;
  244. typedef unsigned __PTRDIFF_TYPE__ uintptr_t;
  245. #define INTPTR_MAX PTRDIFF_MAX
  246. #define INTPTR_MIN PTRDIFF_MIN
  247. #ifdef __UINTPTR_MAX__
  248. #define UINTPTR_MAX __UINTPTR_MAX__
  249. #else
  250. #define UINTPTR_MAX (2UL * PTRDIFF_MAX + 1)
  251. #endif
  252. #else
  253. /*
  254.  * Fallback to hardcoded values,
  255.  * should be valid on cpu's with 32bit int/32bit void*
  256.  */
  257. typedef signed long intptr_t;
  258. typedef unsigned long uintptr_t;
  259. #define INTPTR_MAX __STDINT_EXP(LONG_MAX)
  260. #define INTPTR_MIN (-__STDINT_EXP(LONG_MAX) - 1)
  261. #define UINTPTR_MAX (__STDINT_EXP(LONG_MAX) * 2UL + 1)
  262. #endif
  263.  
  264. /* Limits of Specified-Width Integer Types */
  265.  
  266. #if __int8_t_defined
  267. #define INT8_MIN        -128
  268. #define INT8_MAX         127
  269. #define UINT8_MAX        255
  270. #endif
  271.  
  272. #if __int_least8_t_defined
  273. #define INT_LEAST8_MIN  -128
  274. #define INT_LEAST8_MAX   127
  275. #define UINT_LEAST8_MAX  255
  276. #else
  277. #error required type int_least8_t missing
  278. #endif
  279.  
  280. #if __int16_t_defined
  281. #define INT16_MIN       -32768
  282. #define INT16_MAX        32767
  283. #define UINT16_MAX       65535
  284. #endif
  285.  
  286. #if __int_least16_t_defined
  287. #define INT_LEAST16_MIN -32768
  288. #define INT_LEAST16_MAX  32767
  289. #define UINT_LEAST16_MAX 65535
  290. #else
  291. #error required type int_least16_t missing
  292. #endif
  293.  
  294. #if __int32_t_defined
  295. #if __have_long32
  296. #define INT32_MIN        (-2147483647L-1)
  297. #define INT32_MAX        2147483647L
  298. #define UINT32_MAX       4294967295UL
  299. #else
  300. #define INT32_MIN        (-2147483647-1)
  301. #define INT32_MAX        2147483647
  302. #define UINT32_MAX       4294967295U
  303. #endif
  304. #endif
  305.  
  306. #if __int_least32_t_defined
  307. #if __have_long32
  308. #define INT_LEAST32_MIN  (-2147483647L-1)
  309. #define INT_LEAST32_MAX  2147483647L
  310. #define UINT_LEAST32_MAX 4294967295UL
  311. #else
  312. #define INT_LEAST32_MIN  (-2147483647-1)
  313. #define INT_LEAST32_MAX  2147483647
  314. #define UINT_LEAST32_MAX 4294967295U
  315. #endif
  316. #else
  317. #error required type int_least32_t missing
  318. #endif
  319.  
  320. #if __int64_t_defined
  321. #if __have_long64
  322. #define INT64_MIN       (-9223372036854775807L-1L)
  323. #define INT64_MAX        9223372036854775807L
  324. #define UINT64_MAX      18446744073709551615U
  325. #elif __have_longlong64
  326. #define INT64_MIN       (-9223372036854775807LL-1LL)
  327. #define INT64_MAX        9223372036854775807LL
  328. #define UINT64_MAX      18446744073709551615ULL
  329. #endif
  330. #endif
  331.  
  332. #if __int_least64_t_defined
  333. #if __have_long64
  334. #define INT_LEAST64_MIN  (-9223372036854775807L-1L)
  335. #define INT_LEAST64_MAX  9223372036854775807L
  336. #define UINT_LEAST64_MAX 18446744073709551615U
  337. #elif __have_longlong64
  338. #define INT_LEAST64_MIN  (-9223372036854775807LL-1LL)
  339. #define INT_LEAST64_MAX  9223372036854775807LL
  340. #define UINT_LEAST64_MAX 18446744073709551615ULL
  341. #endif
  342. #endif
  343.  
  344. #if __int_fast8_t_defined
  345. #if __STDINT_EXP(INT_MAX) >= 0x7f
  346. #define INT_FAST8_MIN   (-__STDINT_EXP(INT_MAX)-1)
  347. #define INT_FAST8_MAX   __STDINT_EXP(INT_MAX)
  348. #define UINT_FAST8_MAX  (__STDINT_EXP(INT_MAX)*2U+1U)
  349. #else
  350. #define INT_FAST8_MIN   INT_LEAST8_MIN
  351. #define INT_FAST8_MAX   INT_LEAST8_MAX
  352. #define UINT_FAST8_MAX  UINT_LEAST8_MAX
  353. #endif
  354. #endif
  355.  
  356. #if __int_fast16_t_defined
  357. #if __STDINT_EXP(INT_MAX) >= 0x7fff
  358. #define INT_FAST16_MIN  (-__STDINT_EXP(INT_MAX)-1)
  359. #define INT_FAST16_MAX  __STDINT_EXP(INT_MAX)
  360. #define UINT_FAST16_MAX (__STDINT_EXP(INT_MAX)*2U+1U)
  361. #else
  362. #define INT_FAST16_MIN  INT_LEAST16_MIN
  363. #define INT_FAST16_MAX  INT_LEAST16_MAX
  364. #define UINT_FAST16_MAX UINT_LEAST16_MAX
  365. #endif
  366. #endif
  367.  
  368. #if __int_fast32_t_defined
  369. #if __STDINT_EXP(INT_MAX) >= 0x7fffffff
  370. #define INT_FAST32_MIN  (-__STDINT_EXP(INT_MAX)-1)
  371. #define INT_FAST32_MAX  __STDINT_EXP(INT_MAX)
  372. #define UINT_FAST32_MAX (__STDINT_EXP(INT_MAX)*2U+1U)
  373. #else
  374. #define INT_FAST32_MIN  INT_LEAST32_MIN
  375. #define INT_FAST32_MAX  INT_LEAST32_MAX
  376. #define UINT_FAST32_MAX UINT_LEAST32_MAX
  377. #endif
  378. #endif
  379.  
  380. #if __int_fast64_t_defined
  381. #if __STDINT_EXP(INT_MAX) > 0x7fffffff
  382. #define INT_FAST64_MIN  (-__STDINT_EXP(INT_MAX)-1)
  383. #define INT_FAST64_MAX  __STDINT_EXP(INT_MAX)
  384. #define UINT_FAST64_MAX (__STDINT_EXP(INT_MAX)*2U+1U)
  385. #else
  386. #define INT_FAST64_MIN  INT_LEAST64_MIN
  387. #define INT_FAST64_MAX  INT_LEAST64_MAX
  388. #define UINT_FAST64_MAX UINT_LEAST64_MAX
  389. #endif
  390. #endif
  391.  
  392. #ifdef __INTMAX_MAX__
  393. #define INTMAX_MAX __INTMAX_MAX__
  394. #define INTMAX_MIN (-INTMAX_MAX - 1)
  395. #elif defined(__INTMAX_TYPE__)
  396. /* All relevant GCC versions prefer long to long long for intmax_t.  */
  397. #define INTMAX_MAX INT64_MAX
  398. #define INTMAX_MIN INT64_MIN
  399. #endif
  400.  
  401. #ifdef __UINTMAX_MAX__
  402. #define UINTMAX_MAX __UINTMAX_MAX__
  403. #elif defined(__UINTMAX_TYPE__)
  404. /* All relevant GCC versions prefer long to long long for intmax_t.  */
  405. #define UINTMAX_MAX UINT64_MAX
  406. #endif
  407.  
  408. /* This must match size_t in stddef.h, currently long unsigned int */
  409. #ifdef __SIZE_MAX__
  410. #define SIZE_MAX __SIZE_MAX__
  411. #else
  412. #define SIZE_MAX (__STDINT_EXP(LONG_MAX) * 2UL + 1)
  413. #endif
  414.  
  415. /* This must match sig_atomic_t in <signal.h> (currently int) */
  416. #define SIG_ATOMIC_MIN (-__STDINT_EXP(INT_MAX) - 1)
  417. #define SIG_ATOMIC_MAX __STDINT_EXP(INT_MAX)
  418.  
  419. /* This must match ptrdiff_t  in <stddef.h> (currently long int) */
  420. #ifdef __PTRDIFF_MAX__
  421. #define PTRDIFF_MAX __PTRDIFF_MAX__
  422. #else
  423. #define PTRDIFF_MAX __STDINT_EXP(LONG_MAX)
  424. #endif
  425. #define PTRDIFF_MIN (-PTRDIFF_MAX - 1)
  426.  
  427. #ifdef __WCHAR_MAX__
  428. #define WCHAR_MAX __WCHAR_MAX__
  429. #endif
  430. #ifdef __WCHAR_MIN__
  431. #define WCHAR_MIN __WCHAR_MIN__
  432. #endif
  433.  
  434. /* wint_t is unsigned int on almost all GCC targets.  */
  435. #ifdef __WINT_MAX__
  436. #define WINT_MAX __WINT_MAX__
  437. #else
  438. #define WINT_MAX (__STDINT_EXP(INT_MAX) * 2U + 1U)
  439. #endif
  440. #ifdef __WINT_MIN__
  441. #define WINT_MIN __WINT_MIN__
  442. #else
  443. #define WINT_MIN 0U
  444. #endif
  445.  
  446. /** Macros for minimum-width integer constant expressions */
  447. #define INT8_C(x)       x
  448. #if __STDINT_EXP(INT_MAX) > 0x7f
  449. #define UINT8_C(x)      x
  450. #else
  451. #define UINT8_C(x)      x##U
  452. #endif
  453.  
  454. #define INT16_C(x)      x
  455. #if __STDINT_EXP(INT_MAX) > 0x7fff
  456. #define UINT16_C(x)     x
  457. #else
  458. #define UINT16_C(x)     x##U
  459. #endif
  460.  
  461. #if __have_long32
  462. #define INT32_C(x)      x##L
  463. #define UINT32_C(x)     x##UL
  464. #else
  465. #define INT32_C(x)      x
  466. #define UINT32_C(x)     x##U
  467. #endif
  468.  
  469. #if __int64_t_defined
  470. #if __have_long64
  471. #define INT64_C(x)      x##L
  472. #define UINT64_C(x)     x##UL
  473. #else
  474. #define INT64_C(x)      x##LL
  475. #define UINT64_C(x)     x##ULL
  476. #endif
  477. #endif
  478.  
  479. /** Macros for greatest-width integer constant expression */
  480. #if __have_long64
  481. #define INTMAX_C(x)     x##L
  482. #define UINTMAX_C(x)    x##UL
  483. #else
  484. #define INTMAX_C(x)     x##LL
  485. #define UINTMAX_C(x)    x##ULL
  486. #endif
  487.  
  488.  
  489. #ifdef __cplusplus
  490. }
  491. #endif
  492.  
  493. #endif /* _STDINT_H */
  494.