asn_system.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. /*
  2. * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved.
  3. * Redistribution and modifications are permitted subject to BSD license.
  4. */
  5. /*
  6. * Miscellaneous system-dependent types.
  7. */
  8. #ifndef ASN_SYSTEM_H
  9. #define ASN_SYSTEM_H
  10. #ifdef HAVE_CONFIG_H
  11. #include "config.h"
  12. #endif
  13. #ifndef _DEFAULT_SOURCE
  14. #define _DEFAULT_SOURCE 1
  15. #endif
  16. #ifndef _BSD_SOURCE
  17. #define _BSD_SOURCE /* for snprintf() on some linux systems */
  18. #endif
  19. #include <stdio.h> /* For snprintf(3) */
  20. #include <stdlib.h> /* For *alloc(3) */
  21. #include <string.h> /* For memcpy(3) */
  22. #include <sys/types.h> /* For size_t */
  23. #include <limits.h> /* For LONG_MAX */
  24. #include <stdarg.h> /* For va_start */
  25. #include <stddef.h> /* for offsetof and ptrdiff_t */
  26. #ifdef _WIN32
  27. #include <malloc.h>
  28. #define snprintf _snprintf
  29. #define vsnprintf _vsnprintf
  30. /* To avoid linking with ws2_32.lib, here's the definition of ntohl() */
  31. #define sys_ntohl(l) ((((l) << 24) & 0xff000000) \
  32. | (((l) << 8) & 0xff0000) \
  33. | (((l) >> 8) & 0xff00) \
  34. | ((l >> 24) & 0xff))
  35. #ifdef _MSC_VER /* MSVS.Net */
  36. #ifndef __cplusplus
  37. #define inline __inline
  38. #endif
  39. #ifndef ASSUMESTDTYPES /* Standard types have been defined elsewhere */
  40. #define ssize_t SSIZE_T
  41. #if _MSC_VER < 1600
  42. typedef char int8_t;
  43. typedef short int16_t;
  44. typedef int int32_t;
  45. typedef unsigned char uint8_t;
  46. typedef unsigned short uint16_t;
  47. typedef unsigned int uint32_t;
  48. #else /* _MSC_VER >= 1600 */
  49. #include <stdint.h>
  50. #endif /* _MSC_VER < 1600 */
  51. #endif /* ASSUMESTDTYPES */
  52. #define WIN32_LEAN_AND_MEAN
  53. #include <windows.h>
  54. #include <float.h>
  55. #define isnan _isnan
  56. #define finite _finite
  57. #define copysign _copysign
  58. #define ilogb _logb
  59. #else /* !_MSC_VER */
  60. #include <stdint.h>
  61. #endif /* _MSC_VER */
  62. #else /* !_WIN32 */
  63. #if defined(__vxworks)
  64. #include <types/vxTypes.h>
  65. #else /* !defined(__vxworks) */
  66. #include <inttypes.h> /* C99 specifies this file */
  67. #include <netinet/in.h> /* for ntohl() */
  68. #define sys_ntohl(foo) ntohl(foo)
  69. #endif /* defined(__vxworks) */
  70. #endif /* _WIN32 */
  71. #if __GNUC__ >= 3 || defined(__clang__)
  72. #define CC_ATTRIBUTE(attr) __attribute__((attr))
  73. #else
  74. #define CC_ATTRIBUTE(attr)
  75. #endif
  76. #define CC_PRINTFLIKE(fmt, var) CC_ATTRIBUTE(format(printf, fmt, var))
  77. #define CC_NOTUSED CC_ATTRIBUTE(unused)
  78. #ifndef CC_ATTR_NO_SANITIZE
  79. #define CC_ATTR_NO_SANITIZE(what) CC_ATTRIBUTE(no_sanitize(what))
  80. #endif
  81. /* Figure out if thread safety is requested */
  82. #if !defined(ASN_THREAD_SAFE) && (defined(THREAD_SAFE) || defined(_REENTRANT))
  83. #define ASN_THREAD_SAFE
  84. #endif /* Thread safety */
  85. #ifndef offsetof /* If not defined by <stddef.h> */
  86. #define offsetof(s, m) ((ptrdiff_t)&(((s *)0)->m) - (ptrdiff_t)((s *)0))
  87. #endif /* offsetof */
  88. #ifndef MIN /* Suitable for comparing primitive types (integers) */
  89. #if defined(__GNUC__)
  90. #define MIN(a,b) ({ __typeof a _a = a; __typeof b _b = b; \
  91. ((_a)<(_b)?(_a):(_b)); })
  92. #else /* !__GNUC__ */
  93. #define MIN(a,b) ((a)<(b)?(a):(b)) /* Unsafe variant */
  94. #endif /* __GNUC__ */
  95. #endif /* MIN */
  96. #if __STDC_VERSION__ >= 199901L
  97. #ifndef SIZE_MAX
  98. #define SIZE_MAX ((~((size_t)0)) >> 1)
  99. #endif
  100. #ifndef RSIZE_MAX /* C11, Annex K */
  101. #define RSIZE_MAX (SIZE_MAX >> 1)
  102. #endif
  103. #ifndef RSSIZE_MAX /* Halve signed size even further than unsigned */
  104. #define RSSIZE_MAX ((ssize_t)(RSIZE_MAX >> 1))
  105. #endif
  106. #else /* Old compiler */
  107. #undef SIZE_MAX
  108. #undef RSIZE_MAX
  109. #undef RSSIZE_MAX
  110. #define SIZE_MAX ((~((size_t)0)) >> 1)
  111. #define RSIZE_MAX (SIZE_MAX >> 1)
  112. #define RSSIZE_MAX ((ssize_t)(RSIZE_MAX >> 1))
  113. #endif
  114. #if __STDC_VERSION__ >= 199901L
  115. #define ASN_PRI_SIZE "zu"
  116. #define ASN_PRI_SSIZE "zd"
  117. #define ASN_PRIuMAX PRIuMAX
  118. #define ASN_PRIdMAX PRIdMAX
  119. #else
  120. #define ASN_PRI_SIZE "lu"
  121. #define ASN_PRI_SSIZE "ld"
  122. #if LLONG_MAX > LONG_MAX
  123. #define ASN_PRIuMAX "llu"
  124. #define ASN_PRIdMAX "lld"
  125. #else
  126. #define ASN_PRIuMAX "lu"
  127. #define ASN_PRIdMAX "ld"
  128. #endif
  129. #endif
  130. #endif /* ASN_SYSTEM_H */