endian.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:11k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* -*- linux-c -*- */
  2. /*
  3.  * Copyright (C) 2001 By Joachim Martillo, Telford Tools, Inc.
  4.  *
  5.  * This program is free software; you can redistribute it and/or
  6.  * modify it under the terms of the GNU General Public License
  7.  * as published by the Free Software Foundation; either version
  8.  * 2 of the License, or (at your option) any later version.
  9.  *
  10.  */
  11. /****************************************************/
  12. /****************************************************/
  13. /*     Begin header file "endian.h"     */
  14. /****************************************************/
  15. /****************************************************/
  16. #if !defined(_ENDIAN_HP_)
  17. #define _ENDIAN_HP_
  18. /****************************************************/
  19. /*     header files     */
  20. /****************************************************/
  21. /****************************************************/
  22. /*  let's see if we know this is a big endian     */
  23. /****************************************************/
  24. #ifndef INLINE
  25. #define INLINE inline
  26. #endif
  27. #define fnm_assert_stmt(a)
  28. #ifndef BYTE_ORDER
  29. #if defined(AMD29K) || defined(mc68000)
  30. #define BIG_ENDIAN     4321
  31. #endif
  32. /****************************************************/
  33. /*  global macro functions handling endian issues   */
  34. /****************************************************/
  35. #if !defined(BIG_ENDIAN) && !defined(LITTLE_ENDIAN)
  36. #define LITTLE_ENDIAN 1234
  37. #endif
  38. #endif
  39. #define fnm_get_i_big_endian(p_uc, x)     fnm_get_ui_big_endian(p_uc, x)
  40. #define fnm_get_s_big_endian(p_uc, x)     fnm_get_us_big_endian(p_uc, x)
  41. #define fnm_get_i_little_endian(p_uc, x)    fnm_get_ui_little_endian(p_uc, x)
  42. #define fnm_get_s_little_endian(p_uc, x)    fnm_get_us_little_endian(p_uc, x)
  43. #define fnm_get_ui_big_endian(p_uc, x)     
  44. {     
  45. (x) = (((unsigned int)(*(p_uc)++)) << 24);
  46. (x) += (((unsigned int)(*(p_uc)++)) << 16);
  47. (x) += (((unsigned int)(*(p_uc)++)) << 8);
  48. (x) += ((unsigned int)(*(p_uc)++));
  49. }
  50. #define fnm_get_us_big_endian(p_uc, x)
  51. {
  52. (x) = (((unsigned short)(*(p_uc)++)) << 8);
  53. (x) += ((unsigned short)(*(p_uc)++));
  54. }
  55. #define fnm_get_ui_little_endian(p_uc, x)
  56. {
  57. (x) = ((unsigned int)(*(p_uc)++));
  58. (x) += (((unsigned int)(*(p_uc)++)) << 8);
  59. (x) += (((unsigned int)(*(p_uc)++)) << 16);
  60. (x) += (((unsigned int)(*(p_uc)++)) << 24);
  61. }
  62. #define fnm_get_us_little_endian(p_uc, x)
  63. {
  64. (x) = ((unsigned short)(*(p_uc)++));
  65. (x) += (((unsigned short)(*(p_uc)++)) << 8);
  66. }
  67. #define fnm_store_i_big_endian(p_uc, x) fnm_store_ui_big_endian(p_uc, x)
  68. #define fnm_store_s_big_endian(p_uc, x) fnm_store_us_big_endian(p_uc, x)
  69. #define fnm_store_i_little_endian(p_uc, x)  fnm_store_ui_little_endian(p_uc, x)
  70. #define fnm_store_s_little_endian(p_uc, x)  fnm_store_us_little_endian(p_uc, x)
  71. #define fnm_store_ui_big_endian(p_uc, x)
  72. {
  73. *(p_uc)++ = (((unsigned int)(x)) >> 24);
  74. *(p_uc)++ = (((unsigned int)(x)) >> 16);
  75. *(p_uc)++ = (((unsigned int)(x)) >> 8);
  76. *(p_uc)++ = ((unsigned int)(x));
  77. }
  78. #define fnm_store_us_big_endian(p_uc, x)
  79. {
  80. *(p_uc)++ = (unsigned char) (((unsigned short)(x)) >> 8);
  81. *(p_uc)++ = (unsigned char) ((unsigned short)(x));
  82. }
  83. #define fnm_store_ui_little_endian(p_uc, x)
  84. {
  85. *(p_uc)++ = ((unsigned int)(x));
  86. *(p_uc)++ = (((unsigned int)(x)) >> 8);
  87. *(p_uc)++ = (((unsigned int)(x)) >> 16);
  88. *(p_uc)++ = (((unsigned int)(x)) >> 24);
  89. }
  90. #define fnm_store_us_little_endian(p_uc, x)
  91. {
  92. *(p_uc)++ = ((unsigned short)(x));
  93. *(p_uc)++ = (((unsigned short)(x)) >> 8);
  94. }
  95. /* for now lets always use the macroes instead of the inline procedures
  96.    so that we are sure they work */
  97. #if 1 || defined(AMD29K)
  98. #define fnm_convert_us_endian(x)
  99. ((unsigned short)((((unsigned short)(x)) << 8) + (((unsigned short)(x)) >> 8)))
  100. #define fnm_convert_ui_endian(x)
  101. ((unsigned int)((((unsigned int)(x)) >> 24) + ((((unsigned int)(x)) & 0x00ff0000) >> 8) +
  102.  ((((unsigned int)(x)) & 0x0000ff00) << 8) + (((unsigned int)(x)) << 24)))
  103. #define fnm_make_ui_from_2_us(us_high_part, us_low_part)
  104. ((unsigned int)((((unsigned int)(us_high_part)) << 16) + ((unsigned short)(us_low_part))))
  105. #define fnm_make_ui_from_4_uc(p1, p2, p3, p4)
  106. ((unsigned int)(((((((unsigned int)((t_uc)p1) << 8) + ((t_uc)p2)) << 8)
  107. + ((t_uc)p3)) << 8) + ((t_uc)p4)))
  108. #define fnm_make_us_from_2_uc(uc_high_part, uc_low_part)
  109. ((unsigned short)((((unsigned short)(uc_high_part)) << 8) + ((t_uc)(uc_low_part))))
  110. #else
  111. INLINE unsigned short fni_convert_us_endian(const unsigned short x)
  112. {
  113. return((x << 8) + (x >> 8));
  114. }
  115. INLINE unsigned int fni_convert_ui_endian(const unsigned int x)
  116. {
  117. return((x >> 24) + ((x & 0x00ff0000) >> 8)
  118.    + ((x & 0x0000ff00) << 8) + (x << 24));
  119. }
  120. INLINE unsigned int fni_make_ui_from_2_us(const unsigned short us_high_part,
  121.   const unsigned short us_low_part)
  122. {
  123. return((((unsigned int)us_high_part) << 16) + us_low_part);
  124. }
  125. INLINE unsigned int fni_make_ui_from_4_uc(const unsigned char p1, const unsigned char p2,
  126.   const unsigned char p3, const unsigned char p4)
  127. {
  128. return(((((((unsigned int)p1 << 8) + p2) << 8) + p3) << 8) + p4);
  129. }
  130. INLINE unsigned short fni_make_us_from_2_uc(const unsigned char uc_high_part,
  131.   const unsigned char uc_low_part)
  132. {
  133. return((((unsigned short)uc_high_part) << 8) + uc_low_part);
  134. }
  135. #define fnm_convert_us_endian(x) fni_convert_us_endian(x)
  136. #define fnm_convert_ui_endian(x) fni_convert_ui_endian(x)
  137. #define fnm_make_ui_from_2_us(us_high_part, us_low_part)
  138. fni_make_ui_from_2_us(us_high_part, us_low_part)
  139. #define fnm_make_ui_from_4_uc(p1, p2, p3, p4)
  140. fni_make_ui_from_4_uc(p1, p2, p3, p4)
  141. #define fnm_make_us_from_2_uc(uc_high_part, uc_low_part)
  142. fni_make_us_from_2_uc(uc_high_part, uc_low_part)
  143. #endif
  144. #define fnm_convert_s_endian(x) ((short)(fnm_convert_us_endian(x)))
  145. #define fnm_convert_i_endian(x) ((int)(fnm_convert_ui_endian(x)))
  146. #if defined(BIG_ENDIAN)
  147. #define fnm_convert_us_big_endian(x) ((unsigned short)(x))
  148. #define fnm_convert_s_big_endian(x) ((short)(x))
  149. #define fnm_convert_ui_big_endian(x) ((unsigned int)(x))
  150. #define fnm_convert_i_big_endian(x) ((int)(x))
  151. #define fnm_convert_us_little_endian(x) fnm_convert_us_endian(x)
  152. #define fnm_convert_s_little_endian(x) fnm_convert_s_endian(x)
  153. #define fnm_convert_ui_little_endian(x) fnm_convert_ui_endian(x)
  154. #define fnm_convert_i_little_endian(x) fnm_convert_i_endian(x)
  155. #else
  156. #define fnm_convert_us_big_endian(x) fnm_convert_us_endian(x)
  157. #define fnm_convert_s_big_endian(x) fnm_convert_s_endian(x)
  158. #define fnm_convert_ui_big_endian(x) fnm_convert_ui_endian(x)
  159. #define fnm_convert_i_big_endian(x) fnm_convert_i_endian(x)
  160. #define fnm_convert_us_little_endian(x) ((unsigned short)(x))
  161. #define fnm_convert_s_little_endian(x) ((short)(x))
  162. #define fnm_convert_ui_little_endian(x) ((unsigned int)(x))
  163. #define fnm_convert_i_little_endian(x) ((int)(x))
  164. #endif
  165. /****************************************************/
  166. /*  test macro functions handling endian issues */
  167. /****************************************************/
  168. #if defined(NDEBUG)
  169. #define fnm_test_definitions()
  170. #else
  171. #define fnm_test_definitions()
  172. {
  173. union
  174. {
  175. t_c a_c[4];
  176. unsigned short a_us[2];
  177. unsigned int ul;
  178. } t1 = { "x01x02x03x04" };
  179. unsigned char *p;
  180. unsigned short us_one, us_two;
  181. unsigned int ul_one;
  182. fnm_assert_stmt((t1.a_c[0] == 1) && (t1.a_c[1] == 2) &&
  183. (t1.a_c[2] == 3) && (t1.a_c[3] == 4));
  184. fnm_assert_stmt(fnm_convert_ui_big_endian(t1.ul) == 0x01020304);
  185. fnm_assert_stmt(fnm_convert_ui_little_endian(t1.ul) == 0x04030201);
  186. fnm_assert_stmt(fnm_convert_us_big_endian(t1.a_us[0]) == 0x0102);
  187. fnm_assert_stmt(fnm_convert_us_little_endian(t1.a_us[0]) == 0x0201);
  188. p = (unsigned char*)(&t1);
  189. fnm_get_us_little_endian(p, us_one);
  190. fnm_get_us_little_endian(p, us_two);
  191. fnm_assert_stmt((us_one == 0x0201) && (us_two == 0x0403));
  192. fnm_assert_stmt((p-4) == ((unsigned char*)(&t1)));
  193. p = (unsigned char*)(&t1);
  194. fnm_get_us_big_endian(p, us_one);
  195. fnm_get_us_big_endian(p, us_two);
  196. fnm_assert_stmt((us_one == 0x0102) && (us_two == 0x0304));
  197. fnm_assert_stmt((p-4) == ((unsigned char*)(&t1)));
  198. p = (unsigned char*)(&t1);
  199. fnm_get_ui_little_endian(p, ul_one);
  200. fnm_assert_stmt(ul_one == 0x04030201);
  201. fnm_assert_stmt((p-4) == ((unsigned char*)(&t1)));
  202. p = (unsigned char*)(&t1);
  203. fnm_get_ui_big_endian(p, ul_one);
  204. fnm_assert_stmt(ul_one == 0x01020304);
  205. fnm_assert_stmt((p-4) == ((unsigned char*)(&t1)));
  206. p = (unsigned char*)(&t1);
  207. fnm_store_us_little_endian(p, 0x1234);
  208. fnm_store_us_little_endian(p, 0x5678);
  209. fnm_assert_stmt((p-4) == ((unsigned char*)(&t1)));
  210. p = (unsigned char*)(&t1);
  211. fnm_get_us_little_endian(p, us_one);
  212. fnm_get_us_little_endian(p, us_two);
  213. fnm_assert_stmt((us_one == 0x1234) && (us_two == 0x5678));
  214. fnm_assert_stmt((p-4) == ((unsigned char*)(&t1)));
  215. p = (unsigned char*)(&t1);
  216. fnm_store_us_big_endian(p, 0x1234);
  217. fnm_store_us_big_endian(p, 0x5678);
  218. fnm_assert_stmt((p-4) == ((unsigned char*)(&t1)));
  219. p = (unsigned char*)(&t1);
  220. fnm_get_us_big_endian(p, us_one);
  221. fnm_get_us_big_endian(p, us_two);
  222. fnm_assert_stmt((us_one == 0x1234) && (us_two == 0x5678));
  223. fnm_assert_stmt((p-4) == ((unsigned char*)(&t1)));
  224. p = (unsigned char*)(&t1);
  225. fnm_store_ui_little_endian(p, 0x12345678);
  226. fnm_assert_stmt((p-4) == ((unsigned char*)(&t1)));
  227. p = (unsigned char*)(&t1);
  228. fnm_get_ui_little_endian(p, ul_one);
  229. fnm_assert_stmt(ul_one == 0x12345678);
  230. fnm_assert_stmt((p-4) == ((unsigned char*)(&t1)));
  231. p = (unsigned char*)(&t1);
  232. fnm_store_ui_big_endian(p, 0x12345678);
  233. fnm_assert_stmt((p-4) == ((unsigned char*)(&t1)));
  234. p = (unsigned char*)(&t1);
  235. fnm_get_ui_big_endian(p, ul_one);
  236. fnm_assert_stmt(ul_one == 0x12345678);
  237. fnm_assert_stmt((p-4) == ((unsigned char*)(&t1)));
  238. fnm_assert_stmt(fnm_make_ui_from_2_us(1, 2) == 0x00010002);
  239. fnm_assert_stmt(fnm_make_ui_from_4_uc(1, 2, 3, 4) == 0x01020304);
  240. fnm_assert_stmt(fnm_make_us_from_2_uc(1, 2) == 0x0102);
  241. }
  242. #endif
  243. #endif
  244. /****************************************************/
  245. /****************************************************/
  246. /* End header file "endian.h" */
  247. /****************************************************/
  248. /****************************************************/