1 /* 2 * Copyright Jerome G. M. Benoit <jgmbenoit@rezozer.net> 2020 3 * 4 */ 5 #if !(__STDC_VERSION__ >= 201112L) 6 #error "require C11 or higher" 7 #endif 8 9 #include <sys/types.h> 10 #include <sys/param.h> 11 #include <stdalign.h> 12 #include <stdio.h> 13 main()14int main() { 15 const char * ADHOC_ARCH_ENDIAN=""; 16 const char * ADHOC_ARCH_SIZE_ALIGN=""; 17 int is_bigendian=-1; 18 19 /* inspired by AC_C_BIGENDIAN */ 20 #ifdef __APPLE_CC__ 21 is_bigendian=0; 22 #elif (defined BYTE_ORDER && defined BIG_ENDIAN && defined LITTLE_ENDIAN && \ 23 BYTE_ORDER && BIG_ENDIAN && LITTLE_ENDIAN) 24 # if BYTE_ORDER == LITTLE_ENDIAN 25 is_bigendian=0; 26 # elif BYTE_ORDER == BIG_ENDIAN 27 is_bigendian=1; 28 # else 29 # error "unexpected event" 30 # endif 31 #elif (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) 32 # ifndef _BIG_ENDIAN 33 is_bigendian=0; 34 # else 35 is_bigendian=1; 36 # endif 37 #else 38 /* From Harbison&Steele, section 6.1.2, ``Byte Ordering'' */ 39 union { 40 long int l; 41 char c[sizeof(long int)]; 42 } u; 43 u.l=1; 44 45 if (u.c[0] == 1) { 46 is_bigendian=0; 47 } 48 else if (u.c[sizeof(long int)-1] == 1) { 49 is_bigendian=1; 50 } 51 #endif 52 53 if (!(is_bigendian < 0)) { 54 if (is_bigendian == 0) { 55 ADHOC_ARCH_ENDIAN="le"; 56 } 57 else if (0 < is_bigendian) { 58 ADHOC_ARCH_ENDIAN="be"; 59 } 60 if (sizeof(void *) == 4) { 61 if (alignof(double) == 4) { 62 ADHOC_ARCH_SIZE_ALIGN="32d4"; 63 } 64 else { 65 ADHOC_ARCH_SIZE_ALIGN="32d8"; 66 } 67 } 68 else { /* (sizeof(void *) != 4) */ 69 ADHOC_ARCH_SIZE_ALIGN="64"; 70 } 71 } 72 73 printf("%s%s\n",ADHOC_ARCH_ENDIAN,ADHOC_ARCH_SIZE_ALIGN); 74 75 return 0; } 76