You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.4 KiB
66 lines
1.4 KiB
/*
|
|
* Copyright 2018, University Corporation for Atmospheric Research
|
|
* See netcdf/COPYRIGHT file for copying and redistribution conditions.
|
|
*/
|
|
|
|
|
|
#include "config.h"
|
|
#include "netcdf_filter_build.h"
|
|
|
|
/*
|
|
Common utilities related to filters.
|
|
Taken from libdispatch/dfilters.c.
|
|
*/
|
|
|
|
#ifdef WORDS_BIGENDIAN
|
|
/* Byte swap an 8-byte integer in place */
|
|
static void
|
|
byteswap8(unsigned char* mem)
|
|
{
|
|
unsigned char c;
|
|
c = mem[0];
|
|
mem[0] = mem[7];
|
|
mem[7] = c;
|
|
c = mem[1];
|
|
mem[1] = mem[6];
|
|
mem[6] = c;
|
|
c = mem[2];
|
|
mem[2] = mem[5];
|
|
mem[5] = c;
|
|
c = mem[3];
|
|
mem[3] = mem[4];
|
|
mem[4] = c;
|
|
}
|
|
|
|
/* Byte swap an 8-byte integer in place */
|
|
static void
|
|
byteswap4(unsigned char* mem)
|
|
{
|
|
unsigned char c;
|
|
c = mem[0];
|
|
mem[0] = mem[3];
|
|
mem[3] = c;
|
|
c = mem[1];
|
|
mem[1] = mem[2];
|
|
mem[2] = c;
|
|
}
|
|
#endif /*WORDS_BIGENDIAN*/
|
|
|
|
void
|
|
NC_h5filterspec_fix8(void* mem0, int decode)
|
|
{
|
|
#ifdef WORDS_BIGENDIAN
|
|
unsigned char* mem = mem0;
|
|
if(decode) { /* Apply inverse of the encode case */
|
|
byteswap4(mem); /* step 1: byte-swap each piece */
|
|
byteswap4(mem+4);
|
|
byteswap8(mem); /* step 2: convert to little endian format */
|
|
} else { /* encode */
|
|
byteswap8(mem); /* step 1: convert to little endian format */
|
|
byteswap4(mem); /* step 2: byte-swap each piece */
|
|
byteswap4(mem+4);
|
|
}
|
|
#else /* Little endian */
|
|
/* No action is necessary */
|
|
#endif
|
|
}
|
|
|