/*
* Code to figure out the host C compiler type system
*/
#include <stdio.h>
#include <sys/types.h>
#define CHAR_SIZE sizeof(char)
#define SHORT_SIZE sizeof(short int)
#define INT_SIZE sizeof(int)
#define LONG_SIZE sizeof(long int)
#define ADDRESS_SIZE sizeof(char*)
#define FLOAT_SIZE sizeof(float)
#define DOUBLE_SIZE sizeof(double)
#define LONG_DOUBLE_SIZE sizeof(long double)
/*
* Do not make static
*/
short host_byte_order = 0x0102;
static int
alignof_address()
{
struct s {
char x;
char *y;
};
return CHAR_SIZE + (sizeof(struct s) - (CHAR_SIZE + ADDRESS_SIZE));
}
static int
alignof_short()
{
struct s {
char x;
short int y;
};
return CHAR_SIZE + (sizeof(struct s) - (CHAR_SIZE + SHORT_SIZE));
}
static int
alignof_int()
{
struct s {
char x;
int y;
};
return CHAR_SIZE + (sizeof(struct s) - (CHAR_SIZE + INT_SIZE));
}
static int
alignof_long()
{
struct s {
char x;
long int y;
};
return CHAR_SIZE + (sizeof(struct s) - (CHAR_SIZE + LONG_SIZE));
}
static int
alignof_float()
{
struct s {
char x;
float y;
};
return CHAR_SIZE + (sizeof(struct s) - (CHAR_SIZE + FLOAT_SIZE));
}
static int
alignof_double()
{
struct s {
char x;
double y;
};
return CHAR_SIZE + (sizeof(struct s) - (CHAR_SIZE + DOUBLE_SIZE));
}
#if !(defined(sun) || defined(hpux))
static int
alignof_long_double()
{
struct s {
char x;
long double y;
};
return CHAR_SIZE + (sizeof(struct s) - (CHAR_SIZE + LONG_DOUBLE_SIZE));
}
#endif
int
main()
{
char *p = (char*) &host_byte_order;
#ifdef NBBY
printf("#define BITS_PER_BYTE\t\t\t%d\n\n", NBBY);
#else
printf("#define BITS_PER_BYTE\t\t\t%d\n\n", 8);
#endif
printf("#define SIZEOF_CHAR\t\t\t\t%d\n", CHAR_SIZE);
printf("#define SIZEOF_SHORT\t\t\t%d\n", SHORT_SIZE);
printf("#define SIZEOF_INT\t\t\t\t%d\n", INT_SIZE);
printf("#define SIZEOF_LONG\t\t\t\t%d\n", LONG_SIZE);
printf("#define SIZEOF_FLOAT\t\t\t%d\n", FLOAT_SIZE);
printf("#define SIZEOF_DOUBLE\t\t\t%d\n", DOUBLE_SIZE);
#if !(defined(sun) || defined(hpux))
printf("#define SIZEOF_LONG_DOUBLE\t\t%d\n", LONG_DOUBLE_SIZE);
#endif
printf("#define SIZEOF_ADDRESS\t\t%d\n", ADDRESS_SIZE);
printf("\n#define ALIGNOF_CHAR\t\t\t%d\n", CHAR_SIZE);
printf("#define ALIGNOF_SHORT\t\t\t%d\n", alignof_short());
printf("#define ALIGNOF_INT\t\t\t\t%d\n", alignof_int());
printf("#define ALIGNOF_LONG\t\t\t%d\n", alignof_long());
printf("#define ALIGNOF_FLOAT\t\t\t%d\n", alignof_float());
printf("#define ALIGNOF_DOUBLE\t\t\t%d\n", alignof_double());
#if !(defined(sun) || defined(hpux))
printf("#define ALIGNOF_LONG_DOUBLE\t\t%d\n", alignof_long_double());
#endif
printf("#define ALIGNOF_ADDRESS\t\t\t%d\n", alignof_address());
printf("\n#define CHARS_ARE_%sSIGNED\n", (((char)-1) < 0) ? "" : "UN");
if (*p == 1) {
puts("#ifndef BIG_ENDIAN");
puts("#define BIG_ENDIAN");
puts("#endif");
}
else {
puts("#ifndef LITTLE_ENDIAN");
puts("#define LITTLE_ENDIAN");
puts("#endif");
}
return 0;
}
syntax highlighted by Code2HTML, v. 0.9.1