endian_test.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. /*
  2. * Copyright (C) 2008 iptelorg GmbH
  3. *
  4. * Permission to use, copy, modify, and distribute this software for any
  5. * purpose with or without fee is hereby granted, provided that the above
  6. * copyright notice and this permission notice appear in all copies.
  7. *
  8. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  9. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15. */
  16. /*
  17. * endianness.h tests
  18. * compile/run with:
  19. * gcc -Wall endian_test.c ../endianness.c -o endian_test; ./endian_test
  20. */
  21. /*
  22. * History:
  23. * --------
  24. * 2008-06-13 created by andrei
  25. */
  26. /*
  27. *
  28. * Macro names:
  29. * linux: __BYTE_ORDER == __LITTLE_ENDIAN | __BIG_ENDIAN
  30. * BYTE_ORDER == LITTLE_ENDIAN | BIG_ENDIAN
  31. * bsd: _BYTE_ORDER == _LITTLE_ENDIAN | _BIG_ENDIAN
  32. * BYTE_ORDER == LITTLE_ENDIAN | BIG_ENDIAN
  33. * solaris: _LITTLE_ENDIAN | _BIG_ENDIAN
  34. *
  35. * Note: BIG_ENDIAN, LITTLE_ENDIAN, _BIG_ENDIAN, _LITTLE_ENDIAN cannot be
  36. * used always, some OSes define both of them for BYTE_ORDER use
  37. * (e.g. linux defines both BIG_ENDIAN & LITTLE_ENDIAN, bsds define
  38. * _BIG_ENDIAN, _LITTLE_ENDIAN, BIG_ENDIAN, LITTLE_ENDIAN)
  39. *
  40. * is sys/param.h universal ?
  41. */
  42. #include <stdio.h>
  43. #include "../endianness.h"
  44. /*
  45. * Tested:
  46. * linux: y
  47. * freebsd: y
  48. * openbsd:
  49. * netbsd:
  50. * solaris: y
  51. * darwin:
  52. * cygwin:
  53. *
  54. * Header files:
  55. * linux: <endian.h> , <sys/param.h>
  56. * bsd: <sys/param.h> or <sys/endian.h>
  57. * solaris: <sys/param.h>
  58. * openbsd
  59. * netbsd
  60. * solaris
  61. * cywin
  62. */
  63. /*
  64. *
  65. * Macro names:
  66. * linux: __BYTE_ORDER == __LITTLE_ENDIAN | __BIG_ENDIAN
  67. * BYTE_ORDER == LITTLE_ENDIAN | BIG_ENDIAN
  68. * bsd: _BYTE_ORDER == _LITTLE_ENDIAN | _BIG_ENDIAN
  69. * BYTE_ORDER == LITTLE_ENDIAN | BIG_ENDIAN
  70. * solaris: _LITTLE_ENDIAN | _BIG_ENDIAN
  71. *
  72. * Note: BIG_ENDIAN, LITTLE_ENDIAN, _BIG_ENDIAN, _LITTLE_ENDIAN cannot be
  73. * used always, some OSes define both of them for BYTE_ORDER use
  74. * (e.g. linux defines both BIG_ENDIAN & LITTLE_ENDIAN, bsds define
  75. * _BIG_ENDIAN, _LITTLE_ENDIAN, BIG_ENDIAN, LITTLE_ENDIAN)
  76. *
  77. * is sys/param.h universal ?
  78. */
  79. /* test only */
  80. #if defined __BYTE_ORDER && defined __LITTLE_ENDIAN
  81. #if __BYTE_ORDER == __LITTLE_ENDIAN
  82. #warning little endian (via __BYTE_ORDER)
  83. #define __BYTE_ORDER_FOUND
  84. #endif
  85. #endif
  86. #if defined __BYTE_ORDER && defined __BIG_ENDIAN
  87. #if __BYTE_ORDER == __BIG_ENDIAN
  88. #warning big endian (via __BYTE_ORDER)
  89. #define __BYTE_ORDER_FOUND
  90. #endif
  91. #endif
  92. #if defined __BYTE_ORDER && !defined __BYTE_ORDER_FOUND
  93. #error __BYTE_ORDER defined, but w/ a strange value
  94. #endif
  95. #if defined _BYTE_ORDER && defined _LITTLE_ENDIAN
  96. #if _BYTE_ORDER == _LITTLE_ENDIAN
  97. #warning little endian (via _BYTE_ORDER)
  98. #define _BYTE_ORDER_FOUND
  99. #endif
  100. #endif
  101. #if defined _BYTE_ORDER && defined _BIG_ENDIAN
  102. #if _BYTE_ORDER == _BIG_ENDIAN
  103. #warning big endian (via _BYTE_ORDER)
  104. #define _BYTE_ORDER_FOUND
  105. #endif
  106. #endif
  107. #if defined _BYTE_ORDER && !defined _BYTE_ORDER_FOUND
  108. #error _BYTE_ORDER defined, but w/ a strange value
  109. #endif
  110. #if defined BYTE_ORDER && defined LITTLE_ENDIAN
  111. #if BYTE_ORDER == LITTLE_ENDIAN
  112. #warning little endian (via BYTE_ORDER)
  113. #define BYTE_ORDER_FOUND
  114. #endif
  115. #endif
  116. #if defined BYTE_ORDER && defined BIG_ENDIAN
  117. #if BYTE_ORDER == BIG_ENDIAN
  118. #warning big endian (via BYTE_ORDER)
  119. #define BYTE_ORDER_FOUND
  120. #endif
  121. #endif
  122. #if defined BYTE_ORDER && !defined BYTE_ORDER_FOUND
  123. #error BYTE_ORDER defined, but w/ a strange value
  124. #endif
  125. #if defined _LITTLE_ENDIAN
  126. #warning _LITTLE_ENDIAN defined
  127. #endif
  128. #if defined _BIG_ENDIAN
  129. #warning _BIG_ENDIAN defined
  130. #endif
  131. #if defined LITTLE_ENDIAN
  132. #warning LITTLE_ENDIAN defined
  133. #endif
  134. #if defined BIG_ENDIAN
  135. #warning BIG_ENDIAN defined
  136. #endif
  137. int main(int argc, char** argv)
  138. {
  139. int ret;
  140. ret=0;
  141. if (endianness_sanity_check()!=0){
  142. printf("ERROR: sanity checks failed\n");
  143. ret=-1;
  144. }
  145. if (is_little_endian()){
  146. #ifdef __IS_LITTLE_ENDIAN
  147. printf("OK: little endian confirmed\n");
  148. #else
  149. printf("ERROR: macro claims BIG ENDIAN, but it's little\n");
  150. return -1;
  151. #endif
  152. }else{
  153. #ifdef __IS_BIG_ENDIAN
  154. printf("OK: big endian confirmed\n");
  155. #else
  156. printf("ERROR: macro claims LITTLE ENDIAN, but it's big\n");
  157. return -1;
  158. #endif
  159. }
  160. return ret;
  161. }