123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- #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 + (0x0002L << 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;
- }
- }
- }
|