home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2 / Openstep-4.2-Intel-Developer.iso / NextLibrary / Frameworks / Foundation.framework / Versions / B / Headers / NSByteOrder.h < prev    next >
Encoding:
C/C++ Source or Header  |  1997-01-15  |  9.8 KB  |  399 lines

  1. /*    NSByteOrder.h
  2.     Definitions for low-level byte swapping
  3.     Copyright 1995-1996, NeXT Software, Inc.  All rights reserved.
  4. */
  5.  
  6. #if !defined(STRICT_OPENSTEP)
  7.  
  8. enum NSByteOrder {
  9.     NS_UnknownByteOrder,
  10.     NS_LittleEndian,
  11.     NS_BigEndian
  12. };
  13.  
  14. typedef unsigned long NSSwappedFloat;
  15. typedef unsigned long long NSSwappedDouble;
  16.  
  17. static __inline__ enum NSByteOrder NSHostByteOrder(void) {
  18.     unsigned int _x;
  19.     _x = (NS_BigEndian << 24) | NS_LittleEndian;
  20.     return ((enum NSByteOrder)*((unsigned char *)&_x));
  21. }
  22.  
  23. /****************    Basic arch-dependent swapping    ****************/
  24.  
  25. #if defined(m68k) || defined(hppa) || defined(sparc) || defined(ppc)
  26.  
  27. static __inline__ unsigned short NSSwapShort(unsigned short inv) {
  28.     union sconv {
  29.     unsigned short us;
  30.     unsigned char uc[2];
  31.     } *inp, outv;
  32.     inp = (union sconv *)&inv;
  33.     outv.uc[0] = inp->uc[1];
  34.     outv.uc[1] = inp->uc[0];
  35.     return (outv.us);
  36. }
  37.  
  38. static __inline__ unsigned int NSSwapInt(unsigned int inv) {
  39.     union iconv {
  40.     unsigned int ui;
  41.     unsigned char uc[4];
  42.     } *inp, outv;
  43.     inp = (union iconv *)&inv;
  44.     outv.uc[0] = inp->uc[3];
  45.     outv.uc[1] = inp->uc[2];
  46.     outv.uc[2] = inp->uc[1];
  47.     outv.uc[3] = inp->uc[0];
  48.     return (outv.ui);
  49. }
  50.  
  51. static __inline__ unsigned long NSSwapLong(unsigned long inv) {
  52.     union lconv {
  53.     unsigned long ul;
  54.     unsigned char uc[4];
  55.     } *inp, outv;
  56.     inp = (union lconv *)&inv;
  57.     outv.uc[0] = inp->uc[3];
  58.     outv.uc[1] = inp->uc[2];
  59.     outv.uc[2] = inp->uc[1];
  60.     outv.uc[3] = inp->uc[0];
  61.     return (outv.ul);
  62. }
  63.  
  64. static __inline__ unsigned long long NSSwapLongLong(unsigned long long inv) {
  65.     union llconv {
  66.     unsigned long long ull;
  67.     unsigned char uc[8];
  68.     } *inp, outv;
  69.     inp = (union llconv *)&inv;
  70.     outv.uc[0] = inp->uc[7];
  71.     outv.uc[1] = inp->uc[6];
  72.     outv.uc[2] = inp->uc[5];
  73.     outv.uc[3] = inp->uc[4];
  74.     outv.uc[4] = inp->uc[3];
  75.     outv.uc[5] = inp->uc[2];
  76.     outv.uc[6] = inp->uc[1];
  77.     outv.uc[7] = inp->uc[0];
  78.     return (outv.ull);
  79. }
  80.  
  81. static __inline__ NSSwappedFloat NSConvertHostFloatToSwapped(float x) {
  82.     union fconv {
  83.     float number;
  84.     NSSwappedFloat sf;
  85.     };
  86.     return ((union fconv *)&x)->sf;
  87. }
  88.  
  89. static __inline__ float NSConvertSwappedFloatToHost(NSSwappedFloat x) {
  90.     union fconv {
  91.     float number;
  92.     NSSwappedFloat sf;
  93.     };
  94.     return ((union fconv *)&x)->number;
  95. }
  96.  
  97. static __inline__ NSSwappedDouble NSConvertHostDoubleToSwapped(double x) {
  98.     union dconv {
  99.     double number;
  100.     NSSwappedDouble sd;
  101.     };
  102.     return ((union dconv *)&x)->sd;
  103. }
  104.  
  105. static __inline__ double NSConvertSwappedDoubleToHost(NSSwappedDouble x) {
  106.     union dconv {
  107.     double number;
  108.     NSSwappedDouble sd;
  109.     };
  110.     return ((union dconv *)&x)->number;
  111. }
  112.  
  113. static __inline__ NSSwappedFloat NSSwapFloat(NSSwappedFloat x) {
  114.     return NSSwapLong(x);
  115. }
  116.  
  117. static __inline__ NSSwappedDouble NSSwapDouble(NSSwappedDouble x) {
  118.     return NSSwapLongLong(x);
  119. }
  120.  
  121. #elif defined(i386)
  122.  
  123. static __inline__ unsigned short NSSwapShort (unsigned short inv) {
  124.     unsigned short outv;
  125.     __asm__ volatile("rorw $8,%0" : "=r" (outv) : "0" (inv));
  126.     return (outv);
  127. }
  128.  
  129. static __inline__ unsigned int NSSwapInt (unsigned int inv) {
  130.     unsigned int outv;
  131.     __asm__ volatile("bswap %0" : "=r" (outv) : "0" (inv));
  132.     return (outv);
  133. }
  134.  
  135. static __inline__ unsigned long NSSwapLong(unsigned long inv) {
  136.     unsigned long outv;
  137.     __asm__ volatile("bswap %0" : "=r" (outv) : "0" (inv));
  138.     return (outv);
  139. }
  140.  
  141. static __inline__ unsigned long long NSSwapLongLong(unsigned long long inv) {
  142.     union llconv {
  143.     unsigned long long ull;
  144.     unsigned long ul[2];
  145.     } *inp, outv;
  146.     inp = (union llconv *)&inv;
  147.     outv.ul[0] = NSSwapLong(inp->ul[1]);
  148.     outv.ul[1] = NSSwapLong(inp->ul[0]);
  149.     return (outv.ull);
  150. }
  151.  
  152. static __inline__ NSSwappedFloat NSConvertHostFloatToSwapped(float x) {
  153.     union fconv {
  154.     float number;
  155.     NSSwappedFloat sf;
  156.     };
  157.     return ((union fconv *)&x)->sf;
  158. }
  159.  
  160. static __inline__ float NSConvertSwappedFloatToHost(NSSwappedFloat x) {
  161.     union fconv {
  162.     float number;
  163.     NSSwappedFloat sf;
  164.     };
  165.     return ((union fconv *)&x)->number;
  166. }
  167.  
  168. static __inline__ NSSwappedDouble NSConvertHostDoubleToSwapped(double x) {
  169.     union dconv {
  170.     double number;
  171.     NSSwappedDouble sd;
  172.     };
  173.     return ((union dconv *)&x)->sd;
  174. }
  175.  
  176. static __inline__ double NSConvertSwappedDoubleToHost(NSSwappedDouble x) {
  177.     union dconv {
  178.     double number;
  179.     NSSwappedDouble sd;
  180.     };
  181.     return ((union dconv *)&x)->number;
  182. }
  183.  
  184. static __inline__ NSSwappedFloat NSSwapFloat(NSSwappedFloat x) {
  185.     return NSSwapLong(x);
  186. }
  187.  
  188. static __inline__ NSSwappedDouble NSSwapDouble(NSSwappedDouble x) {
  189.     return NSSwapLongLong(x);
  190. }
  191.  
  192. #else
  193. #error Do not know how to byte order this architecture
  194. #endif
  195.  
  196. /*************** Swapping to big/little endian ***************/
  197.  
  198. #if defined(__BIG_ENDIAN__)
  199.  
  200. static __inline__ unsigned short NSSwapBigShortToHost(unsigned short x) {
  201.     return (x);
  202. }
  203.  
  204. static __inline__ unsigned int NSSwapBigIntToHost(unsigned int x) {
  205.     return (x);
  206. }
  207.  
  208. static __inline__ unsigned long NSSwapBigLongToHost(unsigned long x) {
  209.     return (x);
  210. }
  211.  
  212. static __inline__ unsigned long long NSSwapBigLongLongToHost(unsigned long long x) {
  213.     return (x);
  214. }
  215.  
  216. static __inline__ double NSSwapBigDoubleToHost(NSSwappedDouble x) {
  217.     return NSConvertSwappedDoubleToHost(x);
  218. }
  219.  
  220. static __inline__ float NSSwapBigFloatToHost(NSSwappedFloat x) {
  221.     return NSConvertSwappedFloatToHost(x);
  222. }
  223.  
  224. static __inline__ unsigned short NSSwapHostShortToBig(unsigned short x) {
  225.     return (x);
  226. }
  227.  
  228. static __inline__ unsigned int NSSwapHostIntToBig(unsigned int x) {
  229.     return (x);
  230. }
  231.  
  232. static __inline__ unsigned long NSSwapHostLongToBig(unsigned long x) {
  233.     return (x);
  234. }
  235.  
  236. static __inline__ unsigned long long NSSwapHostLongLongToBig(unsigned long long x) {
  237.     return (x);
  238. }
  239.  
  240. static __inline__ NSSwappedDouble NSSwapHostDoubleToBig(double x) {
  241.     return NSConvertHostDoubleToSwapped(x);
  242. }
  243.  
  244. static __inline__ NSSwappedFloat NSSwapHostFloatToBig(float x) {
  245.     return NSConvertHostFloatToSwapped(x);
  246. }
  247.  
  248. static __inline__ unsigned short NSSwapLittleShortToHost(unsigned short x) {
  249.     return NSSwapShort(x);
  250. }
  251.  
  252. static __inline__ unsigned int NSSwapLittleIntToHost(unsigned int x) {
  253.     return NSSwapInt(x);
  254. }
  255.  
  256. static __inline__ unsigned long NSSwapLittleLongToHost(unsigned long x) {
  257.     return NSSwapLong(x);
  258. }
  259.  
  260. static __inline__ unsigned long long NSSwapLittleLongLongToHost(unsigned long long x) {
  261.     return NSSwapLongLong(x);
  262. }
  263.  
  264. static __inline__ double NSSwapLittleDoubleToHost(NSSwappedDouble x) {
  265.     return NSConvertSwappedDoubleToHost(NSSwapDouble(x));
  266. }
  267.  
  268. static __inline__ float NSSwapLittleFloatToHost(NSSwappedFloat x) {
  269.     return NSConvertSwappedFloatToHost(NSSwapFloat(x));
  270. }
  271.  
  272. static __inline__ unsigned short NSSwapHostShortToLittle(unsigned short x) {
  273.     return NSSwapShort(x);
  274. }
  275.  
  276. static __inline__ unsigned int NSSwapHostIntToLittle(unsigned int x) {
  277.     return NSSwapInt(x);
  278. }
  279.  
  280. static __inline__ unsigned long NSSwapHostLongToLittle(unsigned long x) {
  281.     return NSSwapLong(x);
  282. }
  283.  
  284. static __inline__ unsigned long long NSSwapHostLongLongToLittle(unsigned long long x) {
  285.     return NSSwapLongLong(x);
  286. }
  287.  
  288. static __inline__ NSSwappedDouble NSSwapHostDoubleToLittle(double x) {
  289.     return NSSwapDouble(NSConvertHostDoubleToSwapped(x));
  290. }
  291.  
  292. static __inline__ NSSwappedFloat NSSwapHostFloatToLittle(float x) {
  293.     return NSSwapFloat(NSConvertHostFloatToSwapped(x));
  294. }
  295.  
  296. #elif defined(__LITTLE_ENDIAN__)
  297.  
  298. static __inline__ unsigned short NSSwapBigShortToHost(unsigned short x) {
  299.     return NSSwapShort(x);
  300. }
  301.  
  302. static __inline__ unsigned int NSSwapBigIntToHost(unsigned int x) {
  303.     return NSSwapInt(x);
  304. }
  305.  
  306. static __inline__ unsigned long NSSwapBigLongToHost(unsigned long x) {
  307.     return NSSwapLong(x);
  308. }
  309.  
  310. static __inline__ unsigned long long NSSwapBigLongLongToHost(unsigned long long x) {
  311.     return NSSwapLongLong(x);
  312. }
  313.  
  314. static __inline__ double NSSwapBigDoubleToHost(NSSwappedDouble x) {
  315.     return NSConvertSwappedDoubleToHost(NSSwapDouble(x));
  316. }
  317.  
  318. static __inline__ float NSSwapBigFloatToHost(NSSwappedFloat x) {
  319.     return NSConvertSwappedFloatToHost(NSSwapFloat(x));
  320. }
  321.  
  322. static __inline__ unsigned short NSSwapHostShortToBig(unsigned short x) {
  323.     return NSSwapShort(x);
  324. }
  325.  
  326. static __inline__ unsigned int NSSwapHostIntToBig(unsigned int x) {
  327.     return NSSwapInt(x);
  328. }
  329.  
  330. static __inline__ unsigned long NSSwapHostLongToBig(unsigned long x) {
  331.     return NSSwapLong(x);
  332. }
  333.  
  334. static __inline__ unsigned long long NSSwapHostLongLongToBig(unsigned long long x) {
  335.     return NSSwapLongLong(x);
  336. }
  337.  
  338. static __inline__ NSSwappedDouble NSSwapHostDoubleToBig(double x) {
  339.     return NSSwapDouble(NSConvertHostDoubleToSwapped(x));
  340. }
  341.  
  342. static __inline__ NSSwappedFloat NSSwapHostFloatToBig(float x) {
  343.     return NSSwapFloat(NSConvertHostFloatToSwapped(x));
  344. }
  345.  
  346. static __inline__ unsigned short NSSwapLittleShortToHost(unsigned short x) {
  347.     return (x);
  348. }
  349.  
  350. static __inline__ unsigned int NSSwapLittleIntToHost(unsigned int x) {
  351.     return (x);
  352. }
  353.  
  354. static __inline__ unsigned long NSSwapLittleLongToHost(unsigned long x) {
  355.     return (x);
  356. }
  357.  
  358. static __inline__ unsigned long long NSSwapLittleLongLongToHost(unsigned long long x) {
  359.     return (x);
  360. }
  361.  
  362. static __inline__ double NSSwapLittleDoubleToHost(NSSwappedDouble x) {
  363.     return NSConvertSwappedDoubleToHost(x);
  364. }
  365.  
  366. static __inline__ float NSSwapLittleFloatToHost(NSSwappedFloat x) {
  367.     return NSConvertSwappedFloatToHost(x);
  368. }
  369.  
  370. static __inline__ unsigned short NSSwapHostShortToLittle(unsigned short x) {
  371.     return (x);
  372. }
  373.  
  374. static __inline__ unsigned int NSSwapHostIntToLittle(unsigned int x) {
  375.     return (x);
  376. }
  377.  
  378. static __inline__ unsigned long NSSwapHostLongToLittle(unsigned long x) {
  379.     return (x);
  380. }
  381.  
  382. static __inline__ unsigned long long NSSwapHostLongLongToLittle(unsigned long long x) {
  383.     return (x);
  384. }
  385.  
  386. static __inline__ NSSwappedDouble NSSwapHostDoubleToLittle(double x) {
  387.     return NSConvertHostDoubleToSwapped(x);
  388. }
  389.  
  390. static __inline__ NSSwappedFloat NSSwapHostFloatToLittle(float x) {
  391.     return NSConvertHostFloatToSwapped(x);
  392. }
  393.  
  394. #else
  395. #error Do not know the endianess of this architecture
  396. #endif
  397.  
  398. #endif /* !STRICT_OPENSTEP */
  399.