1 /* 2 * Copyright 2018, University Corporation for Atmospheric Research 3 * See netcdf/COPYRIGHT file for copying and redistribution conditions. 4 */ 5 6 7 #include <hdf5.h> 8 9 /* 10 Common utilities related to filters. 11 Taken from libdispatch/dfilters.c. 12 */ 13 14 #ifdef WORDS_BIGENDIAN 15 /* Byte swap an 8-byte integer in place */ 16 static void byteswap8(unsigned char * mem)17byteswap8(unsigned char* mem) 18 { 19 unsigned char c; 20 c = mem[0]; 21 mem[0] = mem[7]; 22 mem[7] = c; 23 c = mem[1]; 24 mem[1] = mem[6]; 25 mem[6] = c; 26 c = mem[2]; 27 mem[2] = mem[5]; 28 mem[5] = c; 29 c = mem[3]; 30 mem[3] = mem[4]; 31 mem[4] = c; 32 } 33 34 /* Byte swap an 8-byte integer in place */ 35 static void byteswap4(unsigned char * mem)36byteswap4(unsigned char* mem) 37 { 38 unsigned char c; 39 c = mem[0]; 40 mem[0] = mem[3]; 41 mem[3] = c; 42 c = mem[1]; 43 mem[1] = mem[2]; 44 mem[2] = c; 45 } 46 #endif /*WORDS_BIGENDIAN*/ 47 48 void NC_filterfix8(void * mem0,int decode)49NC_filterfix8(void* mem0, int decode) 50 { 51 #ifdef WORDS_BIGENDIAN 52 unsigned char* mem = mem0; 53 if(decode) { /* Apply inverse of the encode case */ 54 byteswap4(mem); /* step 1: byte-swap each piece */ 55 byteswap4(mem+4); 56 byteswap8(mem); /* step 2: convert to little endian format */ 57 } else { /* encode */ 58 byteswap8(mem); /* step 1: convert to little endian format */ 59 byteswap4(mem); /* step 2: byte-swap each piece */ 60 byteswap4(mem+4); 61 } 62 #else /* Little endian */ 63 /* No action is necessary */ 64 #endif 65 } 66