Main Page | Modules | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals | Related Pages

endian_test.c

Go to the documentation of this file.
00001 /* 
00002  * $Id: endian_test.c,v 1.1 2008/06/13 20:09:55 andrei Exp $
00003  * 
00004  * Copyright (C) 2008 iptelorg GmbH
00005  *
00006  * Permission to use, copy, modify, and distribute this software for any
00007  * purpose with or without fee is hereby granted, provided that the above
00008  * copyright notice and this permission notice appear in all copies.
00009  *
00010  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
00011  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
00012  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
00013  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
00014  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
00015  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
00016  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
00017  */
00018 /*
00019  *  endianness.h tests
00020  *  compile/run with:
00021  *  gcc  -Wall endian_test.c ../endianness.c  -o endian_test; ./endian_test
00022  */
00023 /* 
00024  * History:
00025  * --------
00026  *  2008-06-13  created by andrei
00027  */
00028 
00029 /*
00030  *
00031  * Macro names:
00032  * linux:  __BYTE_ORDER == __LITTLE_ENDIAN | __BIG_ENDIAN
00033  *           BYTE_ORDER == LITTLE_ENDIAN | BIG_ENDIAN
00034  * bsd:     _BYTE_ORDER == _LITTLE_ENDIAN | _BIG_ENDIAN
00035  *           BYTE_ORDER == LITTLE_ENDIAN | BIG_ENDIAN
00036  * solaris: _LITTLE_ENDIAN | _BIG_ENDIAN
00037  *
00038  * Note: BIG_ENDIAN, LITTLE_ENDIAN, _BIG_ENDIAN, _LITTLE_ENDIAN cannot be 
00039  *       used always,  some OSes define both of them for BYTE_ORDER use
00040  *       (e.g. linux defines both BIG_ENDIAN & LITTLE_ENDIAN, bsds define
00041  *          _BIG_ENDIAN, _LITTLE_ENDIAN, BIG_ENDIAN, LITTLE_ENDIAN)
00042  *
00043  * is sys/param.h universal ?
00044  */
00045 
00046 #include <stdio.h>
00047 #include "../endianness.h"
00048 /* 
00049  * Tested:
00050  * linux:   y
00051  * freebsd: y
00052  * openbsd:
00053  * netbsd:
00054  * solaris: y
00055  * darwin: 
00056  * cygwin:
00057  *
00058  * Header files:
00059  * linux:  <endian.h> , <sys/param.h>
00060  * bsd:    <sys/param.h> or <sys/endian.h>
00061  * solaris: <sys/param.h>
00062  * openbsd
00063  * netbsd
00064  * solaris
00065  * cywin
00066  */
00067 
00068 /*
00069  *
00070  * Macro names:
00071  * linux:  __BYTE_ORDER == __LITTLE_ENDIAN | __BIG_ENDIAN
00072  *           BYTE_ORDER == LITTLE_ENDIAN | BIG_ENDIAN
00073  * bsd:     _BYTE_ORDER == _LITTLE_ENDIAN | _BIG_ENDIAN
00074  *           BYTE_ORDER == LITTLE_ENDIAN | BIG_ENDIAN
00075  * solaris: _LITTLE_ENDIAN | _BIG_ENDIAN
00076  *
00077  * Note: BIG_ENDIAN, LITTLE_ENDIAN, _BIG_ENDIAN, _LITTLE_ENDIAN cannot be 
00078  *       used always,  some OSes define both of them for BYTE_ORDER use
00079  *       (e.g. linux defines both BIG_ENDIAN & LITTLE_ENDIAN, bsds define
00080  *          _BIG_ENDIAN, _LITTLE_ENDIAN, BIG_ENDIAN, LITTLE_ENDIAN)
00081  *
00082  * is sys/param.h universal ?
00083  */
00084 
00085 /* test only */
00086 #if defined __BYTE_ORDER && defined __LITTLE_ENDIAN 
00087 #if     __BYTE_ORDER == __LITTLE_ENDIAN
00088 #warning little endian (via __BYTE_ORDER)
00089 #define __BYTE_ORDER_FOUND
00090 #endif
00091 #endif
00092 #if defined __BYTE_ORDER && defined __BIG_ENDIAN
00093 #if     __BYTE_ORDER == __BIG_ENDIAN
00094 #warning big endian (via __BYTE_ORDER)
00095 #define __BYTE_ORDER_FOUND
00096 #endif
00097 #endif
00098 #if defined __BYTE_ORDER && !defined __BYTE_ORDER_FOUND
00099 #error __BYTE_ORDER defined, but w/ a strange value
00100 #endif
00101 
00102 #if defined _BYTE_ORDER && defined _LITTLE_ENDIAN
00103 #if _BYTE_ORDER == _LITTLE_ENDIAN
00104 #warning little endian (via _BYTE_ORDER)
00105 #define _BYTE_ORDER_FOUND
00106 #endif
00107 #endif
00108 #if defined _BYTE_ORDER && defined _BIG_ENDIAN 
00109 #if _BYTE_ORDER == _BIG_ENDIAN
00110 #warning big endian (via _BYTE_ORDER)
00111 #define _BYTE_ORDER_FOUND
00112 #endif
00113 #endif
00114 #if defined _BYTE_ORDER && !defined _BYTE_ORDER_FOUND
00115 #error _BYTE_ORDER defined, but w/ a strange value
00116 #endif
00117 
00118 #if defined BYTE_ORDER && defined LITTLE_ENDIAN 
00119 #if BYTE_ORDER == LITTLE_ENDIAN
00120 #warning little endian (via BYTE_ORDER)
00121 #define BYTE_ORDER_FOUND
00122 #endif
00123 #endif
00124 #if defined BYTE_ORDER && defined BIG_ENDIAN 
00125 #if BYTE_ORDER == BIG_ENDIAN
00126 #warning big endian (via BYTE_ORDER)
00127 #define BYTE_ORDER_FOUND
00128 #endif
00129 #endif
00130 #if defined BYTE_ORDER && !defined BYTE_ORDER_FOUND
00131 #error BYTE_ORDER defined, but w/ a strange value
00132 #endif
00133 
00134 #if defined _LITTLE_ENDIAN
00135 #warning _LITTLE_ENDIAN defined
00136 #endif
00137 #if defined _BIG_ENDIAN
00138 #warning _BIG_ENDIAN defined
00139 #endif
00140 #if defined LITTLE_ENDIAN
00141 #warning LITTLE_ENDIAN defined
00142 #endif
00143 #if defined BIG_ENDIAN
00144 #warning BIG_ENDIAN defined
00145 #endif
00146 
00147 
00148 int main(int argc, char** argv)
00149 {
00150         int ret;
00151         
00152         ret=0;
00153         if (endianness_sanity_check()!=0){
00154                 printf("ERROR: sanity checks failed\n");
00155                 ret=-1;
00156         }
00157         if (is_little_endian()){
00158 #ifdef __IS_LITTLE_ENDIAN
00159                 printf("OK: little endian confirmed\n");
00160 #else 
00161                 printf("ERROR: macro claims BIG ENDIAN, but it's little\n");
00162                 return -1;
00163 #endif
00164         }else{
00165 #ifdef __IS_BIG_ENDIAN
00166                 printf("OK: big endian confirmed\n");
00167 #else 
00168                 printf("ERROR: macro claims LITTLE ENDIAN, but it's big\n");
00169                 return -1;
00170 #endif
00171         }
00172         return ret;
00173 }

Generated on Thu Sep 9 04:16:06 2010 for SIPExpressRouter by  doxygen 1.3.9.1