kamailio.cfg: removed sample db_mode parameter for domain module
[sip-router] / endianness.h
1 /* 
2  * $Id$
3  * 
4  * Copyright (C) 2008 iptelorg GmbH
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18
19 /** @file
20  *  endianness compile and runtime  tests
21  * 
22  * History:
23  * --------
24  *  2008-06-13  created by andrei
25  *
26  * Defines:
27  *  -  __IS_LITTLE_ENDIAN if the system is little endian and
28  *  -  __IS_BIG_ENDIAN    if it's big endian
29  * Function/macros:
30  *  -   is_big_endian()  - runtime test for big endian
31  *  -   is_little_endian() - runtime test for little endian
32  *  -   endianness_sanity_check() - returns 0 if the compile time
33  *                                  detected endianness corresponds to
34  *                                  the runtime detected one and -1 on 
35  *                                  error (recommended action: bail out)
36  *
37  * Implementation notes:
38  * Endian macro names/tests for different OSes:
39  * linux:  __BYTE_ORDER == __LITTLE_ENDIAN | __BIG_ENDIAN
40  *           BYTE_ORDER == LITTLE_ENDIAN | BIG_ENDIAN
41  * bsd:     _BYTE_ORDER == _LITTLE_ENDIAN | _BIG_ENDIAN
42  *           BYTE_ORDER == LITTLE_ENDIAN | BIG_ENDIAN
43  * solaris: _LITTLE_ENDIAN | _BIG_ENDIAN
44  *
45  * Include file for the endian macros:
46  * linux: <endian.h> (glibc), <sys/param.h>
47  * bsd:   <sys/param.h>, <sys/endian.h>
48  * solaris: <sys/param.h>
49  *
50  * Note: BIG_ENDIAN, LITTLE_ENDIAN, _BIG_ENDIAN, _LITTLE_ENDIAN cannot be 
51  *       used always,  some OSes define both of them for BYTE_ORDER use
52  *       (e.g. linux defines both BIG_ENDIAN & LITTLE_ENDIAN, bsds define
53  *          _BIG_ENDIAN, _LITTLE_ENDIAN, BIG_ENDIAN, LITTLE_ENDIAN)
54  *
55  */
56
57
58 #ifndef _endianness_h
59 #define _endianness_h
60
61 /* use bsd includes: they work everywhere */
62 #include <sys/types.h>
63 #include <sys/param.h>
64
65
66
67 extern int _endian_test_int;
68
69 /* returns 1 for little endian, 0 for big endian */
70 #define endian_test()           (*(char*)&_endian_test_int==1)
71 #define is_big_endian()         (!endian_test())
72 #define is_little_endian()      endian_test()
73
74
75 extern int endianness_sanity_check(void);
76
77 /* detect compile time endianess */
78 #if defined __BYTE_ORDER && defined __LITTLE_ENDIAN && defined __BIG_ENDIAN
79 /* linux */
80 #if __BYTE_ORDER == __LITTLE_ENDIAN && ! defined __IS_LITTLE_ENDIAN
81         #define __IS_LITTLE_ENDIAN 0x01020304
82 #endif
83 #if __BYTE_ORDER == __BIG_ENDIAN && ! defined __IS_BIG_ENDIAN
84         #define __IS_BIG_ENDIAN 0x01020304
85 #endif
86 #elif defined _BYTE_ORDER && defined _LITTLE_ENDIAN && defined _BIG_ENDIAN
87 /* bsd */
88 #if _BYTE_ORDER == _LITTLE_ENDIAN && ! defined __IS_LITTLE_ENDIAN
89         #define __IS_LITTLE_ENDIAN 0x01020304
90 #endif
91 #if _BYTE_ORDER == _BIG_ENDIAN && ! defined __IS_BIG_ENDIAN
92         #define __IS_BIG_ENDIAN 0x01020304
93 #endif
94 #elif defined BYTE_ORDER && defined LITTLE_ENDIAN && defined BIG_ENDIAN
95 /* bsd old/deprecated */
96 #if BYTE_ORDER == LITTLE_ENDIAN && ! defined __IS_LITTLE_ENDIAN
97         #define __IS_LITTLE_ENDIAN 0x01020304
98 #endif
99 #if BYTE_ORDER == BIG_ENDIAN && ! defined __IS_BIG_ENDIAN
100         #define __IS_BIG_ENDIAN 0x01020304
101 #endif
102 #elif !(defined _LITTLE_ENDIAN && defined _BIG_ENDIAN) && \
103                 (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
104 /* OSes that don't define BYTE_ORDER (sanity check above makes sure
105  *   little & big endian are not defined in the same time )*/
106 /* solaris */
107 #if defined _LITTLE_ENDIAN && !defined __IS_LITTLE_ENDIAN
108         #define __IS_LITTLE_ENDIAN 0x01020304
109 #endif
110 #if defined _BIG_ENDIAN && !defined __IS_BIG_ENDIAN
111         #define __IS_BIG_ENDIAN 0x04030201
112 #endif
113 #elif !(defined LITTLE_ENDIAN && defined BIG_ENDIAN) && \
114                 (defined LITTLE_ENDIAN || defined BIG_ENDIAN)
115 /* OSes that don't define BYTE_ORDER (sanity check above makes sure
116  *   little & big endian are not defined in the same time )*/
117 #if defined LITTLE_ENDIAN && !defined __IS_LITTLE_ENDIAN
118         #define __IS_LITTLE_ENDIAN 0x01020304
119 #endif
120 #if defined BIG_ENDIAN && !defined __IS_BIG_ENDIAN
121         #define __IS_BIG_ENDIAN 0x04030201
122 #endif
123
124 #else
125 #error could not detect endianess
126 #endif
127
128 #if !defined __IS_LITTLE_ENDIAN && !defined __IS_BIG_ENDIAN
129 #error BUG: could not detect endianess
130 #endif
131
132 #if defined __IS_LITTLE_ENDIAN && defined __IS_BIG_ENDIAN
133 #error BUG: both little & big endian detected in the same time
134 #endif
135
136
137 #endif /* _endianness_h */
138