#include <stdio.h>
#include <limits.h>
#include <stddef.h>
#ifdef _emit_m4_include
# define sflag(flag,val) printf("define(`"#flag"',`%s')dnl\n", val)
# define mflag(flag,val) printf("define(`"#flag"',`%llu')dnl\n", (long long unsigned)(val + 1))
# define iflag(flag,val) printf("define(`"#flag"',`%llu')dnl\n", (long long unsigned)val)
# define fflag(flag,val) printf("define(`"#flag"',`%Lf')dnl\n", val)
#else
# define sflag(flag,val) printf("-D"#flag"=\"%s\" ", val)
# define mflag(flag,val) printf("-D"#flag"=-%llu ", (long long unsigned)(val + 1))
# define iflag(flag,val) printf("-D"#flag"=%llu ", (long long unsigned)val)
# define fflag(flag,val) printf("-D"#flag"=%Lf ", val)
#endif
#define type_found(val) (found_type & (val / 8))
#define checkbits(type,x) \
if(!type_found(x) && sizeof(type) == (x/CHAR_BIT)) \
sflag(type_bit##x, #type), found_type |= (x / 8)
#define describe_integral(type,label) { \
unsigned type maxval = -1; \
unsigned type smaxval = (maxval/2) - 1; \
iflag(type_max_u_##label, maxval); \
iflag(type_max_s_##label, smaxval); \
mflag(type_min_s_##label, smaxval); \
iflag(type_##label##_bits, (CHAR_BIT * sizeof(type))); \
checkbits(type, 8); else checkbits(type,16); else \
checkbits(type,32); else checkbits(type,64); else \
checkbits(type,128); else \
if (!found_sz && sizeof(type) == sizeof(size_t)) \
found_sz = 1, sflag(type_sz, "unsigned " #type); \
if (!found_ofs && sizeof(type) == sizeof(ptrdiff_t)) \
found_ofs = 1, sflag(type_offset, "signed " #type); \
}
int main() {
unsigned char etest[sizeof(int)] = {0xFF,0x00};
if ((*(int*)etest) == 0xFF) sflag(prop_endian,"low");
else sflag(prop_endian,"high");
int found_sz = 0, found_ofs = 0, found_type = 0;
iflag(arch_byte_bits,CHAR_BIT);
describe_integral(char,char);
describe_integral(short,short);
describe_integral(int,int);
describe_integral(long,long);
describe_integral(long long,llong);
printf("\n");
return 0;
}