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

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef _LINUX_BYTEORDER_SWAB_H
  2. #define _LINUX_BYTEORDER_SWAB_H
  3. /*
  4.  * linux/byteorder/swab.h
  5.  * Byte-swapping, independently from CPU endianness
  6.  * swabXX[ps]?(foo)
  7.  *
  8.  * Francois-Rene Rideau <fare@tunes.org> 19971205
  9.  *    separated swab functions from cpu_to_XX,
  10.  *    to clean up support for bizarre-endian architectures.
  11.  *
  12.  * See asm-i386/byteorder.h and suches for examples of how to provide
  13.  * architecture-dependent optimized versions
  14.  *
  15.  */
  16. /* casts are necessary for constants, because we never know how for sure
  17.  * how U/UL/ULL map to __u16, __u32, __u64. At least not in a portable way.
  18.  */
  19. #define ___swab16(x) 
  20. ({ 
  21. __u16 __x = (x); 
  22. ((__u16)( 
  23. (((__u16)(__x) & (__u16)0x00ffU) << 8) | 
  24. (((__u16)(__x) & (__u16)0xff00U) >> 8) )); 
  25. })
  26. #define ___swab24(x) 
  27. ({ 
  28. __u32 __x = (x); 
  29. ((__u32)( 
  30. ((__x & (__u32)0x000000ffUL) << 16) | 
  31.  (__x & (__u32)0x0000ff00UL)        | 
  32. ((__x & (__u32)0x00ff0000UL) >> 16) )); 
  33. })
  34. #define ___swab32(x) 
  35. ({ 
  36. __u32 __x = (x); 
  37. ((__u32)( 
  38. (((__u32)(__x) & (__u32)0x000000ffUL) << 24) | 
  39. (((__u32)(__x) & (__u32)0x0000ff00UL) <<  8) | 
  40. (((__u32)(__x) & (__u32)0x00ff0000UL) >>  8) | 
  41. (((__u32)(__x) & (__u32)0xff000000UL) >> 24) )); 
  42. })
  43. #define ___swab64(x) 
  44. ({ 
  45. __u64 __x = (x); 
  46. ((__u64)( 
  47. (__u64)(((__u64)(__x) & (__u64)0x00000000000000ffULL) << 56) | 
  48. (__u64)(((__u64)(__x) & (__u64)0x000000000000ff00ULL) << 40) | 
  49. (__u64)(((__u64)(__x) & (__u64)0x0000000000ff0000ULL) << 24) | 
  50. (__u64)(((__u64)(__x) & (__u64)0x00000000ff000000ULL) <<  8) | 
  51.         (__u64)(((__u64)(__x) & (__u64)0x000000ff00000000ULL) >>  8) | 
  52. (__u64)(((__u64)(__x) & (__u64)0x0000ff0000000000ULL) >> 24) | 
  53. (__u64)(((__u64)(__x) & (__u64)0x00ff000000000000ULL) >> 40) | 
  54. (__u64)(((__u64)(__x) & (__u64)0xff00000000000000ULL) >> 56) )); 
  55. })
  56. #define ___constant_swab16(x) 
  57. ((__u16)( 
  58. (((__u16)(x) & (__u16)0x00ffU) << 8) | 
  59. (((__u16)(x) & (__u16)0xff00U) >> 8) ))
  60. #define ___constant_swab24(x) 
  61. ((__u32)( 
  62. (((__u32)(x) & (__u32)0x000000ffU) << 16) | 
  63. (((__u32)(x) & (__u32)0x0000ff00U)   | 
  64. (((__u32)(x) & (__u32)0x00ff0000U) >> 16) ))
  65. #define ___constant_swab32(x) 
  66. ((__u32)( 
  67. (((__u32)(x) & (__u32)0x000000ffUL) << 24) | 
  68. (((__u32)(x) & (__u32)0x0000ff00UL) <<  8) | 
  69. (((__u32)(x) & (__u32)0x00ff0000UL) >>  8) | 
  70. (((__u32)(x) & (__u32)0xff000000UL) >> 24) ))
  71. #define ___constant_swab64(x) 
  72. ((__u64)( 
  73. (__u64)(((__u64)(x) & (__u64)0x00000000000000ffULL) << 56) | 
  74. (__u64)(((__u64)(x) & (__u64)0x000000000000ff00ULL) << 40) | 
  75. (__u64)(((__u64)(x) & (__u64)0x0000000000ff0000ULL) << 24) | 
  76. (__u64)(((__u64)(x) & (__u64)0x00000000ff000000ULL) <<  8) | 
  77.         (__u64)(((__u64)(x) & (__u64)0x000000ff00000000ULL) >>  8) | 
  78. (__u64)(((__u64)(x) & (__u64)0x0000ff0000000000ULL) >> 24) | 
  79. (__u64)(((__u64)(x) & (__u64)0x00ff000000000000ULL) >> 40) | 
  80. (__u64)(((__u64)(x) & (__u64)0xff00000000000000ULL) >> 56) ))
  81. /*
  82.  * provide defaults when no architecture-specific optimization is detected
  83.  */
  84. #ifndef __arch__swab16
  85. #  define __arch__swab16(x) ({ __u16 __tmp = (x) ; ___swab16(__tmp); })
  86. #endif
  87. #ifndef __arch__swab24
  88. #  define __arch__swab24(x) ({ __u32 __tmp = (x) ; ___swab24(__tmp); })
  89. #endif
  90. #ifndef __arch__swab32
  91. #  define __arch__swab32(x) ({ __u32 __tmp = (x) ; ___swab32(__tmp); })
  92. #endif
  93. #ifndef __arch__swab64
  94. #  define __arch__swab64(x) ({ __u64 __tmp = (x) ; ___swab64(__tmp); })
  95. #endif
  96. #ifndef __arch__swab16p
  97. #  define __arch__swab16p(x) __arch__swab16(*(x))
  98. #endif
  99. #ifndef __arch__swab24p
  100. #  define __arch__swab24p(x) __arch__swab24(*(x))
  101. #endif
  102. #ifndef __arch__swab32p
  103. #  define __arch__swab32p(x) __arch__swab32(*(x))
  104. #endif
  105. #ifndef __arch__swab64p
  106. #  define __arch__swab64p(x) __arch__swab64(*(x))
  107. #endif
  108. #ifndef __arch__swab16s
  109. #  define __arch__swab16s(x) do { *(x) = __arch__swab16p((x)); } while (0)
  110. #endif
  111. #ifndef __arch__swab24s
  112. #  define __arch__swab24s(x) do { *(x) = __arch__swab24p((x)); } while (0)
  113. #endif
  114. #ifndef __arch__swab32s
  115. #  define __arch__swab32s(x) do { *(x) = __arch__swab32p((x)); } while (0)
  116. #endif
  117. #ifndef __arch__swab64s
  118. #  define __arch__swab64s(x) do { *(x) = __arch__swab64p((x)); } while (0)
  119. #endif
  120. /*
  121.  * Allow constant folding
  122.  */
  123. #if defined(__GNUC__) && (__GNUC__ >= 2) && defined(__OPTIMIZE__)
  124. #  define __swab16(x) 
  125. (__builtin_constant_p((__u16)(x)) ? 
  126.  ___swab16((x)) : 
  127.  __fswab16((x)))
  128. #  define __swab24(x) 
  129. (__builtin_constant_p((__u32)(x)) ? 
  130.  ___swab24((x)) : 
  131.  __fswab24((x)))
  132. #  define __swab32(x) 
  133. (__builtin_constant_p((__u32)(x)) ? 
  134.  ___swab32((x)) : 
  135.  __fswab32((x)))
  136. #  define __swab64(x) 
  137. (__builtin_constant_p((__u64)(x)) ? 
  138.  ___swab64((x)) : 
  139.  __fswab64((x)))
  140. #else
  141. #  define __swab16(x) __fswab16(x)
  142. #  define __swab24(x) __fswab24(x)
  143. #  define __swab32(x) __fswab32(x)
  144. #  define __swab64(x) __fswab64(x)
  145. #endif /* OPTIMIZE */
  146. static __inline__ __const__ __u16 __fswab16(__u16 x)
  147. {
  148. return __arch__swab16(x);
  149. }
  150. static __inline__ __u16 __swab16p(__u16 *x)
  151. {
  152. return __arch__swab16p(x);
  153. }
  154. static __inline__ void __swab16s(__u16 *addr)
  155. {
  156. __arch__swab16s(addr);
  157. }
  158. static __inline__ __const__ __u32 __fswab24(__u32 x)
  159. {
  160. return __arch__swab24(x);
  161. }
  162. static __inline__ __u32 __swab24p(__u32 *x)
  163. {
  164. return __arch__swab24p(x);
  165. }
  166. static __inline__ void __swab24s(__u32 *addr)
  167. {
  168. __arch__swab24s(addr);
  169. }
  170. static __inline__ __const__ __u32 __fswab32(__u32 x)
  171. {
  172. return __arch__swab32(x);
  173. }
  174. static __inline__ __u32 __swab32p(__u32 *x)
  175. {
  176. return __arch__swab32p(x);
  177. }
  178. static __inline__ void __swab32s(__u32 *addr)
  179. {
  180. __arch__swab32s(addr);
  181. }
  182. #ifdef __BYTEORDER_HAS_U64__
  183. static __inline__ __const__ __u64 __fswab64(__u64 x)
  184. {
  185. #  ifdef __SWAB_64_THRU_32__
  186. __u32 h = x >> 32;
  187.         __u32 l = x & ((1ULL<<32)-1);
  188.         return (((__u64)__swab32(l)) << 32) | ((__u64)(__swab32(h)));
  189. #  else
  190. return __arch__swab64(x);
  191. #  endif
  192. }
  193. static __inline__ __u64 __swab64p(__u64 *x)
  194. {
  195. return __arch__swab64p(x);
  196. }
  197. static __inline__ void __swab64s(__u64 *addr)
  198. {
  199. __arch__swab64s(addr);
  200. }
  201. #endif /* __BYTEORDER_HAS_U64__ */
  202. #if defined(__KERNEL__)
  203. #define swab16 __swab16
  204. #define swab24 __swab24
  205. #define swab32 __swab32
  206. #define swab64 __swab64
  207. #define swab16p __swab16p
  208. #define swab24p __swab24p
  209. #define swab32p __swab32p
  210. #define swab64p __swab64p
  211. #define swab16s __swab16s
  212. #define swab24s __swab24s
  213. #define swab32s __swab32s
  214. #define swab64s __swab64s
  215. #endif
  216. #endif /* _LINUX_BYTEORDER_SWAB_H */