Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | 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 _SYS__INTSUP_H
  10. #define _SYS__INTSUP_H
  11.  
  12. #include <sys/features.h>
  13.  
  14. #if __GNUC_PREREQ (3, 2)
  15. /* gcc > 3.2 implicitly defines the values we are interested */
  16. #define __STDINT_EXP(x) __##x##__
  17. #else
  18. #define __STDINT_EXP(x) x
  19. #include <limits.h>
  20. #endif
  21.  
  22. /* Check if "long long" is 64bit wide */
  23. /* Modern GCCs provide __LONG_LONG_MAX__, SUSv3 wants LLONG_MAX */
  24. #if ( defined(__LONG_LONG_MAX__) && (__LONG_LONG_MAX__ > 0x7fffffff) ) \
  25.   || ( defined(LLONG_MAX) && (LLONG_MAX > 0x7fffffff) )
  26. #define __have_longlong64 1
  27. #endif
  28.  
  29. /* Check if "long" is 64bit or 32bit wide */
  30. #if __STDINT_EXP(LONG_MAX) > 0x7fffffff
  31. #define __have_long64 1
  32. #elif __STDINT_EXP(LONG_MAX) == 0x7fffffff && !defined(__SPU__)
  33. #define __have_long32 1
  34. #endif
  35.  
  36. /* Determine how intptr_t and intN_t fastN_t and leastN_t are defined by gcc
  37.    for this target.  This is used to determine the correct printf() constant in
  38.    inttypes.h and other  constants in stdint.h.
  39.    So we end up with
  40.    ?(signed|unsigned) char == 0
  41.    ?(signed|unsigned) short == 1
  42.    ?(signed|unsigned) int == 2
  43.    ?(signed|unsigned) short int == 3
  44.    ?(signed|unsigned) long == 4
  45.    ?(signed|unsigned) long int == 6
  46.    ?(signed|unsigned) long long == 8
  47.    ?(signed|unsigned) long long int == 10
  48.  */
  49. #pragma push_macro("signed")
  50. #pragma push_macro("unsigned")
  51. #pragma push_macro("char")
  52. #pragma push_macro("short")
  53. #pragma push_macro("__int20")
  54. #pragma push_macro("int")
  55. #pragma push_macro("long")
  56. #undef signed
  57. #undef unsigned
  58. #undef char
  59. #undef short
  60. #undef int
  61. #undef __int20
  62. #undef long
  63. #define signed +0
  64. #define unsigned +0
  65. #define char +0
  66. #define short +1
  67. #define __int20 +2
  68. #define int +2
  69. #define long +4
  70. #if (__INTPTR_TYPE__ == 8 || __INTPTR_TYPE__ == 10)
  71. #define _INTPTR_EQ_LONGLONG
  72. #elif (__INTPTR_TYPE__ == 4 || __INTPTR_TYPE__ == 6)
  73. #define _INTPTR_EQ_LONG
  74. /* Note - the tests for _INTPTR_EQ_INT and _INTPTR_EQ_SHORT are currently
  75.    redundant as the values are not used.  But one day they may be needed
  76.    and so the tests remain.  */
  77. #elif __INTPTR_TYPE__ == 2
  78. #define _INTPTR_EQ_INT
  79. #elif (__INTPTR_TYPE__ == 1 || __INTPTR_TYPE__ == 3)
  80. #define _INTPTR_EQ_SHORT
  81. #else
  82. #error "Unable to determine type definition of intptr_t"
  83. #endif
  84. #if (__INT32_TYPE__ == 4 || __INT32_TYPE__ == 6)
  85. #define _INT32_EQ_LONG
  86. #elif __INT32_TYPE__ == 2
  87. /* Nothing to define because int32_t is safe to print as an int. */
  88. #else
  89. #error "Unable to determine type definition of int32_t"
  90. #endif
  91.  
  92. #if (__INT8_TYPE__ == 0)
  93. #define __INT8 "hh"
  94. #elif (__INT8_TYPE__ == 1 || __INT8_TYPE__ == 3)
  95. #define __INT8 "h"
  96. #elif (__INT8_TYPE__ == 2)
  97. #define __INT8
  98. #elif (__INT8_TYPE__ == 4 || __INT8_TYPE__ == 6)
  99. #define __INT8 "l"
  100. #elif (__INT8_TYPE__ == 8 || __INT8_TYPE__ == 10)
  101. #define __INT8 "ll"
  102. #endif
  103. #if (__INT16_TYPE__ == 1 || __INT16_TYPE__ == 3)
  104. #define __INT16 "h"
  105. #elif (__INT16_TYPE__ == 2)
  106. #define __INT16
  107. #elif (__INT16_TYPE__ == 4 || __INT16_TYPE__ == 6)
  108. #define __INT16 "l"
  109. #elif (__INT16_TYPE__ == 8 || __INT16_TYPE__ == 10)
  110. #define __INT16 "ll"
  111. #endif
  112. #if (__INT32_TYPE__ == 2)
  113. #define __INT32
  114. #elif (__INT32_TYPE__ == 4 || __INT32_TYPE__ == 6)
  115. #define __INT32 "l"
  116. #elif (__INT32_TYPE__ == 8 || __INT32_TYPE__ == 10)
  117. #define __INT32 "ll"
  118. #endif
  119. #if (__INT64_TYPE__ == 2)
  120. #define __INT64
  121. #elif (__INT64_TYPE__ == 4 || __INT64_TYPE__ == 6)
  122. #define __INT64 "l"
  123. #elif (__INT64_TYPE__ == 8 || __INT64_TYPE__ == 10)
  124. #define __INT64 "ll"
  125. #endif
  126. #if (__INT_FAST8_TYPE__ == 0)
  127. #define __FAST8 "hh"
  128. #elif (__INT_FAST8_TYPE__ == 1 || __INT_FAST8_TYPE__ == 3)
  129. #define __FAST8 "h"
  130. #elif (__INT_FAST8_TYPE__ == 2)
  131. #define __FAST8
  132. #elif (__INT_FAST8_TYPE__ == 4 || __INT_FAST8_TYPE__ == 6)
  133. #define __FAST8 "l"
  134. #elif (__INT_FAST8_TYPE__ == 8 || __INT_FAST8_TYPE__ == 10)
  135. #define __FAST8 "ll"
  136. #endif
  137. #if (__INT_FAST16_TYPE__ == 1 || __INT_FAST16_TYPE__ == 3)
  138. #define __FAST16 "h"
  139. #elif (__INT_FAST16_TYPE__ == 2)
  140. #define __FAST16
  141. #elif (__INT_FAST16_TYPE__ == 4 || __INT_FAST16_TYPE__ == 6)
  142. #define __FAST16 "l"
  143. #elif (__INT_FAST16_TYPE__ == 8 || __INT_FAST16_TYPE__ == 10)
  144. #define __FAST16 "ll"
  145. #endif
  146. #if (__INT_FAST32_TYPE__ == 2)
  147. #define __FAST32
  148. #elif (__INT_FAST32_TYPE__ == 4 || __INT_FAST32_TYPE__ == 6)
  149. #define __FAST32 "l"
  150. #elif (__INT_FAST32_TYPE__ == 8 || __INT_FAST32_TYPE__ == 10)
  151. #define __FAST32 "ll"
  152. #endif
  153. #if (__INT_FAST64_TYPE__ == 2)
  154. #define __FAST64
  155. #elif (__INT_FAST64_TYPE__ == 4 || __INT_FAST64_TYPE__ == 6)
  156. #define __FAST64 "l"
  157. #elif (__INT_FAST64_TYPE__ == 8 || __INT_FAST64_TYPE__ == 10)
  158. #define __FAST64 "ll"
  159. #endif
  160.  
  161. #if (__INT_LEAST8_TYPE__ == 0)
  162. #define __LEAST8 "hh"
  163. #elif (__INT_LEAST8_TYPE__ == 1 || __INT_LEAST8_TYPE__ == 3)
  164. #define __LEAST8 "h"
  165. #elif (__INT_LEAST8_TYPE__ == 2)
  166. #define __LEAST8
  167. #elif (__INT_LEAST8_TYPE__ == 4 || __INT_LEAST8_TYPE__ == 6)
  168. #define __LEAST8 "l"
  169. #elif (__INT_LEAST8_TYPE__ == 8 || __INT_LEAST8_TYPE__ == 10)
  170. #define __LEAST8 "ll"
  171. #endif
  172. #if (__INT_LEAST16_TYPE__ == 1 || __INT_LEAST16_TYPE__ == 3)
  173. #define __LEAST16 "h"
  174. #elif (__INT_LEAST16_TYPE__ == 2)
  175. #define __LEAST16
  176. #elif (__INT_LEAST16_TYPE__ == 4 || __INT_LEAST16_TYPE__ == 6)
  177. #define __LEAST16 "l"
  178. #elif (__INT_LEAST16_TYPE__ == 8 || __INT_LEAST16_TYPE__ == 10)
  179. #define __LEAST16 "ll"
  180. #endif
  181. #if (__INT_LEAST32_TYPE__ == 2)
  182. #define __LEAST32
  183. #elif (__INT_LEAST32_TYPE__ == 4 || __INT_LEAST32_TYPE__ == 6)
  184. #define __LEAST32 "l"
  185. #elif (__INT_LEAST32_TYPE__ == 8 || __INT_LEAST32_TYPE__ == 10)
  186. #define __LEAST32 "ll"
  187. #endif
  188. #if (__INT_LEAST64_TYPE__ == 2)
  189. #define __LEAST64
  190. #elif (__INT_LEAST64_TYPE__ == 4 || __INT_LEAST64_TYPE__ == 6)
  191. #define __LEAST64 "l"
  192. #elif (__INT_LEAST64_TYPE__ == 8 || __INT_LEAST64_TYPE__ == 10)
  193. #define __LEAST64 "ll"
  194. #endif
  195. #undef signed
  196. #undef unsigned
  197. #undef char
  198. #undef short
  199. #undef int
  200. #undef long
  201. #pragma pop_macro("signed")
  202. #pragma pop_macro("unsigned")
  203. #pragma pop_macro("char")
  204. #pragma pop_macro("short")
  205. #pragma pop_macro("__int20")
  206. #pragma pop_macro("int")
  207. #pragma pop_macro("long")
  208.  
  209. #endif /* _SYS__INTSUP_H */
  210.