sysdep.h 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. /*
  2. * MessagePack system dependencies
  3. *
  4. * Copyright (C) 2008-2010 FURUHASHI Sadayuki
  5. *
  6. * Distributed under the Boost Software License, Version 1.0.
  7. * (See accompanying file LICENSE_1_0.txt or copy at
  8. * http://www.boost.org/LICENSE_1_0.txt)
  9. */
  10. #ifndef MSGPACK_SYSDEP_H
  11. #define MSGPACK_SYSDEP_H
  12. #include <stdlib.h>
  13. #include <stddef.h>
  14. #if defined(_MSC_VER) && _MSC_VER <= 1800
  15. # define snprintf(buf, len, format,...) _snprintf_s(buf, len, len, format, __VA_ARGS__)
  16. #endif
  17. #if defined(_MSC_VER) && _MSC_VER < 1600
  18. typedef signed __int8 int8_t;
  19. typedef unsigned __int8 uint8_t;
  20. typedef signed __int16 int16_t;
  21. typedef unsigned __int16 uint16_t;
  22. typedef signed __int32 int32_t;
  23. typedef unsigned __int32 uint32_t;
  24. typedef signed __int64 int64_t;
  25. typedef unsigned __int64 uint64_t;
  26. #elif defined(_MSC_VER) // && _MSC_VER >= 1600
  27. # include <stdint.h>
  28. #else
  29. # include <stdint.h>
  30. # include <stdbool.h>
  31. #endif
  32. #if !defined(MSGPACK_DLLEXPORT)
  33. #if defined(_MSC_VER)
  34. # define MSGPACK_DLLEXPORT __declspec(dllexport)
  35. #else /* _MSC_VER */
  36. # define MSGPACK_DLLEXPORT
  37. #endif /* _MSC_VER */
  38. #endif
  39. #ifdef _WIN32
  40. # define _msgpack_atomic_counter_header <windows.h>
  41. # if !defined(WIN32_LEAN_AND_MEAN)
  42. # define WIN32_LEAN_AND_MEAN
  43. # endif /* WIN32_LEAN_AND_MEAN */
  44. typedef long _msgpack_atomic_counter_t;
  45. # define _msgpack_sync_decr_and_fetch(ptr) InterlockedDecrement(ptr)
  46. # define _msgpack_sync_incr_and_fetch(ptr) InterlockedIncrement(ptr)
  47. #elif defined(__GNUC__) && ((__GNUC__*10 + __GNUC_MINOR__) < 41)
  48. # if defined(__cplusplus)
  49. # define _msgpack_atomic_counter_header "msgpack/gcc_atomic.hpp"
  50. # else
  51. # define _msgpack_atomic_counter_header "msgpack/gcc_atomic.h"
  52. # endif
  53. #else
  54. typedef unsigned int _msgpack_atomic_counter_t;
  55. # define _msgpack_sync_decr_and_fetch(ptr) __sync_sub_and_fetch(ptr, 1)
  56. # define _msgpack_sync_incr_and_fetch(ptr) __sync_add_and_fetch(ptr, 1)
  57. #endif
  58. #ifdef _WIN32
  59. # ifdef __cplusplus
  60. /* numeric_limits<T>::min,max */
  61. # ifdef max
  62. # undef max
  63. # endif
  64. # ifdef min
  65. # undef min
  66. # endif
  67. # endif
  68. #elif defined(unix) || defined(__unix) || defined(__APPLE__) || defined(__OpenBSD__)
  69. #include <arpa/inet.h> /* __BYTE_ORDER */
  70. # if defined(linux)
  71. # include <byteswap.h>
  72. # endif
  73. #endif
  74. #if !defined(MSGPACK_ENDIAN_LITTLE_BYTE) && !defined(MSGPACK_ENDIAN_BIG_BYTE)
  75. #include <msgpack/predef/other/endian.h>
  76. #endif // !defined(MSGPACK_ENDIAN_LITTLE_BYTE) && !defined(MSGPACK_ENDIAN_BIG_BYTE)
  77. #if MSGPACK_ENDIAN_LITTLE_BYTE
  78. # if defined(unix) || defined(__unix) || defined(__APPLE__) || defined(__OpenBSD__)
  79. # define _msgpack_be16(x) ntohs(x)
  80. # else
  81. # if defined(ntohs)
  82. # define _msgpack_be16(x) ntohs(x)
  83. # elif defined(_byteswap_ushort) || (defined(_MSC_VER) && _MSC_VER >= 1400)
  84. # define _msgpack_be16(x) ((uint16_t)_byteswap_ushort((unsigned short)x))
  85. # else
  86. # define _msgpack_be16(x) ( \
  87. ((((uint16_t)x) << 8) ) | \
  88. ((((uint16_t)x) >> 8) ) )
  89. # endif
  90. # endif
  91. # if defined(unix) || defined(__unix) || defined(__APPLE__) || defined(__OpenBSD__)
  92. # define _msgpack_be32(x) ntohl(x)
  93. # else
  94. # if defined(ntohl)
  95. # define _msgpack_be32(x) ntohl(x)
  96. # elif defined(_byteswap_ulong) || (defined(_MSC_VER) && _MSC_VER >= 1400)
  97. # define _msgpack_be32(x) ((uint32_t)_byteswap_ulong((unsigned long)x))
  98. # else
  99. # define _msgpack_be32(x) \
  100. ( ((((uint32_t)x) << 24) ) | \
  101. ((((uint32_t)x) << 8) & 0x00ff0000U ) | \
  102. ((((uint32_t)x) >> 8) & 0x0000ff00U ) | \
  103. ((((uint32_t)x) >> 24) ) )
  104. # endif
  105. # endif
  106. # if defined(_byteswap_uint64) || (defined(_MSC_VER) && _MSC_VER >= 1400)
  107. # define _msgpack_be64(x) (_byteswap_uint64(x))
  108. # elif defined(bswap_64)
  109. # define _msgpack_be64(x) bswap_64(x)
  110. # elif defined(__DARWIN_OSSwapInt64)
  111. # define _msgpack_be64(x) __DARWIN_OSSwapInt64(x)
  112. # else
  113. # define _msgpack_be64(x) \
  114. ( ((((uint64_t)x) << 56) ) | \
  115. ((((uint64_t)x) << 40) & 0x00ff000000000000ULL ) | \
  116. ((((uint64_t)x) << 24) & 0x0000ff0000000000ULL ) | \
  117. ((((uint64_t)x) << 8) & 0x000000ff00000000ULL ) | \
  118. ((((uint64_t)x) >> 8) & 0x00000000ff000000ULL ) | \
  119. ((((uint64_t)x) >> 24) & 0x0000000000ff0000ULL ) | \
  120. ((((uint64_t)x) >> 40) & 0x000000000000ff00ULL ) | \
  121. ((((uint64_t)x) >> 56) ) )
  122. # endif
  123. #elif MSGPACK_ENDIAN_BIG_BYTE
  124. # define _msgpack_be16(x) (x)
  125. # define _msgpack_be32(x) (x)
  126. # define _msgpack_be64(x) (x)
  127. #else
  128. # error msgpack-c supports only big endian and little endian
  129. #endif /* MSGPACK_ENDIAN_LITTLE_BYTE */
  130. #define _msgpack_load16(cast, from, to) do { \
  131. memcpy((cast*)(to), (from), sizeof(cast)); \
  132. *(to) = _msgpack_be16(*(to)); \
  133. } while (0);
  134. #define _msgpack_load32(cast, from, to) do { \
  135. memcpy((cast*)(to), (from), sizeof(cast)); \
  136. *(to) = _msgpack_be32(*(to)); \
  137. } while (0);
  138. #define _msgpack_load64(cast, from, to) do { \
  139. memcpy((cast*)(to), (from), sizeof(cast)); \
  140. *(to) = _msgpack_be64(*(to)); \
  141. } while (0);
  142. #define _msgpack_store16(to, num) \
  143. do { uint16_t val = _msgpack_be16(num); memcpy(to, &val, 2); } while(0)
  144. #define _msgpack_store32(to, num) \
  145. do { uint32_t val = _msgpack_be32(num); memcpy(to, &val, 4); } while(0)
  146. #define _msgpack_store64(to, num) \
  147. do { uint64_t val = _msgpack_be64(num); memcpy(to, &val, 8); } while(0)
  148. /*
  149. #define _msgpack_load16(cast, from) \
  150. ({ cast val; memcpy(&val, (char*)from, 2); _msgpack_be16(val); })
  151. #define _msgpack_load32(cast, from) \
  152. ({ cast val; memcpy(&val, (char*)from, 4); _msgpack_be32(val); })
  153. #define _msgpack_load64(cast, from) \
  154. ({ cast val; memcpy(&val, (char*)from, 8); _msgpack_be64(val); })
  155. */
  156. #if !defined(__cplusplus) && defined(_MSC_VER)
  157. # if !defined(FALSE)
  158. # define FALSE (0)
  159. # endif
  160. # if !defined(TRUE)
  161. # define TRUE (!FALSE)
  162. # endif
  163. # if _MSC_VER >= 1800
  164. # include <stdbool.h>
  165. # else
  166. # define bool int
  167. # define true TRUE
  168. # define false FALSE
  169. # endif
  170. # define inline __inline
  171. #endif
  172. #ifdef __APPLE__
  173. # include <TargetConditionals.h>
  174. #endif
  175. #endif /* msgpack/sysdep.h */