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()14 int 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