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 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
/***************************************************************************
* gswap.c:
*
* Functions for generalized, in-place byte swapping between LSBF and
* MSBF byte orders.
*
* Some standard integer types are needed, namely uint8_t and
* uint32_t, (these are normally declared by including inttypes.h or
* stdint.h). Each function expects it's input to be a void pointer
* to a quantity of the appropriate size.
*
* There are two versions of most routines, one that works on
* quantities regardless of alignment (gswapX) and one that works on
* memory aligned quantities (gswapXa). The memory aligned versions
* (gswapXa) are much faster than the other versions (gswapX), but the
* memory *must* be aligned.
*
* Written by Chad Trabant,
* IRIS Data Management Center
*
* Version: 2010.006
***************************************************************************/
#include "libmseed.h"
/* Swap routines that work on any (aligned or not) quantities */
void
ms_gswap2 (void *data2)
{
uint8_t temp;
union {
uint8_t c[2];
} dat;
memcpy (&dat, data2, 2);
temp = dat.c[0];
dat.c[0] = dat.c[1];
dat.c[1] = temp;
memcpy (data2, &dat, 2);
}
void
ms_gswap3 (void *data3)
{
uint8_t temp;
union {
uint8_t c[3];
} dat;
memcpy (&dat, data3, 3);
temp = dat.c[0];
dat.c[0] = dat.c[2];
dat.c[2] = temp;
memcpy (data3, &dat, 3);
}
void
ms_gswap4 (void *data4)
{
uint8_t temp;
union {
uint8_t c[4];
} dat;
memcpy (&dat, data4, 4);
temp = dat.c[0];
dat.c[0] = dat.c[3];
dat.c[3] = temp;
temp = dat.c[1];
dat.c[1] = dat.c[2];
dat.c[2] = temp;
memcpy (data4, &dat, 4);
}
void
ms_gswap8 (void *data8)
{
uint8_t temp;
union {
uint8_t c[8];
} dat;
memcpy (&dat, data8, 8);
temp = dat.c[0];
dat.c[0] = dat.c[7];
dat.c[7] = temp;
temp = dat.c[1];
dat.c[1] = dat.c[6];
dat.c[6] = temp;
temp = dat.c[2];
dat.c[2] = dat.c[5];
dat.c[5] = temp;
temp = dat.c[3];
dat.c[3] = dat.c[4];
dat.c[4] = temp;
memcpy (data8, &dat, 8);
}
/* Swap routines that work on memory aligned quantities */
void
ms_gswap2a (void *data2)
{
uint16_t *data = data2;
*data = (((*data >> 8) & 0xff) | ((*data & 0xff) << 8));
}
void
ms_gswap4a (void *data4)
{
uint32_t *data = data4;
*data = (((*data >> 24) & 0xff) | ((*data & 0xff) << 24) |
((*data >> 8) & 0xff00) | ((*data & 0xff00) << 8));
}
void
ms_gswap8a (void *data8)
{
uint32_t *data4 = data8;
uint32_t h0, h1;
h0 = data4[0];
h0 = (((h0 >> 24) & 0xff) | ((h0 & 0xff) << 24) |
((h0 >> 8) & 0xff00) | ((h0 & 0xff00) << 8));
h1 = data4[1];
h1 = (((h1 >> 24) & 0xff) | ((h1 & 0xff) << 24) |
((h1 >> 8) & 0xff00) | ((h1 & 0xff00) << 8));
data4[0] = h1;
data4[1] = h0;
}
|