libk  typesize.c at trunk

File arch/typesize.c artifact 6b637ac574 on branch trunk


#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;
}