1
/* NSByteOrder functions for GNUStep
2
Copyright (C) 1998 Free Software Foundation, Inc.
4
Written by: Richard Frith-Macdonald <richard@brainstorm.co.uk>
7
This file is part of the GNUstep Base Library.
9
This library is free software; you can redistribute it and/or
10
modify it under the terms of the GNU Library General Public
11
License as published by the Free Software Foundation; either
12
version 2 of the License, or (at your option) any later version.
14
This library is distributed in the hope that it will be useful,
15
but WITHOUT ANY WARRANTY; without even the implied warranty of
16
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17
Library General Public License for more details.
19
You should have received a copy of the GNU Library General Public
20
License along with this library; if not, write to the Free
21
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
24
#ifndef __NSByteOrder_h_GNUSTEP_BASE_INCLUDE
25
#define __NSByteOrder_h_GNUSTEP_BASE_INCLUDE
30
* OPENSTEP type definitions for Byte ordering.
32
typedef gsu32 NSSwappedFloat;
33
typedef gsu64 NSSwappedDouble;
42
* Function prototypes.
45
#if (__GNUC__ == 2) && (__GNUC_MINOR__ <= 6) && !defined(__attribute__)
46
# define __attribute__(x)
50
* First the GNUstep functions for byte swapping
53
GSSwapI16(gsu16 in) __attribute__((unused));
55
GSSwapI32(gsu32 in) __attribute__((unused));
57
GSSwapI64(gsu64 in) __attribute__((unused));
59
GSSwapI128(gsu128 in) __attribute__((unused));
62
GSSwapBigI16ToHost(gsu16 in) __attribute__((unused));
64
GSSwapBigI32ToHost(gsu32 in) __attribute__((unused));
66
GSSwapBigI64ToHost(gsu64 in) __attribute__((unused));
68
GSSwapBigI128ToHost(gsu128 in) __attribute__((unused));
71
GSSwapHostI16ToBig(gsu16 in) __attribute__((unused));
73
GSSwapHostI32ToBig(gsu32 in) __attribute__((unused));
75
GSSwapHostI64ToBig(gsu64 in) __attribute__((unused));
77
GSSwapHostI128ToBig(gsu128 in) __attribute__((unused));
80
GSSwapLittleI16ToHost(gsu16 in) __attribute__((unused));
82
GSSwapLittleI32ToHost(gsu32 in) __attribute__((unused));
84
GSSwapLittleI64ToHost(gsu64 in) __attribute__((unused));
86
GSSwapLittleI128ToHost(gsu128 in) __attribute__((unused));
89
GSSwapHostI16ToLittle(gsu16 in) __attribute__((unused));
91
GSSwapHostI32ToLittle(gsu32 in) __attribute__((unused));
93
GSSwapHostI64ToLittle(gsu64 in) __attribute__((unused));
95
GSSwapHostI128ToLittle(gsu128 in) __attribute__((unused));
97
#if (__GNUC__ == 3) && (__GNUC_MINOR__ == 1)
98
/* gcc 3.1 with option -O2 generates bad (i386?) code when compiling
99
the following inline functions inside a .m file. A call to a
100
dumb function seems to work. */
101
extern void _gcc3_1_hack(void);
111
union swap *src = (union swap*)∈
112
#if (__GNUC__ == 3) && (__GNUC_MINOR__ == 1)
115
dst.byt[0] = src->byt[1];
116
dst.byt[1] = src->byt[0];
127
union swap *src = (union swap*)∈
128
#if (__GNUC__ == 3) && (__GNUC_MINOR__ == 1)
131
dst.byt[0] = src->byt[3];
132
dst.byt[1] = src->byt[2];
133
dst.byt[2] = src->byt[1];
134
dst.byt[3] = src->byt[0];
145
union swap *src = (union swap*)∈
146
#if (__GNUC__ == 3) && (__GNUC_MINOR__ == 1)
149
dst.byt[0] = src->byt[7];
150
dst.byt[1] = src->byt[6];
151
dst.byt[2] = src->byt[5];
152
dst.byt[3] = src->byt[4];
153
dst.byt[4] = src->byt[3];
154
dst.byt[5] = src->byt[2];
155
dst.byt[6] = src->byt[1];
156
dst.byt[7] = src->byt[0];
161
GSSwapI128(gsu128 in)
167
union swap *src = (union swap*)∈
168
#if (__GNUC__ == 3) && (__GNUC_MINOR__ == 1)
171
dst.byt[0] = src->byt[15];
172
dst.byt[1] = src->byt[14];
173
dst.byt[2] = src->byt[13];
174
dst.byt[3] = src->byt[12];
175
dst.byt[4] = src->byt[11];
176
dst.byt[5] = src->byt[10];
177
dst.byt[6] = src->byt[9];
178
dst.byt[7] = src->byt[8];
179
dst.byt[8] = src->byt[7];
180
dst.byt[9] = src->byt[6];
181
dst.byt[10] = src->byt[5];
182
dst.byt[11] = src->byt[4];
183
dst.byt[12] = src->byt[3];
184
dst.byt[13] = src->byt[2];
185
dst.byt[14] = src->byt[1];
186
dst.byt[15] = src->byt[0];
191
* Now the OpenStep functions
193
static inline NSSwappedDouble
194
NSConvertHostDoubleToSwapped(double num) __attribute__((unused));
195
static inline NSSwappedFloat
196
NSConvertHostFloatToSwapped(float num) __attribute__((unused));
198
NSConvertSwappedDoubleToHost(NSSwappedDouble num) __attribute__((unused));
200
NSConvertSwappedFloatToHost(NSSwappedFloat num) __attribute__((unused));
201
static inline unsigned int
202
NSSwapInt(unsigned int in) __attribute__((unused));
203
static inline unsigned long long
204
NSSwapLongLong(unsigned long long in) __attribute__((unused));
205
static inline unsigned long
206
NSSwapLong(unsigned long in) __attribute__((unused));
207
static inline unsigned short
208
NSSwapShort(unsigned short in) __attribute__((unused));
209
static inline NSSwappedDouble
210
NSSwapDouble(NSSwappedDouble num) __attribute__((unused));
211
static inline NSSwappedFloat
212
NSSwapFloat(NSSwappedFloat num) __attribute__((unused));
213
static inline NSByteOrder
214
NSHostByteOrder(void) __attribute__((unused));
216
NSSwapBigDoubleToHost(NSSwappedDouble num) __attribute__((unused));
218
NSSwapBigFloatToHost(NSSwappedFloat num) __attribute__((unused));
219
static inline unsigned int
220
NSSwapBigIntToHost(unsigned int num) __attribute__((unused));
221
static inline unsigned long long
222
NSSwapBigLongLongToHost(unsigned long long num) __attribute__((unused));
223
static inline unsigned long
224
NSSwapBigLongToHost(unsigned long num) __attribute__((unused));
225
static inline unsigned short
226
NSSwapBigShortToHost(unsigned short num) __attribute__((unused));
227
static inline NSSwappedDouble
228
NSSwapHostDoubleToBig(double num) __attribute__((unused));
229
static inline NSSwappedFloat
230
NSSwapHostFloatToBig(float num) __attribute__((unused));
231
static inline unsigned int
232
NSSwapHostIntToBig(unsigned int num) __attribute__((unused));
233
static inline unsigned long long
234
NSSwapHostLongLongToBig(unsigned long long num) __attribute__((unused));
235
static inline unsigned long
236
NSSwapHostLongToBig(unsigned long num) __attribute__((unused));
237
static inline unsigned short
238
NSSwapHostShortToBig(unsigned short num) __attribute__((unused));
240
NSSwapLittleDoubleToHost(NSSwappedDouble num) __attribute__((unused));
242
NSSwapLittleFloatToHost(NSSwappedFloat num) __attribute__((unused));
243
static inline unsigned int
244
NSSwapLittleIntToHost(unsigned int num) __attribute__((unused));
245
static inline unsigned long long
246
NSSwapLittleLongLongToHost(unsigned long long num) __attribute__((unused));
247
static inline unsigned long
248
NSSwapLittleLongToHost(unsigned long num) __attribute__((unused));
249
static inline unsigned short
250
NSSwapLittleShortToHost(unsigned short num) __attribute__((unused));
251
static inline NSSwappedDouble
252
NSSwapHostDoubleToLittle(double num) __attribute__((unused));
253
static inline NSSwappedFloat
254
NSSwapHostFloatToLittle(float num) __attribute__((unused));
255
static inline unsigned int
256
NSSwapHostIntToLittle(unsigned int num) __attribute__((unused));
257
static inline unsigned long long
258
NSSwapHostLongLongToLittle(unsigned long long num) __attribute__((unused));
259
static inline unsigned long
260
NSSwapHostLongToLittle(unsigned long num) __attribute__((unused));
261
static inline unsigned short
262
NSSwapHostShortToLittle(unsigned short num) __attribute__((unused));
265
* Basic byte swapping routines and type conversions
267
static inline NSSwappedDouble
268
NSConvertHostDoubleToSwapped(double num)
274
return ((union dconv *)&num)->sd;
277
static inline NSSwappedFloat
278
NSConvertHostFloatToSwapped(float num)
284
return ((union fconv *)&num)->sf;
288
NSConvertSwappedDoubleToHost(NSSwappedDouble num)
294
return ((union dconv *)&num)->number;
298
NSConvertSwappedFloatToHost(NSSwappedFloat num)
304
return ((union fconv *)&num)->number;
307
static inline unsigned int
308
NSSwapInt(unsigned int in)
310
#if GS_SIZEOF_INT == 2
311
return GSSwapI16(in);
313
#if GS_SIZEOF_INT == 4
314
return GSSwapI32(in);
316
#if GS_SIZEOF_INT == 8
317
return GSSwapI64(in);
319
return GSSwapI128(in);
325
static inline unsigned long long
326
NSSwapLongLong(unsigned long long in)
328
#if GS_SIZEOF_LONG_LONG == 2
329
return GSSwapI16(in);
331
#if GS_SIZEOF_LONG_LONG == 4
332
return GSSwapI32(in);
334
#if GS_SIZEOF_LONG_LONG == 8
335
return GSSwapI64(in);
337
return GSSwapI128(in);
343
static inline unsigned long
344
NSSwapLong(unsigned long in)
346
#if GS_SIZEOF_LONG == 2
347
return GSSwapI16(in);
349
#if GS_SIZEOF_LONG == 4
350
return GSSwapI32(in);
352
#if GS_SIZEOF_LONG == 8
353
return GSSwapI64(in);
355
return GSSwapI128(in);
361
static inline unsigned short
362
NSSwapShort(unsigned short in)
364
#if GS_SIZEOF_SHORT == 2
365
return GSSwapI16(in);
367
#if GS_SIZEOF_SHORT == 4
368
return GSSwapI32(in);
370
#if GS_SIZEOF_SHORT == 8
371
return GSSwapI64(in);
373
return GSSwapI128(in);
379
static inline NSSwappedDouble
380
NSSwapDouble(NSSwappedDouble num)
382
return GSSwapI64(num);
385
static inline NSSwappedFloat
386
NSSwapFloat(NSSwappedFloat num)
388
return GSSwapI32(num);
391
#if GS_WORDS_BIGENDIAN
393
static inline NSByteOrder
394
NSHostByteOrder(void)
400
* Swap Big endian to host
403
GSSwapBigI16ToHost(gsu16 in)
408
GSSwapBigI32ToHost(gsu32 in)
413
GSSwapBigI64ToHost(gsu64 in)
418
GSSwapBigI128ToHost(gsu128 in)
424
NSSwapBigDoubleToHost(NSSwappedDouble num)
426
return NSConvertSwappedDoubleToHost(num);
430
NSSwapBigFloatToHost(NSSwappedFloat num)
432
return NSConvertSwappedFloatToHost(num);
435
static inline unsigned int
436
NSSwapBigIntToHost(unsigned int num)
441
static inline unsigned long long
442
NSSwapBigLongLongToHost(unsigned long long num)
447
static inline unsigned long
448
NSSwapBigLongToHost(unsigned long num)
453
static inline unsigned short
454
NSSwapBigShortToHost(unsigned short num)
460
* Swap Host to Big endian
463
GSSwapHostI16ToBig(gsu16 in)
468
GSSwapHostI32ToBig(gsu32 in)
473
GSSwapHostI64ToBig(gsu64 in)
478
GSSwapHostI128ToBig(gsu128 in)
483
static inline NSSwappedDouble
484
NSSwapHostDoubleToBig(double num)
486
return NSConvertHostDoubleToSwapped(num);
489
static inline NSSwappedFloat
490
NSSwapHostFloatToBig(float num)
492
return NSConvertHostFloatToSwapped(num);
495
static inline unsigned int
496
NSSwapHostIntToBig(unsigned int num)
501
static inline unsigned long long
502
NSSwapHostLongLongToBig(unsigned long long num)
507
static inline unsigned long
508
NSSwapHostLongToBig(unsigned long num)
513
static inline unsigned short
514
NSSwapHostShortToBig(unsigned short num)
520
* Swap Little endian to Host
523
GSSwapLittleI16ToHost(gsu16 in)
525
return GSSwapI16(in);
528
GSSwapLittleI32ToHost(gsu32 in)
530
return GSSwapI32(in);
533
GSSwapLittleI64ToHost(gsu64 in)
535
return GSSwapI64(in);
538
GSSwapLittleI128ToHost(gsu128 in)
540
return GSSwapI128(in);
544
NSSwapLittleDoubleToHost(NSSwappedDouble num)
546
return NSConvertSwappedDoubleToHost(NSSwapDouble(num));
550
NSSwapLittleFloatToHost(NSSwappedFloat num)
552
return NSConvertSwappedFloatToHost(NSSwapFloat(num));
555
static inline unsigned int
556
NSSwapLittleIntToHost(unsigned int num)
558
return NSSwapInt(num);
561
static inline unsigned long long
562
NSSwapLittleLongLongToHost(unsigned long long num)
564
return NSSwapLongLong(num);
567
static inline unsigned long
568
NSSwapLittleLongToHost(unsigned long num)
570
return NSSwapLong(num);
573
static inline unsigned short
574
NSSwapLittleShortToHost(unsigned short num)
576
return NSSwapShort(num);
580
* Swap Host to Little endian
583
GSSwapHostI16ToLittle(gsu16 in)
585
return GSSwapI16(in);
588
GSSwapHostI32ToLittle(gsu32 in)
590
return GSSwapI32(in);
593
GSSwapHostI64ToLittle(gsu64 in)
595
return GSSwapI64(in);
598
GSSwapHostI128ToLittle(gsu128 in)
600
return GSSwapI128(in);
603
static inline NSSwappedDouble
604
NSSwapHostDoubleToLittle(double num)
606
return NSSwapDouble(NSConvertHostDoubleToSwapped(num));
609
static inline NSSwappedFloat
610
NSSwapHostFloatToLittle(float num)
612
return NSSwapFloat(NSConvertHostFloatToSwapped(num));
615
static inline unsigned int
616
NSSwapHostIntToLittle(unsigned int num)
618
return NSSwapInt(num);
621
static inline unsigned long long
622
NSSwapHostLongLongToLittle(unsigned long long num)
624
return NSSwapLongLong(num);
627
static inline unsigned long
628
NSSwapHostLongToLittle(unsigned long num)
630
return NSSwapLong(num);
633
static inline unsigned short
634
NSSwapHostShortToLittle(unsigned short num)
636
return NSSwapShort(num);
642
static inline NSByteOrder
643
NSHostByteOrder(void)
645
return NS_LittleEndian;
650
* Swap Big endian to host
653
GSSwapBigI16ToHost(gsu16 in)
655
return GSSwapI16(in);
658
GSSwapBigI32ToHost(gsu32 in)
660
return GSSwapI32(in);
663
GSSwapBigI64ToHost(gsu64 in)
665
return GSSwapI64(in);
668
GSSwapBigI128ToHost(gsu128 in)
670
return GSSwapI128(in);
673
NSSwapBigDoubleToHost(NSSwappedDouble num)
675
return NSConvertSwappedDoubleToHost(NSSwapDouble(num));
679
NSSwapBigFloatToHost(NSSwappedFloat num)
681
return NSConvertSwappedFloatToHost(NSSwapFloat(num));
684
static inline unsigned int
685
NSSwapBigIntToHost(unsigned int num)
687
return NSSwapInt(num);
690
static inline unsigned long long
691
NSSwapBigLongLongToHost(unsigned long long num)
693
return NSSwapLongLong(num);
696
static inline unsigned long
697
NSSwapBigLongToHost(unsigned long num)
699
return NSSwapLong(num);
702
static inline unsigned short
703
NSSwapBigShortToHost(unsigned short num)
705
return NSSwapShort(num);
709
* Swap Host to Big endian
712
GSSwapHostI16ToBig(gsu16 in)
714
return GSSwapI16(in);
717
GSSwapHostI32ToBig(gsu32 in)
719
return GSSwapI32(in);
722
GSSwapHostI64ToBig(gsu64 in)
724
return GSSwapI64(in);
727
GSSwapHostI128ToBig(gsu128 in)
729
return GSSwapI128(in);
731
static inline NSSwappedDouble
732
NSSwapHostDoubleToBig(double num)
734
return NSSwapDouble(NSConvertHostDoubleToSwapped(num));
737
static inline NSSwappedFloat
738
NSSwapHostFloatToBig(float num)
740
return NSSwapFloat(NSConvertHostFloatToSwapped(num));
743
static inline unsigned int
744
NSSwapHostIntToBig(unsigned int num)
746
return NSSwapInt(num);
749
static inline unsigned long long
750
NSSwapHostLongLongToBig(unsigned long long num)
752
return NSSwapLongLong(num);
755
static inline unsigned long
756
NSSwapHostLongToBig(unsigned long num)
758
return NSSwapLong(num);
761
static inline unsigned short
762
NSSwapHostShortToBig(unsigned short num)
764
return NSSwapShort(num);
768
* Swap Little endian to Host
771
GSSwapLittleI16ToHost(gsu16 in)
776
GSSwapLittleI32ToHost(gsu32 in)
781
GSSwapLittleI64ToHost(gsu64 in)
786
GSSwapLittleI128ToHost(gsu128 in)
792
NSSwapLittleDoubleToHost(NSSwappedDouble num)
794
return NSConvertSwappedDoubleToHost(num);
798
NSSwapLittleFloatToHost(NSSwappedFloat num)
800
return NSConvertSwappedFloatToHost(num);
803
static inline unsigned int
804
NSSwapLittleIntToHost(unsigned int num)
809
static inline unsigned long long
810
NSSwapLittleLongLongToHost(unsigned long long num)
815
static inline unsigned long
816
NSSwapLittleLongToHost(unsigned long num)
821
static inline unsigned short
822
NSSwapLittleShortToHost(unsigned short num)
828
* Swap Host to Little endian
831
GSSwapHostI16ToLittle(gsu16 in)
836
GSSwapHostI32ToLittle(gsu32 in)
841
GSSwapHostI64ToLittle(gsu64 in)
846
GSSwapHostI128ToLittle(gsu128 in)
851
static inline NSSwappedDouble
852
NSSwapHostDoubleToLittle(double num)
854
return NSConvertHostDoubleToSwapped(num);
857
static inline NSSwappedFloat
858
NSSwapHostFloatToLittle(float num)
860
return NSConvertHostFloatToSwapped(num);
863
static inline unsigned int
864
NSSwapHostIntToLittle(unsigned int num)
869
static inline unsigned long long
870
NSSwapHostLongLongToLittle(unsigned long long num)
875
static inline unsigned long
876
NSSwapHostLongToLittle(unsigned long num)
881
static inline unsigned short
882
NSSwapHostShortToLittle(unsigned short num)
890
#endif /* __NSByteOrder_h_GNUSTEP_BASE_INCLUDE */