Initial commit based on common repo commit ffeb9c9b
This commit is contained in:
150
libs/3rd-party/mseed/gswap.c
vendored
Normal file
150
libs/3rd-party/mseed/gswap.c
vendored
Normal file
@@ -0,0 +1,150 @@
|
||||
/***************************************************************************
|
||||
* gswap.c:
|
||||
*
|
||||
* Functions for generalized, in-pace 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 "lmplatform.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;
|
||||
}
|
||||
Reference in New Issue
Block a user