FrontISTR  5.7.0
Large-scale structural analysis program with finit element method
hecmw_vis_endian.c
Go to the documentation of this file.
1 /*****************************************************************************
2  * Copyright (c) 2019 FrontISTR Commons
3  * This software is released under the MIT License, see LICENSE.txt
4  *****************************************************************************/
5 
6 #include "hecmw_vis_endian.h"
7 
8 static long _TestEndian = 1;
9 
10 int IsLittleEndian(void) { return *(char*)&_TestEndian; }
11 
12 /******************************************************************************
13  FUNCTION: SwapEndian
14  PURPOSE: Swap the byte order of a structure
15  EXAMPLE: float F=123.456;; SWAP_FLOAT(F);
16  ******************************************************************************/
17 
18 void* SwapEndian(void* Addr, const int Nb) {
19  static char Swapped[16];
20  switch (Nb) {
21  case 2:
22  Swapped[0] = *((char*)Addr + 1);
23  Swapped[1] = *((char*)Addr);
24  break;
25  case 3: /* As far as I know, 3 is used only with RGB images */
26  Swapped[0] = *((char*)Addr + 2);
27  Swapped[1] = *((char*)Addr + 1);
28  Swapped[2] = *((char*)Addr);
29  break;
30  case 4:
31  Swapped[0] = *((char*)Addr + 3);
32  Swapped[1] = *((char*)Addr + 2);
33  Swapped[2] = *((char*)Addr + 1);
34  Swapped[3] = *((char*)Addr);
35  break;
36  case 8:
37  Swapped[0] = *((char*)Addr + 7);
38  Swapped[1] = *((char*)Addr + 6);
39  Swapped[2] = *((char*)Addr + 5);
40  Swapped[3] = *((char*)Addr + 4);
41  Swapped[4] = *((char*)Addr + 3);
42  Swapped[5] = *((char*)Addr + 2);
43  Swapped[6] = *((char*)Addr + 1);
44  Swapped[7] = *((char*)Addr);
45  break;
46  case 16:
47  Swapped[0] = *((char*)Addr + 15);
48  Swapped[1] = *((char*)Addr + 14);
49  Swapped[2] = *((char*)Addr + 13);
50  Swapped[3] = *((char*)Addr + 12);
51  Swapped[4] = *((char*)Addr + 11);
52  Swapped[5] = *((char*)Addr + 10);
53  Swapped[6] = *((char*)Addr + 9);
54  Swapped[7] = *((char*)Addr + 8);
55  Swapped[8] = *((char*)Addr + 7);
56  Swapped[9] = *((char*)Addr + 6);
57  Swapped[10] = *((char*)Addr + 5);
58  Swapped[11] = *((char*)Addr + 4);
59  Swapped[12] = *((char*)Addr + 3);
60  Swapped[13] = *((char*)Addr + 2);
61  Swapped[14] = *((char*)Addr + 1);
62  Swapped[15] = *((char*)Addr);
63  break;
64  }
65  return (void*)Swapped;
66 }
hecmw_vis_endian.h
SwapEndian
void * SwapEndian(void *Addr, const int Nb)
Definition: hecmw_vis_endian.c:18
IsLittleEndian
int IsLittleEndian(void)
Definition: hecmw_vis_endian.c:10