-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathendian.cc
125 lines (111 loc) · 2.16 KB
/
endian.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/* endian - Manages the endian-ness of data.
PIRL CVS ID: $Id: endian.cc,v 1.13 2009/10/03 00:00:39 castalia Exp $
Copyright (C) 2003, 2004, 2005 Arizona Board of Regents
on behalf of the Planetary Image Research Laboratory,
Lunar and Planetary Laboratory at the University of Arizona.
This library is free software; you can redistribute it and/or modify it
under the terms of the GNU Lesser General Public License, version 2.1,
as published by the Free Software Foundation.
This library is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this library; if not, write to the Free Software Foundation,
Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
namespace PIRL
{
bool
host_is_high_endian ()
{
union
{
unsigned int integer;
unsigned char bytes[sizeof (int)];
}
value;
value.integer = 0;
value.bytes[0] = 1;
return (value.integer != 1);
}
void
reorder_bytes
(
unsigned char* data,
const unsigned long amount
)
{
register unsigned char
datum,
*end = data + amount;
while (data < --end)
{
datum = *data;
*data++ = *end;
*end = datum;
}
}
void
reorder_bytes
(
unsigned char* data,
const unsigned long groups,
const unsigned int size
)
{
if (! data)
return;
if (size == 1)
{
reorder_bytes (data, groups);
return;
}
register unsigned char
datum,
*end = data + (groups * size);
register unsigned int
counter;
while (data < (end -= size))
{
for (counter = size;
counter--;)
{
datum = *data;
*data++ = *end;
*end++ = datum;
}
(end -= size);
}
}
void
swap_bytes
(
unsigned char* data,
const unsigned int groups,
const unsigned int size
)
{
if (! data)
return;
if (size < 1)
return;
register unsigned char
datum,
*end = data + (groups * size),
*first,
*last;
while (data < end)
{
first = data;
data += size;
last = data;
while (first < --last)
{
datum = *first;
*first++ = *last;
*last = datum;
}
}
}
} // PIRL namespace