Merge kamailio modules into sip-router master branch
[sip-router] / test / endian_test.c
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  *  endianness.h tests
20  *  compile/run with:
21  *  gcc  -Wall endian_test.c ../endianness.c  -o endian_test; ./endian_test
22  */
23 /* 
24  * History:
25  * --------
26  *  2008-06-13  created by andrei
27  */
28
29 /*
30  *
31  * Macro names:
32  * linux:  __BYTE_ORDER == __LITTLE_ENDIAN | __BIG_ENDIAN
33  *           BYTE_ORDER == LITTLE_ENDIAN | BIG_ENDIAN
34  * bsd:     _BYTE_ORDER == _LITTLE_ENDIAN | _BIG_ENDIAN
35  *           BYTE_ORDER == LITTLE_ENDIAN | BIG_ENDIAN
36  * solaris: _LITTLE_ENDIAN | _BIG_ENDIAN
37  *
38  * Note: BIG_ENDIAN, LITTLE_ENDIAN, _BIG_ENDIAN, _LITTLE_ENDIAN cannot be 
39  *       used always,  some OSes define both of them for BYTE_ORDER use
40  *       (e.g. linux defines both BIG_ENDIAN & LITTLE_ENDIAN, bsds define
41  *          _BIG_ENDIAN, _LITTLE_ENDIAN, BIG_ENDIAN, LITTLE_ENDIAN)
42  *
43  * is sys/param.h universal ?
44  */
45
46 #include <stdio.h>
47 #include "../endianness.h"
48 /* 
49  * Tested:
50  * linux:   y
51  * freebsd: y
52  * openbsd:
53  * netbsd:
54  * solaris: y
55  * darwin: 
56  * cygwin:
57  *
58  * Header files:
59  * linux:  <endian.h> , <sys/param.h>
60  * bsd:    <sys/param.h> or <sys/endian.h>
61  * solaris: <sys/param.h>
62  * openbsd
63  * netbsd
64  * solaris
65  * cywin
66  */
67
68 /*
69  *
70  * Macro names:
71  * linux:  __BYTE_ORDER == __LITTLE_ENDIAN | __BIG_ENDIAN
72  *           BYTE_ORDER == LITTLE_ENDIAN | BIG_ENDIAN
73  * bsd:     _BYTE_ORDER == _LITTLE_ENDIAN | _BIG_ENDIAN
74  *           BYTE_ORDER == LITTLE_ENDIAN | BIG_ENDIAN
75  * solaris: _LITTLE_ENDIAN | _BIG_ENDIAN
76  *
77  * Note: BIG_ENDIAN, LITTLE_ENDIAN, _BIG_ENDIAN, _LITTLE_ENDIAN cannot be 
78  *       used always,  some OSes define both of them for BYTE_ORDER use
79  *       (e.g. linux defines both BIG_ENDIAN & LITTLE_ENDIAN, bsds define
80  *          _BIG_ENDIAN, _LITTLE_ENDIAN, BIG_ENDIAN, LITTLE_ENDIAN)
81  *
82  * is sys/param.h universal ?
83  */
84
85 /* test only */
86 #if defined __BYTE_ORDER && defined __LITTLE_ENDIAN 
87 #if     __BYTE_ORDER == __LITTLE_ENDIAN
88 #warning little endian (via __BYTE_ORDER)
89 #define __BYTE_ORDER_FOUND
90 #endif
91 #endif
92 #if defined __BYTE_ORDER && defined __BIG_ENDIAN
93 #if     __BYTE_ORDER == __BIG_ENDIAN
94 #warning big endian (via __BYTE_ORDER)
95 #define __BYTE_ORDER_FOUND
96 #endif
97 #endif
98 #if defined __BYTE_ORDER && !defined __BYTE_ORDER_FOUND
99 #error __BYTE_ORDER defined, but w/ a strange value
100 #endif
101
102 #if defined _BYTE_ORDER && defined _LITTLE_ENDIAN
103 #if _BYTE_ORDER == _LITTLE_ENDIAN
104 #warning little endian (via _BYTE_ORDER)
105 #define _BYTE_ORDER_FOUND
106 #endif
107 #endif
108 #if defined _BYTE_ORDER && defined _BIG_ENDIAN 
109 #if _BYTE_ORDER == _BIG_ENDIAN
110 #warning big endian (via _BYTE_ORDER)
111 #define _BYTE_ORDER_FOUND
112 #endif
113 #endif
114 #if defined _BYTE_ORDER && !defined _BYTE_ORDER_FOUND
115 #error _BYTE_ORDER defined, but w/ a strange value
116 #endif
117
118 #if defined BYTE_ORDER && defined LITTLE_ENDIAN 
119 #if BYTE_ORDER == LITTLE_ENDIAN
120 #warning little endian (via BYTE_ORDER)
121 #define BYTE_ORDER_FOUND
122 #endif
123 #endif
124 #if defined BYTE_ORDER && defined BIG_ENDIAN 
125 #if BYTE_ORDER == BIG_ENDIAN
126 #warning big endian (via BYTE_ORDER)
127 #define BYTE_ORDER_FOUND
128 #endif
129 #endif
130 #if defined BYTE_ORDER && !defined BYTE_ORDER_FOUND
131 #error BYTE_ORDER defined, but w/ a strange value
132 #endif
133
134 #if defined _LITTLE_ENDIAN
135 #warning _LITTLE_ENDIAN defined
136 #endif
137 #if defined _BIG_ENDIAN
138 #warning _BIG_ENDIAN defined
139 #endif
140 #if defined LITTLE_ENDIAN
141 #warning LITTLE_ENDIAN defined
142 #endif
143 #if defined BIG_ENDIAN
144 #warning BIG_ENDIAN defined
145 #endif
146
147
148 int main(int argc, char** argv)
149 {
150         int ret;
151         
152         ret=0;
153         if (endianness_sanity_check()!=0){
154                 printf("ERROR: sanity checks failed\n");
155                 ret=-1;
156         }
157         if (is_little_endian()){
158 #ifdef __IS_LITTLE_ENDIAN
159                 printf("OK: little endian confirmed\n");
160 #else 
161                 printf("ERROR: macro claims BIG ENDIAN, but it's little\n");
162                 return -1;
163 #endif
164         }else{
165 #ifdef __IS_BIG_ENDIAN
166                 printf("OK: big endian confirmed\n");
167 #else 
168                 printf("ERROR: macro claims LITTLE ENDIAN, but it's big\n");
169                 return -1;
170 #endif
171         }
172         return ret;
173 }