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)17 byteswap8(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)36 byteswap4(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)49 NC_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