Maybe some minor changes.
This commit is contained in:
90
util/led/byte_order.c
Normal file
90
util/led/byte_order.c
Normal file
@@ -0,0 +1,90 @@
|
||||
#ifndef lint
|
||||
static char rcsid[] = "$Header$";
|
||||
#endif lint
|
||||
|
||||
#include "const.h"
|
||||
#include "assert.h"
|
||||
|
||||
bool bytes_reversed = FALSE;
|
||||
bool words_reversed = FALSE;
|
||||
|
||||
/*
|
||||
* Determine the byte/word order in shorts/longs, assuming the size of a short
|
||||
* is 2 chars, and the size of a long is 4 chars. Not all theoretical
|
||||
* possibilities are tested; only bytes reversed and/or words reversed.
|
||||
*/
|
||||
determine_ordering()
|
||||
{
|
||||
short s;
|
||||
long l;
|
||||
register char *cp;
|
||||
register short *sp;
|
||||
|
||||
cp = (char *)&s;
|
||||
cp[0] = 0x01; cp[1] = 0x02;
|
||||
if (s != 0x01 + (0x02 << 8))
|
||||
bytes_reversed = TRUE;
|
||||
sp = (short *)&l;
|
||||
sp[0] = 0x0001; sp[1] = 0x0002;
|
||||
if (l != 0x0001 + (0x0002 << 16))
|
||||
words_reversed = TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
* `Format' is a string of digits indicating how many bytes must be taken
|
||||
* from `buf' to form an integer of some type. E.g. if the digit is '2', two
|
||||
* bytes are taken to form a short.
|
||||
*/
|
||||
swap(buf, format)
|
||||
register char *buf;
|
||||
register char *format;
|
||||
{
|
||||
register char savebyte;
|
||||
|
||||
while (*format) {
|
||||
switch (*format++) {
|
||||
case '1':
|
||||
buf += 1;
|
||||
break;
|
||||
case '2':
|
||||
if (bytes_reversed) {
|
||||
savebyte = buf[0];
|
||||
buf[0] = buf[1];
|
||||
buf[1] = savebyte;
|
||||
}
|
||||
buf += 2;
|
||||
break;
|
||||
case '4':
|
||||
/*
|
||||
* Written out to save recursive calls.
|
||||
*/
|
||||
if (bytes_reversed && words_reversed) {
|
||||
savebyte = buf[0];
|
||||
buf[0] = buf[3];
|
||||
buf[3] = savebyte;
|
||||
savebyte = buf[1];
|
||||
buf[1] = buf[2];
|
||||
buf[2] = savebyte;
|
||||
} else if (bytes_reversed) {
|
||||
savebyte = buf[0];
|
||||
buf[0] = buf[1];
|
||||
buf[1] = savebyte;
|
||||
savebyte = buf[2];
|
||||
buf[2] = buf[3];
|
||||
buf[3] = savebyte;
|
||||
} else if (words_reversed) {
|
||||
savebyte = buf[0];
|
||||
buf[0] = buf[2];
|
||||
buf[2] = savebyte;
|
||||
savebyte = buf[1];
|
||||
buf[1] = buf[3];
|
||||
buf[3] = savebyte;
|
||||
}
|
||||
buf += 4;
|
||||
break;
|
||||
default:
|
||||
assert(FALSE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user