Code cleanups after running with "sparse"
[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(unsigned long long in, unsigned char *out)
15 {
16     out[0] = (in >> 56) & 0xFF;
17     out[1] = (in >> 48) & 0xFF;
18     out[2] = (in >> 40) & 0xFF;
19     out[3] = (in >> 32) & 0xFF;
20     out[4] = (in >> 24) & 0xFF;
21     out[5] = (in >> 16) & 0xFF;
22     out[6] = (in >> 8) & 0xFF;
23     out[7] = in & 0xFF;
24 }
25
26 /* Read in a 64-bit BIG ENDIAN quantity */
27 unsigned long long read_be64(unsigned char *in)
28 {
29     unsigned long long result = 0;
30
31     result |= (unsigned long long)in[0] << 56;
32     result |= (unsigned long long)in[1] << 48;
33     result |= (unsigned long long)in[2] << 40;
34     result |= (unsigned long long)in[3] << 32;
35     result |= (unsigned long long)in[4] << 24;
36     result |= (unsigned long long)in[5] << 16;
37     result |= (unsigned long long)in[6] << 8;
38     result |= (unsigned long long)in[7];
39     
40     return result;
41 }
42
43 /* Write a 64-bit quantity out into memory in LITTLE ENDIAN order */
44 void write_le64(unsigned long long in, unsigned char *out)
45 {
46     out[0] = in & 0xFF;
47     out[1] = (in >> 8) & 0xFF;
48     out[2] = (in >> 16) & 0xFF;
49     out[3] = (in >> 24) & 0xFF;
50     out[4] = (in >> 32) & 0xFF;
51     out[5] = (in >> 40) & 0xFF;
52     out[6] = (in >> 48) & 0xFF;
53     out[7] = (in >> 56) & 0xFF;
54 }
55
56 /* Read in a 64-bit LITTLE ENDIAN quantity */
57 unsigned long long read_le64(unsigned char *in)
58 {
59     unsigned long long result = 0;
60
61     result |= (unsigned long long)in[0];
62     result |= (unsigned long long)in[1] << 8;
63     result |= (unsigned long long)in[2] << 16;
64     result |= (unsigned long long)in[3] << 24;
65     result |= (unsigned long long)in[4] << 32;
66     result |= (unsigned long long)in[5] << 40;
67     result |= (unsigned long long)in[6] << 48;
68     result |= (unsigned long long)in[7] << 56;
69     
70     return result;
71 }
72
73 /* Write a 48-bit quantity out into memory in LITTLE ENDIAN order */
74 void write_le48(unsigned long long in, unsigned char *out)
75 {
76     out[0] = in & 0xFF;
77     out[1] = (in >> 8) & 0xFF;
78     out[2] = (in >> 16) & 0xFF;
79     out[3] = (in >> 24) & 0xFF;
80     out[4] = (in >> 32) & 0xFF;
81     out[5] = (in >> 40) & 0xFF;
82 }
83
84 /* Read in a 48-bit LITTLE ENDIAN quantity */
85 unsigned long long read_le48(unsigned char *in)
86 {
87     unsigned long long result = 0;
88
89     result |= (unsigned long long)in[0];
90     result |= (unsigned long long)in[1] << 8;
91     result |= (unsigned long long)in[2] << 16;
92     result |= (unsigned long long)in[3] << 24;
93     result |= (unsigned long long)in[4] << 32;
94     result |= (unsigned long long)in[5] << 40;
95     
96     return result;
97 }
98
99 /* Write a 32-bit quantity out into memory in BIG ENDIAN order */
100 void write_be32(unsigned long in, unsigned char *out)
101 {
102     out[0] = (in >> 24) & 0xFF;
103     out[1] = (in >> 16) & 0xFF;
104     out[2] = (in >> 8) & 0xFF;
105     out[3] = in & 0xFF;
106 }
107
108 /* Read in a 32-bit BIG ENDIAN quantity */
109 unsigned long read_be32(unsigned char * in)
110 {
111     unsigned long result = 0;
112
113     result |= (unsigned long)in[0] << 24;
114     result |= (unsigned long)in[1] << 16;
115     result |= (unsigned long)in[2] << 8;
116     result |= (unsigned long)in[3];
117     
118     return result;
119 }
120
121 /* Write a 32-bit quantity out into memory in LITTLE ENDIAN order */
122 void write_le32(unsigned long in, unsigned char *out)
123 {
124     out[0] = in & 0xFF;
125     out[1] = (in >> 8) & 0xFF;
126     out[2] = (in >> 16) & 0xFF;
127     out[3] = (in >> 24) & 0xFF;
128 }
129
130 /* Read in a 32-bit LITTLE ENDIAN quantity */
131 unsigned long read_le32(unsigned char *in)
132 {
133     unsigned long result = 0;
134
135     result |= (unsigned long)in[0];
136     result |= (unsigned long)in[1] << 8;
137     result |= (unsigned long)in[2] << 16;
138     result |= (unsigned long)in[3] << 24;
139     
140     return result;
141 }
142
143 /* Write a 16-bit quantity out into memory in BIG ENDIAN order */
144 void write_be16(unsigned short in, unsigned char *out)
145 {
146     out[0] = (in >> 8) & 0xFF;
147     out[1] = in & 0xFF;
148 }
149     
150 /* Read in a 16-bit BIG ENDIAN quantity */
151 unsigned short read_be16(unsigned char *in)
152 {
153     unsigned short result = 0;
154     
155     result |= (unsigned short)in[0] << 8;
156     result |= (unsigned short)in[1];
157     return result;
158 }
159
160 /* Write a 16-bit quantity out into memory in LITTLE ENDIAN order */
161 void write_le16(unsigned short in, unsigned char *out)
162 {
163     out[0] = in & 0xFF;
164     out[1] = in & 0xFF >> 8;
165 }
166     
167 /* Read in a 16-bit LITTLE ENDIAN quantity */
168 unsigned short read_le16(unsigned char *in)
169 {
170     unsigned short result = 0;
171     
172     result |= (unsigned short)in[0];
173     result |= (unsigned short)in[1] << 8;
174     return result;
175 }
176