byte_order.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #ifndef lint
  2. static char rcsid[] = "$Header$";
  3. #endif lint
  4. #include "const.h"
  5. #include "assert.h"
  6. bool bytes_reversed = FALSE;
  7. bool words_reversed = FALSE;
  8. /*
  9. * Determine the byte/word order in shorts/longs, assuming the size of a short
  10. * is 2 chars, and the size of a long is 4 chars. Not all theoretical
  11. * possibilities are tested; only bytes reversed and/or words reversed.
  12. */
  13. determine_ordering()
  14. {
  15. short s;
  16. long l;
  17. register char *cp;
  18. register short *sp;
  19. cp = (char *)&s;
  20. cp[0] = 0x01; cp[1] = 0x02;
  21. if (s != 0x01 + (0x02 << 8))
  22. bytes_reversed = TRUE;
  23. sp = (short *)&l;
  24. sp[0] = 0x0001; sp[1] = 0x0002;
  25. if (l != 0x0001 + (0x0002L << 16))
  26. words_reversed = TRUE;
  27. }
  28. /*
  29. * `Format' is a string of digits indicating how many bytes must be taken
  30. * from `buf' to form an integer of some type. E.g. if the digit is '2', two
  31. * bytes are taken to form a short.
  32. */
  33. swap(buf, format)
  34. register char *buf;
  35. register char *format;
  36. {
  37. register char savebyte;
  38. while (*format) {
  39. switch (*format++) {
  40. case '1':
  41. buf += 1;
  42. break;
  43. case '2':
  44. if (bytes_reversed) {
  45. savebyte = buf[0];
  46. buf[0] = buf[1];
  47. buf[1] = savebyte;
  48. }
  49. buf += 2;
  50. break;
  51. case '4':
  52. /*
  53. * Written out to save recursive calls.
  54. */
  55. if (bytes_reversed && words_reversed) {
  56. savebyte = buf[0];
  57. buf[0] = buf[3];
  58. buf[3] = savebyte;
  59. savebyte = buf[1];
  60. buf[1] = buf[2];
  61. buf[2] = savebyte;
  62. } else if (bytes_reversed) {
  63. savebyte = buf[0];
  64. buf[0] = buf[1];
  65. buf[1] = savebyte;
  66. savebyte = buf[2];
  67. buf[2] = buf[3];
  68. buf[3] = savebyte;
  69. } else if (words_reversed) {
  70. savebyte = buf[0];
  71. buf[0] = buf[2];
  72. buf[2] = savebyte;
  73. savebyte = buf[1];
  74. buf[1] = buf[3];
  75. buf[3] = savebyte;
  76. }
  77. buf += 4;
  78. break;
  79. default:
  80. assert(FALSE);
  81. break;
  82. }
  83. }
  84. }