123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- /*
- * Copyright (C) 2008 iptelorg GmbH
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
- /*
- * endianness.h tests
- * compile/run with:
- * gcc -Wall endian_test.c ../endianness.c -o endian_test; ./endian_test
- */
- /*
- * History:
- * --------
- * 2008-06-13 created by andrei
- */
- /*
- *
- * Macro names:
- * linux: __BYTE_ORDER == __LITTLE_ENDIAN | __BIG_ENDIAN
- * BYTE_ORDER == LITTLE_ENDIAN | BIG_ENDIAN
- * bsd: _BYTE_ORDER == _LITTLE_ENDIAN | _BIG_ENDIAN
- * BYTE_ORDER == LITTLE_ENDIAN | BIG_ENDIAN
- * solaris: _LITTLE_ENDIAN | _BIG_ENDIAN
- *
- * Note: BIG_ENDIAN, LITTLE_ENDIAN, _BIG_ENDIAN, _LITTLE_ENDIAN cannot be
- * used always, some OSes define both of them for BYTE_ORDER use
- * (e.g. linux defines both BIG_ENDIAN & LITTLE_ENDIAN, bsds define
- * _BIG_ENDIAN, _LITTLE_ENDIAN, BIG_ENDIAN, LITTLE_ENDIAN)
- *
- * is sys/param.h universal ?
- */
- #include <stdio.h>
- #include "../endianness.h"
- /*
- * Tested:
- * linux: y
- * freebsd: y
- * openbsd:
- * netbsd:
- * solaris: y
- * darwin:
- * cygwin:
- *
- * Header files:
- * linux: <endian.h> , <sys/param.h>
- * bsd: <sys/param.h> or <sys/endian.h>
- * solaris: <sys/param.h>
- * openbsd
- * netbsd
- * solaris
- * cywin
- */
- /*
- *
- * Macro names:
- * linux: __BYTE_ORDER == __LITTLE_ENDIAN | __BIG_ENDIAN
- * BYTE_ORDER == LITTLE_ENDIAN | BIG_ENDIAN
- * bsd: _BYTE_ORDER == _LITTLE_ENDIAN | _BIG_ENDIAN
- * BYTE_ORDER == LITTLE_ENDIAN | BIG_ENDIAN
- * solaris: _LITTLE_ENDIAN | _BIG_ENDIAN
- *
- * Note: BIG_ENDIAN, LITTLE_ENDIAN, _BIG_ENDIAN, _LITTLE_ENDIAN cannot be
- * used always, some OSes define both of them for BYTE_ORDER use
- * (e.g. linux defines both BIG_ENDIAN & LITTLE_ENDIAN, bsds define
- * _BIG_ENDIAN, _LITTLE_ENDIAN, BIG_ENDIAN, LITTLE_ENDIAN)
- *
- * is sys/param.h universal ?
- */
- /* test only */
- #if defined __BYTE_ORDER && defined __LITTLE_ENDIAN
- #if __BYTE_ORDER == __LITTLE_ENDIAN
- #warning little endian (via __BYTE_ORDER)
- #define __BYTE_ORDER_FOUND
- #endif
- #endif
- #if defined __BYTE_ORDER && defined __BIG_ENDIAN
- #if __BYTE_ORDER == __BIG_ENDIAN
- #warning big endian (via __BYTE_ORDER)
- #define __BYTE_ORDER_FOUND
- #endif
- #endif
- #if defined __BYTE_ORDER && !defined __BYTE_ORDER_FOUND
- #error __BYTE_ORDER defined, but w/ a strange value
- #endif
- #if defined _BYTE_ORDER && defined _LITTLE_ENDIAN
- #if _BYTE_ORDER == _LITTLE_ENDIAN
- #warning little endian (via _BYTE_ORDER)
- #define _BYTE_ORDER_FOUND
- #endif
- #endif
- #if defined _BYTE_ORDER && defined _BIG_ENDIAN
- #if _BYTE_ORDER == _BIG_ENDIAN
- #warning big endian (via _BYTE_ORDER)
- #define _BYTE_ORDER_FOUND
- #endif
- #endif
- #if defined _BYTE_ORDER && !defined _BYTE_ORDER_FOUND
- #error _BYTE_ORDER defined, but w/ a strange value
- #endif
- #if defined BYTE_ORDER && defined LITTLE_ENDIAN
- #if BYTE_ORDER == LITTLE_ENDIAN
- #warning little endian (via BYTE_ORDER)
- #define BYTE_ORDER_FOUND
- #endif
- #endif
- #if defined BYTE_ORDER && defined BIG_ENDIAN
- #if BYTE_ORDER == BIG_ENDIAN
- #warning big endian (via BYTE_ORDER)
- #define BYTE_ORDER_FOUND
- #endif
- #endif
- #if defined BYTE_ORDER && !defined BYTE_ORDER_FOUND
- #error BYTE_ORDER defined, but w/ a strange value
- #endif
- #if defined _LITTLE_ENDIAN
- #warning _LITTLE_ENDIAN defined
- #endif
- #if defined _BIG_ENDIAN
- #warning _BIG_ENDIAN defined
- #endif
- #if defined LITTLE_ENDIAN
- #warning LITTLE_ENDIAN defined
- #endif
- #if defined BIG_ENDIAN
- #warning BIG_ENDIAN defined
- #endif
- int main(int argc, char** argv)
- {
- int ret;
- ret=0;
- if (endianness_sanity_check()!=0){
- printf("ERROR: sanity checks failed\n");
- ret=-1;
- }
- if (is_little_endian()){
- #ifdef __IS_LITTLE_ENDIAN
- printf("OK: little endian confirmed\n");
- #else
- printf("ERROR: macro claims BIG ENDIAN, but it's little\n");
- return -1;
- #endif
- }else{
- #ifdef __IS_BIG_ENDIAN
- printf("OK: big endian confirmed\n");
- #else
- printf("ERROR: macro claims LITTLE ENDIAN, but it's big\n");
- return -1;
- #endif
- }
- return ret;
- }
|