91 lines
1.8 KiB
C
91 lines
1.8 KiB
C
#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;
|
|
}
|
|
}
|
|
}
|