Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
/* Header for jnetpcap_utils utility methods */
#ifndef _Included_nio_jbuffer_h
#define _Included_nio_jbuffer_h
#ifdef __cplusplus
extern "C" {
#define EXTERN extern "C"
#endif
#include "export.h"
#include <jni.h>
/****************************************************************
* **************************************************************
*
* JNI IDs
*
* **************************************************************
****************************************************************/
extern jfieldID jbufferOrderFID;
extern jfieldID jbufferReadonlyFID;
/****************************************************************
* **************************************************************
*
* ENDIAN MACROS - swap bytes for proper endianess
*
* **************************************************************
****************************************************************/
#define ENDIAN16_ATOM_SWAP(data) (\
((((uint16_t)data) >> 8) & 0x00FF) | ((((uint16_t)data) << 8) & 0xFF00))
#define ENDIAN32_ATOM_SWAP(data) (\
( (((uint32_t)data) >> 24) & 0x000000FF) | ((((uint32_t)data) >> 8) & 0x0000FF00) |\
( (((uint32_t)data) << 8) & 0x00FF0000) | ((((uint32_t)data) << 24) & 0xFF000000))
#define ENDIAN64_ATOM_SWAP(data) (\
( (((uint64_t)data) >> 56) & 0x00000000000000FFLLU) | ((((uint64_t)data) >> 40) & 0x000000000000FF00LLU) |\
( (((uint64_t)data) >> 24) & 0x0000000000FF0000LLU) | ((((uint64_t)data) >> 8) & 0x00000000FF000000LLU) |\
( (((uint64_t)data) << 8) & 0x000000FF00000000LLU) | ((((uint64_t)data) << 24) & 0x0000FF0000000000LLU) |\
( (((uint64_t)data) << 40) & 0x00FF000000000000LLU) | ((((uint64_t)data) << 56) & 0xFF00000000000000LLU) \
)
#define ENDIAN16_PTR_SWAP(data) \
((uint16_t)*(data + 0) << 8) | ((uint16_t)*(data + 1))
#define ENDIAN32_PTR_SWAP(data) \
((uint32_t)*(data + 0) << 24) | ((uint32_t)*(data + 3) ) |\
((uint32_t)*(data + 1) << 16) | ((uint32_t)*(data + 2) << 8)
#define ENDIAN64_PTR_SWAP(data) \
((uint64_t)*(data + 0) << 56) | ((uint64_t)*(data + 7) ) |\
((uint64_t)*(data + 1) << 48) | ((uint64_t)*(data + 6) << 8) |\
((uint64_t)*(data + 2) << 40) | ((uint64_t)*(data + 5) << 16) |\
((uint64_t)*(data + 3) << 32) | ((uint64_t)*(data + 4) << 24)
/*
* These macros test for requested BIG ENDIAN condition and appropriately define
* the correct byte swap macro for various CPU ENDIAN platforms.
*
* Usage - if cond is TRUE will ensure that BIG_ENDIAN is returned on both
* LITTLE AND BIG platforms. If cond is FALSE then LITTLE_ENDIAN will be
* returned.
*/
#if __BYTE_ORDER == __LITTLE_ENDIAN
#define ENDIAN16_GET(big, data) ((big == JNI_TRUE)?ENDIAN16_ATOM_SWAP(data):data)
#define ENDIAN32_GET(big, data) ((big == JNI_TRUE)?ENDIAN32_ATOM_SWAP(data):data)
#define ENDIAN64_GET(big, data) ((big == JNI_TRUE)?ENDIAN64_ATOM_SWAP(data):data)
#define BIG_ENDIAN16(data) ENDIAN16_ATOM_SWAP(data)
#define BIG_ENDIAN32(data) ENDIAN32_ATOM_SWAP(data)
#define BIG_ENDIAN64(data) ENDIAN64_ATOM_SWAP(data)
#define LITTLE_ENDIAN16(data) data
#define LITTLE_ENDIAN32(data) data
#define LITTLE_ENDIAN64(data) data
#elif __BYTE_ORDER == __BIG_ENDIAN
#define ENDIAN16_GET(big, data) ((big == JNI_TRUE)?data:ENDIAN16_ATOM_SWAP(data))
#define ENDIAN32_GET(big, data) ((big == JNI_TRUE)?data:ENDIAN32_ATOM_SWAP(data))
#define ENDIAN64_GET(big, data) ((big == JNI_TRUE)?data:ENDIAN64_ATOM_SWAP(data))
#define BIG_ENDIAN16(data) data
#define BIG_ENDIAN32(data) data
#define BIG_ENDIAN64(data) data
#define LITTLE_ENDIAN16(data) ENDIAN16_ATOM_SWAP(data)
#define LITTLE_ENDIAN32(data) ENDIAN32_ATOM_SWAP(data)
#define LITTLE_ENDIAN64(data) ENDIAN64_ATOM_SWAP(data)
#else
# error "ENDIAN MACROS NOT DEFINED :("
#endif
#ifdef __cplusplus
}
#endif
#endif