1*58a2b000SEvgeniy Ivanov /* $NetBSD: byteorder.c,v 1.3 2007/11/24 13:20:54 isaki Exp $ */
2*58a2b000SEvgeniy Ivanov
3*58a2b000SEvgeniy Ivanov /*
4*58a2b000SEvgeniy Ivanov * Copyright 2001 Wasabi Systems, Inc.
5*58a2b000SEvgeniy Ivanov * All rights reserved.
6*58a2b000SEvgeniy Ivanov *
7*58a2b000SEvgeniy Ivanov * Written by Jason R. Thorpe for Wasabi Systems, Inc.
8*58a2b000SEvgeniy Ivanov *
9*58a2b000SEvgeniy Ivanov * Redistribution and use in source and binary forms, with or without
10*58a2b000SEvgeniy Ivanov * modification, are permitted provided that the following conditions
11*58a2b000SEvgeniy Ivanov * are met:
12*58a2b000SEvgeniy Ivanov * 1. Redistributions of source code must retain the above copyright
13*58a2b000SEvgeniy Ivanov * notice, this list of conditions and the following disclaimer.
14*58a2b000SEvgeniy Ivanov * 2. Redistributions in binary form must reproduce the above copyright
15*58a2b000SEvgeniy Ivanov * notice, this list of conditions and the following disclaimer in the
16*58a2b000SEvgeniy Ivanov * documentation and/or other materials provided with the distribution.
17*58a2b000SEvgeniy Ivanov * 3. All advertising materials mentioning features or use of this software
18*58a2b000SEvgeniy Ivanov * must display the following acknowledgement:
19*58a2b000SEvgeniy Ivanov * This product includes software developed for the NetBSD Project by
20*58a2b000SEvgeniy Ivanov * Wasabi Systems, Inc.
21*58a2b000SEvgeniy Ivanov * 4. The name of Wasabi Systems, Inc. may not be used to endorse
22*58a2b000SEvgeniy Ivanov * or promote products derived from this software without specific prior
23*58a2b000SEvgeniy Ivanov * written permission.
24*58a2b000SEvgeniy Ivanov *
25*58a2b000SEvgeniy Ivanov * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
26*58a2b000SEvgeniy Ivanov * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27*58a2b000SEvgeniy Ivanov * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28*58a2b000SEvgeniy Ivanov * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL WASABI SYSTEMS, INC
29*58a2b000SEvgeniy Ivanov * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30*58a2b000SEvgeniy Ivanov * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31*58a2b000SEvgeniy Ivanov * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32*58a2b000SEvgeniy Ivanov * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33*58a2b000SEvgeniy Ivanov * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34*58a2b000SEvgeniy Ivanov * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35*58a2b000SEvgeniy Ivanov * POSSIBILITY OF SUCH DAMAGE.
36*58a2b000SEvgeniy Ivanov */
37*58a2b000SEvgeniy Ivanov
38*58a2b000SEvgeniy Ivanov #include "byteorder.h"
39*58a2b000SEvgeniy Ivanov
40*58a2b000SEvgeniy Ivanov typedef union {
41*58a2b000SEvgeniy Ivanov uint16_t val;
42*58a2b000SEvgeniy Ivanov uint8_t bytes[2];
43*58a2b000SEvgeniy Ivanov } un16;
44*58a2b000SEvgeniy Ivanov
45*58a2b000SEvgeniy Ivanov typedef union {
46*58a2b000SEvgeniy Ivanov uint32_t val;
47*58a2b000SEvgeniy Ivanov uint8_t bytes[4];
48*58a2b000SEvgeniy Ivanov } un32;
49*58a2b000SEvgeniy Ivanov
50*58a2b000SEvgeniy Ivanov typedef union {
51*58a2b000SEvgeniy Ivanov uint64_t val;
52*58a2b000SEvgeniy Ivanov uint32_t words[2];
53*58a2b000SEvgeniy Ivanov } un64;
54*58a2b000SEvgeniy Ivanov
55*58a2b000SEvgeniy Ivanov /* 16-bit */
56*58a2b000SEvgeniy Ivanov
57*58a2b000SEvgeniy Ivanov uint16_t
sa_htobe16(uint16_t val)58*58a2b000SEvgeniy Ivanov sa_htobe16(uint16_t val)
59*58a2b000SEvgeniy Ivanov {
60*58a2b000SEvgeniy Ivanov un16 un;
61*58a2b000SEvgeniy Ivanov
62*58a2b000SEvgeniy Ivanov un.bytes[1] = val & 0xff;
63*58a2b000SEvgeniy Ivanov un.bytes[0] = (val >> 8) & 0xff;
64*58a2b000SEvgeniy Ivanov
65*58a2b000SEvgeniy Ivanov return un.val;
66*58a2b000SEvgeniy Ivanov }
67*58a2b000SEvgeniy Ivanov
68*58a2b000SEvgeniy Ivanov uint16_t
sa_htole16(uint16_t val)69*58a2b000SEvgeniy Ivanov sa_htole16(uint16_t val)
70*58a2b000SEvgeniy Ivanov {
71*58a2b000SEvgeniy Ivanov un16 un;
72*58a2b000SEvgeniy Ivanov
73*58a2b000SEvgeniy Ivanov un.bytes[0] = val & 0xff;
74*58a2b000SEvgeniy Ivanov un.bytes[1] = (val >> 8) & 0xff;
75*58a2b000SEvgeniy Ivanov
76*58a2b000SEvgeniy Ivanov return un.val;
77*58a2b000SEvgeniy Ivanov }
78*58a2b000SEvgeniy Ivanov
79*58a2b000SEvgeniy Ivanov uint16_t
sa_be16toh(uint16_t val)80*58a2b000SEvgeniy Ivanov sa_be16toh(uint16_t val)
81*58a2b000SEvgeniy Ivanov {
82*58a2b000SEvgeniy Ivanov un16 un;
83*58a2b000SEvgeniy Ivanov
84*58a2b000SEvgeniy Ivanov un.val = val;
85*58a2b000SEvgeniy Ivanov
86*58a2b000SEvgeniy Ivanov return ((un.bytes[0] << 8) |
87*58a2b000SEvgeniy Ivanov un.bytes[1]);
88*58a2b000SEvgeniy Ivanov }
89*58a2b000SEvgeniy Ivanov
90*58a2b000SEvgeniy Ivanov uint16_t
sa_le16toh(uint16_t val)91*58a2b000SEvgeniy Ivanov sa_le16toh(uint16_t val)
92*58a2b000SEvgeniy Ivanov {
93*58a2b000SEvgeniy Ivanov un16 un;
94*58a2b000SEvgeniy Ivanov
95*58a2b000SEvgeniy Ivanov un.val = val;
96*58a2b000SEvgeniy Ivanov
97*58a2b000SEvgeniy Ivanov return ((un.bytes[1] << 8) |
98*58a2b000SEvgeniy Ivanov un.bytes[0]);
99*58a2b000SEvgeniy Ivanov }
100*58a2b000SEvgeniy Ivanov
101*58a2b000SEvgeniy Ivanov /* 32-bit */
102*58a2b000SEvgeniy Ivanov
103*58a2b000SEvgeniy Ivanov uint32_t
sa_htobe32(uint32_t val)104*58a2b000SEvgeniy Ivanov sa_htobe32(uint32_t val)
105*58a2b000SEvgeniy Ivanov {
106*58a2b000SEvgeniy Ivanov un32 un;
107*58a2b000SEvgeniy Ivanov
108*58a2b000SEvgeniy Ivanov un.bytes[3] = val & 0xff;
109*58a2b000SEvgeniy Ivanov un.bytes[2] = (val >> 8) & 0xff;
110*58a2b000SEvgeniy Ivanov un.bytes[1] = (val >> 16) & 0xff;
111*58a2b000SEvgeniy Ivanov un.bytes[0] = (val >> 24) & 0xff;
112*58a2b000SEvgeniy Ivanov
113*58a2b000SEvgeniy Ivanov return un.val;
114*58a2b000SEvgeniy Ivanov }
115*58a2b000SEvgeniy Ivanov
116*58a2b000SEvgeniy Ivanov uint32_t
sa_htole32(uint32_t val)117*58a2b000SEvgeniy Ivanov sa_htole32(uint32_t val)
118*58a2b000SEvgeniy Ivanov {
119*58a2b000SEvgeniy Ivanov un32 un;
120*58a2b000SEvgeniy Ivanov
121*58a2b000SEvgeniy Ivanov un.bytes[0] = val & 0xff;
122*58a2b000SEvgeniy Ivanov un.bytes[1] = (val >> 8) & 0xff;
123*58a2b000SEvgeniy Ivanov un.bytes[2] = (val >> 16) & 0xff;
124*58a2b000SEvgeniy Ivanov un.bytes[3] = (val >> 24) & 0xff;
125*58a2b000SEvgeniy Ivanov
126*58a2b000SEvgeniy Ivanov return un.val;
127*58a2b000SEvgeniy Ivanov }
128*58a2b000SEvgeniy Ivanov
129*58a2b000SEvgeniy Ivanov uint32_t
sa_be32toh(uint32_t val)130*58a2b000SEvgeniy Ivanov sa_be32toh(uint32_t val)
131*58a2b000SEvgeniy Ivanov {
132*58a2b000SEvgeniy Ivanov un32 un;
133*58a2b000SEvgeniy Ivanov
134*58a2b000SEvgeniy Ivanov un.val = val;
135*58a2b000SEvgeniy Ivanov
136*58a2b000SEvgeniy Ivanov return ((un.bytes[0] << 24) |
137*58a2b000SEvgeniy Ivanov (un.bytes[1] << 16) |
138*58a2b000SEvgeniy Ivanov (un.bytes[2] << 8) |
139*58a2b000SEvgeniy Ivanov un.bytes[3]);
140*58a2b000SEvgeniy Ivanov }
141*58a2b000SEvgeniy Ivanov
142*58a2b000SEvgeniy Ivanov uint32_t
sa_le32toh(uint32_t val)143*58a2b000SEvgeniy Ivanov sa_le32toh(uint32_t val)
144*58a2b000SEvgeniy Ivanov {
145*58a2b000SEvgeniy Ivanov un32 un;
146*58a2b000SEvgeniy Ivanov
147*58a2b000SEvgeniy Ivanov un.val = val;
148*58a2b000SEvgeniy Ivanov
149*58a2b000SEvgeniy Ivanov return ((un.bytes[3] << 24) |
150*58a2b000SEvgeniy Ivanov (un.bytes[2] << 16) |
151*58a2b000SEvgeniy Ivanov (un.bytes[1] << 8) |
152*58a2b000SEvgeniy Ivanov un.bytes[0]);
153*58a2b000SEvgeniy Ivanov }
154*58a2b000SEvgeniy Ivanov
155*58a2b000SEvgeniy Ivanov /* 64-bit */
156*58a2b000SEvgeniy Ivanov
157*58a2b000SEvgeniy Ivanov uint64_t
sa_htobe64(uint64_t val)158*58a2b000SEvgeniy Ivanov sa_htobe64(uint64_t val)
159*58a2b000SEvgeniy Ivanov {
160*58a2b000SEvgeniy Ivanov un64 un;
161*58a2b000SEvgeniy Ivanov
162*58a2b000SEvgeniy Ivanov un.words[BE64_HI] = sa_htobe32(val >> 32);
163*58a2b000SEvgeniy Ivanov un.words[BE64_LO] = sa_htobe32(val & 0xffffffffU);
164*58a2b000SEvgeniy Ivanov
165*58a2b000SEvgeniy Ivanov return un.val;
166*58a2b000SEvgeniy Ivanov }
167*58a2b000SEvgeniy Ivanov
168*58a2b000SEvgeniy Ivanov uint64_t
sa_htole64(uint64_t val)169*58a2b000SEvgeniy Ivanov sa_htole64(uint64_t val)
170*58a2b000SEvgeniy Ivanov {
171*58a2b000SEvgeniy Ivanov un64 un;
172*58a2b000SEvgeniy Ivanov
173*58a2b000SEvgeniy Ivanov un.words[LE64_HI] = sa_htole32(val >> 32);
174*58a2b000SEvgeniy Ivanov un.words[LE64_LO] = sa_htole32(val & 0xffffffffU);
175*58a2b000SEvgeniy Ivanov
176*58a2b000SEvgeniy Ivanov return un.val;
177*58a2b000SEvgeniy Ivanov }
178*58a2b000SEvgeniy Ivanov
179*58a2b000SEvgeniy Ivanov uint64_t
sa_be64toh(uint64_t val)180*58a2b000SEvgeniy Ivanov sa_be64toh(uint64_t val)
181*58a2b000SEvgeniy Ivanov {
182*58a2b000SEvgeniy Ivanov un64 un;
183*58a2b000SEvgeniy Ivanov uint64_t rv;
184*58a2b000SEvgeniy Ivanov
185*58a2b000SEvgeniy Ivanov un.val = val;
186*58a2b000SEvgeniy Ivanov un.words[BE64_HI] = sa_be32toh(un.words[BE64_HI]);
187*58a2b000SEvgeniy Ivanov un.words[BE64_LO] = sa_be32toh(un.words[BE64_LO]);
188*58a2b000SEvgeniy Ivanov
189*58a2b000SEvgeniy Ivanov rv = (((uint64_t)un.words[BE64_HI]) << 32) |
190*58a2b000SEvgeniy Ivanov un.words[BE64_LO];
191*58a2b000SEvgeniy Ivanov
192*58a2b000SEvgeniy Ivanov return rv;
193*58a2b000SEvgeniy Ivanov }
194*58a2b000SEvgeniy Ivanov
195*58a2b000SEvgeniy Ivanov uint64_t
sa_le64toh(uint64_t val)196*58a2b000SEvgeniy Ivanov sa_le64toh(uint64_t val)
197*58a2b000SEvgeniy Ivanov {
198*58a2b000SEvgeniy Ivanov un64 un;
199*58a2b000SEvgeniy Ivanov uint64_t rv;
200*58a2b000SEvgeniy Ivanov
201*58a2b000SEvgeniy Ivanov un.val = val;
202*58a2b000SEvgeniy Ivanov un.words[LE64_HI] = sa_le32toh(un.words[LE64_HI]);
203*58a2b000SEvgeniy Ivanov un.words[LE64_LO] = sa_le32toh(un.words[LE64_LO]);
204*58a2b000SEvgeniy Ivanov
205*58a2b000SEvgeniy Ivanov rv = (((uint64_t)un.words[LE64_HI]) << 32) |
206*58a2b000SEvgeniy Ivanov un.words[LE64_LO];
207*58a2b000SEvgeniy Ivanov
208*58a2b000SEvgeniy Ivanov return rv;
209*58a2b000SEvgeniy Ivanov }
210