Cleaned up licensing
[jigit.git] / endian.c
1 /*
2  * endian.c
3  *
4  * Simple helper functions for reading and writing BE and LE numbers
5  *
6  * Copyright (c) 2004 Steve McIntyre <steve@einval.com>
7  *
8  * GPL v2 - see COPYING
9  */
10
11 #include "endian.h"
12
13 /* Write a 64-bit quantity out into memory in BIG ENDIAN order */
14 void write_be64(in, out)
15     unsigned long long in;
16     unsigned char *out;
17 {
18     out[0] = (in >> 56) & 0xFF;
19     out[1] = (in >> 48) & 0xFF;
20     out[2] = (in >> 40) & 0xFF;
21     out[3] = (in >> 32) & 0xFF;
22     out[4] = (in >> 24) & 0xFF;
23     out[5] = (in >> 16) & 0xFF;
24     out[6] = (in >> 8) & 0xFF;
25     out[7] = in & 0xFF;
26 }
27
28 /* Read in a 64-bit BIG ENDIAN quantity */
29 unsigned long long read_be64(in)
30     unsigned char *in;
31 {
32     unsigned long long result = 0;
33
34     result |= (unsigned long long)in[0] << 56;
35     result |= (unsigned long long)in[1] << 48;
36     result |= (unsigned long long)in[2] << 40;
37     result |= (unsigned long long)in[3] << 32;
38     result |= (unsigned long long)in[4] << 24;
39     result |= (unsigned long long)in[5] << 16;
40     result |= (unsigned long long)in[6] << 8;
41     result |= (unsigned long long)in[7];
42     
43     return result;
44 }
45
46 /* Write a 64-bit quantity out into memory in LITTLE ENDIAN order */
47 void write_le64(in, out)
48     unsigned long long in;
49     unsigned char *out;
50 {
51     out[0] = in & 0xFF;
52     out[1] = (in >> 8) & 0xFF;
53     out[2] = (in >> 16) & 0xFF;
54     out[3] = (in >> 24) & 0xFF;
55     out[4] = (in >> 32) & 0xFF;
56     out[5] = (in >> 40) & 0xFF;
57     out[6] = (in >> 48) & 0xFF;
58     out[7] = (in >> 56) & 0xFF;
59 }
60
61 /* Read in a 64-bit LITTLE ENDIAN quantity */
62 unsigned long long read_le64(in)
63     unsigned char *in;
64 {
65     unsigned long long result = 0;
66
67     result |= (unsigned long long)in[0];
68     result |= (unsigned long long)in[1] << 8;
69     result |= (unsigned long long)in[2] << 16;
70     result |= (unsigned long long)in[3] << 24;
71     result |= (unsigned long long)in[4] << 32;
72     result |= (unsigned long long)in[5] << 40;
73     result |= (unsigned long long)in[6] << 48;
74     result |= (unsigned long long)in[7] << 56;
75     
76     return result;
77 }
78
79 /* Write a 48-bit quantity out into memory in LITTLE ENDIAN order */
80 void write_le48(in, out)
81     unsigned long long in;
82     unsigned char *out;
83 {
84     out[0] = in & 0xFF;
85     out[1] = (in >> 8) & 0xFF;
86     out[2] = (in >> 16) & 0xFF;
87     out[3] = (in >> 24) & 0xFF;
88     out[4] = (in >> 32) & 0xFF;
89     out[5] = (in >> 40) & 0xFF;
90 }
91
92 /* Read in a 48-bit LITTLE ENDIAN quantity */
93 unsigned long long read_le48(in)
94     unsigned char *in;
95 {
96     unsigned long long result = 0;
97
98     result |= (unsigned long long)in[0];
99     result |= (unsigned long long)in[1] << 8;
100     result |= (unsigned long long)in[2] << 16;
101     result |= (unsigned long long)in[3] << 24;
102     result |= (unsigned long long)in[4] << 32;
103     result |= (unsigned long long)in[5] << 40;
104     
105     return result;
106 }
107
108 /* Write a 32-bit quantity out into memory in BIG ENDIAN order */
109 void write_be32(in, out)
110     unsigned long in;
111     unsigned char *out;
112 {
113     out[0] = (in >> 24) & 0xFF;
114     out[1] = (in >> 16) & 0xFF;
115     out[2] = (in >> 8) & 0xFF;
116     out[3] = in & 0xFF;
117 }
118
119 /* Read in a 32-bit BIG ENDIAN quantity */
120 unsigned long read_be32(in)
121     unsigned char *in;
122 {
123     unsigned long result = 0;
124
125     result |= (unsigned long)in[0] << 24;
126     result |= (unsigned long)in[1] << 16;
127     result |= (unsigned long)in[2] << 8;
128     result |= (unsigned long)in[3];
129     
130     return result;
131 }
132
133 /* Write a 32-bit quantity out into memory in LITTLE ENDIAN order */
134 void write_le32(in, out)
135     unsigned long in;
136     unsigned char *out;
137 {
138     out[0] = in & 0xFF;
139     out[1] = (in >> 8) & 0xFF;
140     out[2] = (in >> 16) & 0xFF;
141     out[3] = (in >> 24) & 0xFF;
142 }
143
144 /* Read in a 32-bit LITTLE ENDIAN quantity */
145 unsigned long read_le32(in)
146     unsigned char *in;
147 {
148     unsigned long result = 0;
149
150     result |= (unsigned long)in[0];
151     result |= (unsigned long)in[1] << 8;
152     result |= (unsigned long)in[2] << 16;
153     result |= (unsigned long)in[3] << 24;
154     
155     return result;
156 }
157
158 /* Write a 16-bit quantity out into memory in BIG ENDIAN order */
159 void write_be16(in, out)
160     unsigned short in;
161     unsigned char *out;
162 {
163     out[0] = (in >> 8) & 0xFF;
164     out[1] = in & 0xFF;
165 }
166     
167 /* Read in a 16-bit BIG ENDIAN quantity */
168 unsigned short read_be16(in)
169     unsigned char *in;
170 {
171     unsigned short result = 0;
172     
173     result |= (unsigned short)in[0] << 8;
174     result |= (unsigned short)in[1];
175     return result;
176 }
177
178 /* Write a 16-bit quantity out into memory in LITTLE ENDIAN order */
179 void write_le16(in, out)
180     unsigned short in;
181     unsigned char *out;
182 {
183     out[0] = in & 0xFF;
184     out[1] = in & 0xFF >> 8;
185 }
186     
187 /* Read in a 16-bit LITTLE ENDIAN quantity */
188 unsigned short read_le16(in)
189     unsigned char *in;
190 {
191     unsigned short result = 0;
192     
193     result |= (unsigned short)in[0];
194     result |= (unsigned short)in[1] << 8;
195     return result;
196 }
197