mkast_sa revision 3f54fd611f536639ec30dd53c48e5ec1897cc7d9
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi: generate ast_sa.h
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomicase $# in
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi0) set cc ;;
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomiesac
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomicat > _ast_.c <<'!'
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #define _BYTESEX_H
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #include <stdio.h>
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #include <sys/types.h>
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #if N == 0
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #define _ast_int8_t long
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #define _ast_int8_str "long"
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #endif
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #if N == 1
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #define _ast_int8_t long long
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #define _ast_int8_str "long long"
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #endif
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #if N == 2
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #define _ast_int8_t __int64_t
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #define _ast_int8_str "__int64_t"
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #endif
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #if N == 3
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #define _ast_int8_t _int64_t
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #define _ast_int8_str "_int64_t"
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #endif
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #if N == 4
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #define _ast_int8_t int64_t
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #define _ast_int8_str "int64_t"
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #endif
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #if N == 5
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #define _ast_int8_t __int64
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #define _ast_int8_str "__int64"
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #endif
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #if N == 6
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #define _ast_int8_t _int64
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #define _ast_int8_str "_int64"
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #endif
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #if N == 7
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #define _ast_int8_t int64
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #define _ast_int8_str "int64"
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #endif
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #define elementsof(x) (sizeof(x)/sizeof(x[0]))
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi static char i_char = 1;
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi static short i_short = 1;
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi static int i_int = 1;
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi static long i_long = 1;
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #ifdef _ast_int8_t
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi static _ast_int8_t i_long_long = 1;
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #endif
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi static struct
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi {
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi char* name;
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi int size;
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi char* swap;
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi } int_type[] =
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi {
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi "char", sizeof(char), (char*)&i_char,
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi "short", sizeof(short), (char*)&i_short,
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi "int", sizeof(int), (char*)&i_int,
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi "long", sizeof(long), (char*)&i_long,
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #ifdef _ast_int8_t
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi _ast_int8_str, sizeof(_ast_int8_t), (char*)&i_long_long,
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #endif
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi };
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi static struct
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi {
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi char* name;
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi int size;
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi } flt_type[] =
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi {
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi "float", sizeof(float),
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi "double", sizeof(double),
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #ifdef _typ_long_double
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi "long double", sizeof(long double),
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi #endif
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi };
21e4a561c2983f7ff02c0503c9bad8e4f45cee8aAki Tuomi
static int int_size[] = { 1, 2, 4, 8 };
main()
{
register int t;
register int s;
register int m = 1;
register int b = 1;
register int w = 0;
#ifdef _ast_int8_t
if (int_type[elementsof(int_type)-1].size <= 4)
return 1;
#endif
for (s = 0; s < elementsof(int_size); s++)
{
for (t = 0; t < elementsof(int_type) && int_type[t].size < int_size[s]; t++);
if (t < elementsof(int_type))
{
m = int_size[s];
printf("#define _ast_int%d_t %s\n", m, int_type[t].name);
if (m > 1)
{
if (*int_type[t].swap)
w |= b;
b <<= 1;
}
}
}
printf("#define _ast_intmax_t _ast_int%d_t\n", m);
if (m == sizeof(long))
printf("#define _ast_intmax_long 1\n");
printf("#define _ast_intswap %d\n", w);
printf("\n");
for (t = 0; t < elementsof(flt_type); t++)
{
while (t < elementsof(flt_type) && flt_type[t].size == flt_type[t + 1].size)
t++;
m = flt_type[t].size;
printf("#define _ast_flt%d_t %s\n", flt_type[t].size, flt_type[t].name);
}
printf("#define _ast_fltmax_t _ast_flt%d_t\n", m);
if (m == sizeof(double))
printf("#define _ast_fltmax_double 1\n");
return 0;
}
!
echo "#ifndef _AST_SA_H"
echo "#define _AST_SA_H 1"
echo
for i in '' -DN=0 -DN=1 -DN=2 -DN=3 -DN=4 -DN=5 -DN=6 -DN=7 -DN=8
do "$@" $i -o _ast_.exe _ast_.c 2> /dev/null &&
./_ast_.exe &&
break
done
echo '#include <stdint.h>' > _ast_.c
if "$@" -E _ast_.c > /dev/null 2>&1
then echo "#define _hdr_stdint 1"
fi
echo '#include <unistd.h>' > _ast_.c
if "$@" -E _ast_.c > /dev/null 2>&1
then echo "#define _hdr_unistd 1"
fi
rm -f _ast_.c _ast_.exe
echo "#define __DEFINE__(T,obj,val) T obj = val"
echo "#define __EXTERN__(T,obj) extern T obj"
echo
echo "#endif"