summaryrefslogtreecommitdiff
path: root/src/lib/libast/features/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libast/features/common')
-rw-r--r--src/lib/libast/features/common624
1 files changed, 624 insertions, 0 deletions
diff --git a/src/lib/libast/features/common b/src/lib/libast/features/common
new file mode 100644
index 0000000..500ce87
--- /dev/null
+++ b/src/lib/libast/features/common
@@ -0,0 +1,624 @@
+iff AST_COMMON
+hdr pthread,stdarg,stddef,stdint,inttypes,types,unistd
+sys types
+typ long.double,size_t,ssize_t
+typ __va_list stdio.h
+
+mac SF_APPEND,SF_CLOSE sys/stat.h sys/socket.h
+
+dll import note{ Microsoft import/export nonsense }end execute{
+ __declspec(dllimport) int foo;
+ int main() { return foo == 5 ? 0 : 1; }
+ int bar = 5;
+ int* _imp__foo = &bar;
+}end
+
+std proto note{ standard C prototypes ok }end compile{
+ extern int foo(int, int);
+ bar() { foo(1, 1); }
+}end
+
+tst ptr_void note{ standard C void* ok }end compile{
+ extern void* foo();
+ void* bar() { return foo(); }
+}end
+
+cat{
+ /* disable non-standard linux/gnu inlines */
+ #ifdef __GNUC__
+ # undef __OPTIMIZE_SIZE__
+ # define __OPTIMIZE_SIZE__ 1
+ #endif
+
+ /* __STD_C indicates that the language is ANSI-C or C++ */
+ #if !defined(__STD_C) && __STDC__
+ # define __STD_C 1
+ #endif
+ #if !defined(__STD_C) && (__cplusplus || c_plusplus)
+ # define __STD_C 1
+ #endif
+ #if !defined(__STD_C) && _std_proto
+ # define __STD_C 1
+ #endif
+ #if !defined(__STD_C)
+ # define __STD_C 0
+ #endif
+
+ /* extern symbols must be protected against C++ name mangling */
+ #ifndef _BEGIN_EXTERNS_
+ # if __cplusplus || c_plusplus
+ # define _BEGIN_EXTERNS_ extern "C" {
+ # define _END_EXTERNS_ }
+ # else
+ # define _BEGIN_EXTERNS_
+ # define _END_EXTERNS_
+ # endif
+ #endif
+
+ /* _ARG_ simplifies function prototyping among flavors of C */
+ #ifndef _ARG_
+ # if __STD_C
+ # define _ARG_(x) x
+ # else
+ # define _ARG_(x) ()
+ # endif
+ #endif
+
+ /* _NIL_ simplifies defining nil pointers to a given type */
+ #ifndef _NIL_
+ # define _NIL_(x) ((x)0)
+ #endif
+
+ /* __INLINE__, if defined, is the inline keyword */
+ #if !defined(__INLINE__) && defined(__cplusplus)
+ # define __INLINE__ inline
+ #endif
+ #if !defined(__INLINE__) && defined(_WIN32) && !defined(__GNUC__)
+ # define __INLINE__ __inline
+ #endif
+
+ /* Void_t is defined so that Void_t* can address any type */
+ #ifndef Void_t
+ # if __STD_C
+ # define Void_t void
+ # else
+ # define Void_t char
+ # endif
+ #endif
+
+ /* windows variants and veneers */
+ #if !defined(_WINIX) && (_UWIN || __CYGWIN__ || __EMX__)
+ # define _WINIX 1
+ #endif
+
+ /* dynamic linked library external scope handling */
+ #ifdef __DYNAMIC__
+ # undef __DYNAMIC__
+ # ifndef _DLL
+ # define _DLL 1
+ # endif
+ #endif
+ #if _dll_import
+ # if _BLD_STATIC && !_BLD_DLL
+ # undef _DLL
+ # else
+ # if !_UWIN && !defined(_DLL)
+ # define _DLL 1
+ # endif
+ # endif
+ # if !defined(__EXPORT__) && _BLD_DLL
+ # define __EXPORT__ __declspec(dllexport)
+ # endif
+ # if !defined(__IMPORT__) && ( _BLD_DLL || defined(_DLL) )
+ # define __IMPORT__ __declspec(dllimport)
+ # endif
+ # if _BLD_DLL && _UWIN
+ # define __DYNAMIC__(v) (_ast_getdll()->_ast_ ## v)
+ # endif
+ #endif
+ #if !defined(_astimport)
+ # if defined(__IMPORT__) && defined(_DLL)
+ # define _astimport __IMPORT__
+ # else
+ # define _astimport extern
+ # endif
+ #endif
+ #if _dll_import && ( !_BLD_DLL || _WINIX && !_UWIN )
+ # ifdef __STDC__
+ # define __EXTERN__(T,obj) extern T obj; T* _imp__ ## obj = &obj
+ # define __DEFINE__(T,obj,val) T obj = val; T* _imp__ ## obj = &obj
+ # else
+ # define __EXTERN__(T,obj) extern T obj; T* _imp__/**/obj = &obj
+ # define __DEFINE__(T,obj,val) T obj = val; T* _imp__/**/obj = &obj
+ # endif
+ #else
+ # define __EXTERN__(T,obj) extern T obj
+ # define __DEFINE__(T,obj,val) T obj = val
+ #endif
+}end
+
+if tst - note{ <stdarg.h>+<wchar.h> works }end compile{
+ /*<NOSTDIO>*/
+ #include <stdarg.h>
+ #include <wchar.h>
+ }end
+elif tst - note{ explicit <sys/va_list.h> before <stdarg.h>+<wchar.h> }end compile{
+ /*<NOSTDIO>*/
+ #include <sys/va_list.h>
+ #include <stdarg.h>
+ #include <wchar.h>
+ }end {
+ #include <sys/va_list.h>
+ }
+endif
+
+tst ast_LL note{ LL numeric suffix supported }end compile{
+ int i = 1LL;
+ unsigned int u = 1ULL; /* NOTE: some compilers choke on 1LLU */
+}end
+
+tst - -DN=1 - -DN=2 - -DN=3 - -DN=4 - -DN=5 - -DN=6 - -DN=7 - -DN=8 - -DN=0 output{
+ #define _BYTESEX_H
+
+ #include <string.h>
+ #include <sys/types.h>
+
+ #if _STD_
+ #if N == 1
+ #define _ast_int8_t long
+ #define _ast_int8_str "long"
+ #endif
+ #if N == 2
+ #define _ast_int8_t long long
+ #define _ast_int8_str "long long"
+ #endif
+ #if N == 3
+ #define _ast_int8_t __int64
+ #define _ast_int8_str "__int64"
+ #endif
+ #if N == 4
+ #define _ast_int8_t __int64_t
+ #define _ast_int8_str "__int64_t"
+ #endif
+ #if N == 5
+ #define _ast_int8_t _int64_t
+ #define _ast_int8_str "_int64_t"
+ #endif
+ #if N == 6
+ #define _ast_int8_t int64_t
+ #define _ast_int8_str "int64_t"
+ #endif
+ #if N == 7
+ #define _ast_int8_t _int64
+ #define _ast_int8_str "_int64"
+ #endif
+ #if N == 8
+ #define _ast_int8_t int64
+ #define _ast_int8_str "int64"
+ #endif
+ #endif
+
+ #define elementsof(x) (sizeof(x)/sizeof(x[0]))
+
+ static char i_char = 1;
+ static short i_short = 1;
+ static int i_int = 1;
+ static long i_long = 1L;
+ #ifdef _ast_int8_t
+ #if _ast_LL
+ static _ast_int8_t i_long_long = 1LL;
+ static unsigned _ast_int8_t u_long_long = 18446744073709551615ULL;
+ #else
+ static _ast_int8_t i_long_long = 1;
+ static unsigned _ast_int8_t u_long_long = 18446744073709551615;
+ #endif
+ #endif
+
+ static struct
+ {
+ char* name;
+ int size;
+ char* swap;
+ } int_type[] =
+ {
+ "char", sizeof(char), (char*)&i_char,
+ "short", sizeof(short), (char*)&i_short,
+ "int", sizeof(int), (char*)&i_int,
+ "long", sizeof(long), (char*)&i_long,
+ #ifdef _ast_int8_t
+ _ast_int8_str, sizeof(_ast_int8_t), (char*)&i_long_long,
+ #endif
+ };
+
+ static int int_size[] = { 1, 2, 4, 8 };
+
+ int
+ main()
+ {
+ register int t;
+ register int s;
+ register int m = 1;
+ register int b = 1;
+ register int w = 0;
+
+ #ifdef _ast_int8_t
+ unsigned _ast_int8_t p;
+ char buf[64];
+
+ if (int_type[elementsof(int_type)-1].size <= 4)
+ return 1;
+ p = 0x12345678;
+ p <<= 32;
+ p |= 0x9abcdef0;
+ sprintf(buf, "0x%016llx", p);
+ if (strcmp(buf, "0x123456789abcdef0"))
+ 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];
+ #if __INTERIX
+ if (m == 8)
+ {
+ printf("#ifdef _MSC_VER\n");
+ printf("#define _ast_int8_t __int64\n");
+ printf("#else\n");
+ printf("#define _ast_int8_t long long\n");
+ printf("#endif\n");
+ }
+ else
+ #endif
+ 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");
+ return 0;
+ }
+}end
+
+tst - output{
+ #include <string.h>
+ #include <sys/types.h>
+
+ #if _X86_ || _X64_
+ #define COND 1
+ #define CONDNAME "_X64_"
+ #else
+ #define COND 0
+ #endif
+
+ #define elementsof(x) (sizeof(x)/sizeof(x[0]))
+
+ static struct
+ {
+ char* name;
+ int size;
+ int cond;
+ } types[] =
+ {
+ "short", sizeof(short), 0,
+ "int", sizeof(int), 0,
+ "long", sizeof(long), 0,
+ "size_t", sizeof(size_t), 0,
+ "pointer", sizeof(void*), COND * 4,
+ "float", sizeof(float), 0,
+ "double", sizeof(double), 0,
+ #ifdef _typ_long_double
+ "long_double", sizeof(long double), 0,
+ #endif
+ };
+
+ int
+ main()
+ {
+ register int t;
+
+ for (t = 0; t < elementsof(types); t++)
+ #if COND
+ if (types[t].cond)
+ {
+ printf("#if %s\n", CONDNAME);
+ printf("#define _ast_sizeof_%s%s %d /* sizeof(%s) */\n", types[t].name, strlen(types[t].name) < 4 ? "\t" : "", types[t].cond * 2, types[t].name);
+ printf("#else\n");
+ printf("#define _ast_sizeof_%s%s %d /* sizeof(%s) */\n", types[t].name, strlen(types[t].name) < 4 ? "\t" : "", types[t].cond, types[t].name);
+ printf("#endif\n");
+ }
+ else
+ #endif
+ printf("#define _ast_sizeof_%s%s %d /* sizeof(%s) */\n", types[t].name, strlen(types[t].name) < 4 ? "\t" : "", types[t].size, types[t].name);
+ printf("\n");
+ return 0;
+ }
+}end
+
+tst - -DN=1 - -DN=0 output{
+ #define _BYTESEX_H
+
+ #include <string.h>
+ #include <sys/types.h>
+
+ #if !N || !_STD_
+ #undef _typ_long_double
+ #endif
+
+ #define elementsof(x) (sizeof(x)/sizeof(x[0]))
+
+ static struct
+ {
+ char* name;
+ int size;
+ } flt_type[] =
+ {
+ "float", sizeof(float),
+ "double", sizeof(double),
+ #ifdef _typ_long_double
+ "long double", sizeof(long double),
+ #endif
+ };
+
+ int
+ main()
+ {
+ register int t;
+ register int m = 1;
+
+ #ifdef _typ_long_double
+ long double p;
+ char buf[64];
+
+ if (flt_type[elementsof(flt_type)-1].size <= sizeof(double))
+ return 1;
+ p = 1.12345E-55;
+ sprintf(buf, "%1.5LE", p);
+ if (strcmp(buf, "1.12345E-55"))
+ return 1;
+ #endif
+ for (t = 0; t < elementsof(flt_type); t++)
+ {
+ while (t < (elementsof(flt_type) - 1) && 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;
+ }
+}end
+
+typ int8_t stdint.h inttypes.h no{
+ #undef _typ_int8_t
+ #define _typ_int8_t 1
+ typedef _ast_int1_t int8_t;
+}end
+typ uint8_t stdint.h inttypes.h no{
+ #undef _typ_uint8_t
+ #define _typ_uint8_t 1
+ typedef unsigned _ast_int1_t uint8_t;
+}end
+typ int16_t stdint.h inttypes.h no{
+ #undef _typ_int16_t
+ #define _typ_int16_t 1
+ typedef _ast_int2_t int16_t;
+}end
+typ uint16_t stdint.h inttypes.h no{
+ #undef _typ_uint16_t
+ #define _typ_uint16_t 1
+ typedef unsigned _ast_int2_t uint16_t;
+}end
+typ int32_t stdint.h inttypes.h no{
+ #undef _typ_int32_t
+ #define _typ_int32_t 1
+ typedef _ast_int4_t int32_t;
+}end
+typ uint32_t stdint.h inttypes.h no{
+ #undef _typ_uint32_t
+ #define _typ_uint32_t 1
+ typedef unsigned _ast_int4_t uint32_t;
+}end
+typ int64_t stdint.h inttypes.h no{
+ #ifdef _ast_int8_t
+ #undef _typ_int64_t
+ #define _typ_int64_t 1
+ typedef _ast_int8_t int64_t;
+ #endif
+}end
+typ uint64_t stdint.h inttypes.h no{
+ #ifdef _ast_int8_t
+ #undef _typ_uint64_t
+ #define _typ_uint64_t 1
+ typedef unsigned _ast_int8_t uint64_t;
+ #endif
+}end
+typ intmax_t stdint.h inttypes.h no{
+ #undef _typ_intmax_t
+ #define _typ_intmax_t 1
+ typedef _ast_intmax_t intmax_t;
+}end
+typ uintmax_t stdint.h inttypes.h no{
+ #undef _typ_uintmax_t
+ #define _typ_uintmax_t 1
+ typedef unsigned _ast_intmax_t uintmax_t;
+}end
+typ uintptr_t stdint.h inttypes.h no{
+ #undef _typ_uintptr_t
+ #define _typ_uintptr_t 1
+ #if _ast_sizeof_pointer == 8 && defined(_ast_int8_t)
+ typedef unsigned _ast_int8_t uintptr_t;
+ #else
+ typedef unsigned _ast_int4_t uintptr_t;
+ #endif
+}end
+
+tst - -DTRY=1 - -DTRY=1 -Dvoid=char - -DTRY=2 - -DTRY=3 - -DTRY=4 output{
+ #if _STD_ && _hdr_stdarg
+ #include <stdarg.h>
+ static void
+ varyfunny(int* p, ...)
+ {
+ va_list ap;
+ va_start(ap, p);
+ #if TRY == 1
+ *p = *ap++ != 0;
+ #endif /*TRY == 1*/
+ #if TRY == 2
+ *p = *ap != 0;
+ #endif /*TRY == 2*/
+ #if TRY == 3
+ *p = ap++ != 0;
+ #endif /*TRY == 3*/
+ va_end(ap);
+ }
+ #else
+ #include <varargs.h>
+ static void
+ varyfunny(va_alist)
+ va_dcl
+ {
+ va_list ap;
+ int* p;
+ va_start(ap);
+ p = va_arg(ap, int*);
+ #if TRY == 1
+ *p = *ap++ != 0;
+ #endif /*TRY == 1*/
+ #if TRY == 2
+ *p = *ap != 0;
+ #endif /*TRY == 2*/
+ #if TRY == 3
+ *p = ap++ != 0;
+ #endif /*TRY == 3*/
+ va_end(ap);
+ }
+ #endif
+ int
+ main()
+ {
+ int r;
+
+ printf("\n#ifndef va_listref\n");
+ printf("#ifndef va_start\n");
+ printf("#if __STD_C\n");
+ printf("#include <stdarg.h>\n");
+ printf("#else\n");
+ printf("#include <varargs.h>\n");
+ printf("#endif\n");
+ printf("#endif\n");
+ #if TRY == 4
+ printf("#define va_listref(p) (&(p))\t");
+ printf("/* pass va_list to varargs function */\n");
+ printf("#define va_listval(p) (*(p))\t");
+ printf("/* retrieve va_list from va_arg(ap,va_listarg) */\n");
+ printf("#define va_listarg va_list*\t");
+ printf("/* va_arg() va_list type */\n");
+ #else
+ varyfunny(&r);
+ printf("#define va_listref(p) (p)\t");
+ printf("/* pass va_list to varargs function */\n");
+ if (sizeof(va_list) > sizeof(void*))
+ printf("#define va_listval(p) (*(p))\t");
+ else
+ printf("#define va_listval(p) (p)\t");
+ printf("/* retrieve va_list from va_arg(ap,va_listarg) */\n");
+ #if TRY == 2
+ printf("#define va_listarg va_list*\t");
+ #else
+ printf("#define va_listarg va_list\t");
+ #endif /*TRY == 2*/
+ printf("/* va_arg() va_list type */\n");
+ #endif /*TRY == 4*/
+
+ #if _UWIN
+ printf("#ifndef va_copy\n");
+ printf("#define va_copy(to,fr) ((to)=(fr))\t");
+ printf("/* copy va_list fr -> to */\n");
+ printf("#endif\n");
+ #else
+ #if !defined(va_copy)
+ #if defined(__va_copy)
+ printf("#ifndef va_copy\n");
+ printf("#define va_copy(to,fr) __va_copy(to,fr)\t");
+ printf("/* copy va_list fr -> to */\n");
+ printf("#endif\n");
+ #else
+ #if TRY == 2
+ printf("#ifndef va_copy\n");
+ printf("#define va_copy(to,fr) memcpy(to,fr,sizeof(va_list))\t");
+ printf("/* copy va_list fr -> to */\n");
+ printf("#endif\n");
+ #else
+ printf("#ifndef va_copy\n");
+ printf("#define va_copy(to,fr) ((to)=(fr))\t");
+ printf("/* copy va_list fr -> to */\n");
+ printf("#endif\n");
+ #endif
+ #endif
+ #endif
+ #endif
+
+ printf("#endif\n");
+ return 0;
+ }
+}end
+
+cat{
+ #ifndef _AST_STD_H
+ # if __STD_C && _hdr_stddef
+ # include <stddef.h>
+ # endif
+ # if _sys_types
+ # include <sys/types.h>
+ # endif
+ # if _hdr_stdint
+ # include <stdint.h>
+ # else
+ # if _hdr_inttypes
+ # include <inttypes.h>
+ # endif
+ # endif
+ #endif
+ #if !_typ_size_t
+ # define _typ_size_t 1
+ typedef int size_t;
+ #endif
+ #if !_typ_ssize_t
+ # define _typ_ssize_t 1
+ typedef int ssize_t;
+ #endif
+ #ifndef _AST_STD_H
+ # define _def_map_ast 1
+ # if !_def_map_ast
+ # include <ast_map.h>
+ # endif
+ #endif
+}end
+
+run{
+ grep __NO_INCLUDE_WARN__ /usr/include/stat.h >/dev/null 2>&1 &&
+ grep '<name.h>' /usr/include/sys/stat.h >/dev/null 2>&1 &&
+ grep __name_h /usr/include/name.h >/dev/null 2>&1 &&
+ cat <<!
+ /* disable ${HOSTTYPE} <sys/foo.h> vs. <foo.h> clash warnings */
+ #ifndef __NO_INCLUDE_WARN__
+ #define __NO_INCLUDE_WARN__ 1
+ #endif
+ /* disable ${HOSTTYPE} <sys/stat.h> <name.h> hijack */
+ #ifndef __name_h
+ #define __name_h 1
+ #endif
+ !
+}end