1 /*****************************************************************************/
2 /*									     */
3 /*				    CPUCVT.CC				     */
4 /*									     */
5 /* (C) 1993-96	Ullrich von Bassewitz					     */
6 /*		Wacholderweg 14						     */
7 /*		D-70597 Stuttgart					     */
8 /* EMail:	uz@ibb.schwaben.com					     */
9 /*									     */
10 /*****************************************************************************/
11 
12 
13 
14 // $Id$
15 //
16 // $Log$
17 //
18 //
19 
20 
21 
22 // This file contains code to convert to and from little endian data types
23 // into the native format.
24 
25 
26 
27 #include "cpucvt.h"
28 
29 
30 
31 /*****************************************************************************/
32 /*				     Code				     */
33 /*****************************************************************************/
34 
35 
36 
37 #ifdef CPU_BIG_ENDIAN
38 
39 
40 
ToLittleEndian(i16 & X)41 void ToLittleEndian (i16& X)
42 {
43     X = ((X << 8) & 0xFF00) |
44 	((X >> 8) & 0x00FF);
45 }
46 
47 
48 
ToLittleEndian(i32 & X)49 void ToLittleEndian (i32& X)
50 {
51     X = ((X >> 24) & 0x000000FF) |
52 	((X >>	8) & 0x0000FF00) |
53 	((X <<	8) & 0x00FF0000) |
54 	((X << 24) & 0xFF000000);
55 }
56 
57 
58 
ToLittleEndian(u16 & X)59 void ToLittleEndian (u16& X)
60 {
61     X = ((X << 8) & 0xFF00) |
62 	((X >> 8) & 0x00FF);
63 }
64 
65 
66 
ToLittleEndian(u32 & X)67 void ToLittleEndian (u32& X)
68 {
69     X = ((X >> 24) & 0x000000FF) |
70 	((X >>	8) & 0x0000FF00) |
71 	((X <<	8) & 0x00FF0000) |
72 	((X << 24) & 0xFF000000);
73 }
74 
75 
76 
ToLittleEndian(_double & X)77 void ToLittleEndian (_double& X)
78 {
79     // Swap the longs
80     u32 Tmp = X.I [0];
81     X.I [0] = X.I [1];
82     X.I [1] = Tmp;
83 
84     // Swap the bytes inside the longs
85     ToLittleEndian (X.I [0]);
86     ToLittleEndian (X.I [1]);
87 }
88 
89 
90 
FromLittleEndian(i16 & X)91 void FromLittleEndian (i16& X)
92 {
93     X = ((X << 8) & 0xFF00) |
94 	((X >> 8) & 0x00FF);
95 }
96 
97 
98 
FromLittleEndian(i32 & X)99 void FromLittleEndian (i32& X)
100 {
101     X = ((X >> 24) & 0x000000FF) |
102 	((X >>	8) & 0x0000FF00) |
103 	((X <<	8) & 0x00FF0000) |
104 	((X << 24) & 0xFF000000);
105 }
106 
107 
108 
FromLittleEndian(u16 & X)109 void FromLittleEndian (u16& X)
110 {
111     X = ((X << 8) & 0xFF00) |
112 	((X >> 8) & 0x00FF);
113 }
114 
115 
116 
FromLittleEndian(u32 & X)117 void FromLittleEndian (u32& X)
118 {
119     X = ((X >> 24) & 0x000000FF) |
120 	((X >>	8) & 0x0000FF00) |
121 	((X <<	8) & 0x00FF0000) |
122 	((X << 24) & 0xFF000000);
123 }
124 
125 
126 
FromLittleEndian(_double & X)127 void FromLittleEndian (_double& X)
128 {
129     // Swap the longs
130     u32 Tmp = X.I [0];
131     X.I [0] = X.I [1];
132     X.I [1] = Tmp;
133 
134     // Swap the bytes inside the longs
135     FromLittleEndian (X.I [0]);
136     FromLittleEndian (X.I [1]);
137 }
138 
139 
140 
141 #endif
142 
143