--- /dev/null
+iff AST_COMMON
+hdr pthread
+hdr stddef
+hdr types
+sys types
+typ size_t,ssize_t
+typ long.double
+
+mac SF_CLOSE sys/socket.h
+mac SF_APPEND sys/stat.h
+
+proto stdc note{ Standard-C prototypes ok }end compile{
+ extern int foo(int, int);
+ bar()
+ { foo(1, 1);
+ }
+}end
+
+dll import note{ Microsoft import/export nonsense }end execute{
+ __declspec(dllimport) int foo;
+ main() { return foo == 5 ? 0 : 1; }
+ int bar = 5;
+ int* _imp__foo = &bar;
+}end
+
+xopen stdio note{ Stdio fseek/fflush are X/Open-compliant }end execute{
+ #include <stdio.h>
+ #define Failed(file) (unlink(file),1)
+ main(int argc, char** argv)
+ { FILE *f1, *f2;
+ char file[1024], buf[1024], *f, *t;
+ int i, fd;
+
+ /* create file */
+ for(f = argv[0], t = file; (*t = *f++) != 0; )
+ t++;
+ *t++ = '.'; *t++ = 'D'; *t++ = 0;
+ if((fd = creat(file,0666)) < 0)
+ return 1;
+
+ for (i = 0; i < sizeof(buf); ++i)
+ buf[i] = '0' + (i%10);
+ for (i = 0; i < 16; ++i)
+ if (write(fd,buf,sizeof(buf)) != sizeof(buf))
+ return Failed(file);
+ close(fd);
+
+ if(!(f1 = fopen(file,"r+")) ||
+ (fd = dup(fileno(f1))) < 0 ||
+ !(f2 = fdopen(fd,"r+")) )
+ return Failed(file);
+
+ if(fread(buf, 1, 7, f2) != 7 || ftell(f2) != 7)
+ return Failed(file);
+
+ if(fseek(f1, 1010, 0) < 0 || ftell(f1) != 1010)
+ return Failed(file);
+
+ fflush(f2); /* this should set the seek location to 1010 */
+ if(ftell(f2) != 1010)
+ return Failed(file);
+
+ unlink(file);
+ return 0;
+ }
+}end
+
+cat{
+
+ /* __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) && _proto_stdc
+ #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 /*_BEGIN_EXTERNS_*/
+
+ /* _ARG_ simplifies function prototyping among flavors of C */
+ #ifndef _ARG_
+ #if __STD_C
+ #define _ARG_(x) x
+ #else
+ #define _ARG_(x) ()
+ #endif
+ #endif /*_ARG_*/
+
+ /* __INLINE__ 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 /*Void_t*/
+
+ /* dynamic linked library external scope handling */
+ #undef extern
+ #if _dll_import && !defined(__EXPORT__) && _DLL_BLD
+ #define __EXPORT__ __declspec(dllexport)
+ #endif
+ #if _dll_import && !defined(__IMPORT__)
+ #define __IMPORT__ __declspec(dllimport)
+ #endif
+ #if !defined(_astimport)
+ #if defined(__IMPORT__) && _DLL_BLD
+ #define _astimport __IMPORT__
+ #else
+ #define _astimport extern
+ #endif
+ #endif /*_astimport*/
+}end
+
+cat{
+ #if !_DLL_BLD && _dll_import
+ #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
+ #define __DEFINE__(T,obj,val) T obj = val
+ #endif
+}end
+
+cat{
+ #ifndef _AST_STD_H
+ # if _hdr_stddef
+ # include <stddef.h>
+ # endif
+ # if _sys_types
+ # include <sys/types.h>
+ # 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
+}end
+
+tst - -DN=0 - -DN=1 - -DN=2 - -DN=3 - -DN=4 - -DN=5 - -DN=6 - -DN=7 - -DN=8 output{
+ #define _BYTESEX_H
+
+ #if _STD_
+ #include <stddef.h>
+ #else
+ #include <sys/types.h>
+ #endif
+
+ _BEGIN_EXTERNS_
+ extern int printf _ARG_((const char*, ...));
+ _END_EXTERNS_
+
+ #if N == 0
+ #define _ast_int8_t long
+ #define _ast_int8_str "long"
+ #endif
+ #if N == 1
+ #define _ast_int8_t long long
+ #define _ast_int8_str "long long"
+ #endif
+ #if N == 2
+ #define _ast_int8_t __int64_t
+ #define _ast_int8_str "__int64_t"
+ #endif
+ #if N == 3
+ #define _ast_int8_t _int64_t
+ #define _ast_int8_str "_int64_t"
+ #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
+ #define _ast_int8_str "__int64"
+ #endif
+ #if N == 6
+ #define _ast_int8_t _int64
+ #define _ast_int8_str "_int64"
+ #endif
+ #if N == 7
+ #define _ast_int8_t int64
+ #define _ast_int8_str "int64"
+ #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 = 1;
+ #ifdef _ast_int8_t
+ static _ast_int8_t i_long_long = 1;
+ #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 struct
+ {
+ char* name;
+ int size;
+ } flt_type[] =
+ {
+ "float", sizeof(float),
+ "double", sizeof(double),
+ #ifdef _typ_long_double
+ "long double", sizeof(long double),
+ #endif
+ };
+
+ 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); t++)
+ if(int_type[t].size >= int_size[s])
+ break;
+ if (t < elementsof(int_type))
+ {
+ m = int_size[s];
+ printf("#define _ast_int%d_t\t\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++)
+ {
+ for(; t < elementsof(flt_type); t++)
+ if(flt_type[t].size != flt_type[t + 1].size)
+ break;
+ m = flt_type[t].size;
+ printf("#define _ast_flt%d_t\t\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
+
+tst - -DTRY=1 - -DTRY=1 -Dvoid=char - -DTRY=2 - -DTRY=3 - -DTRY=4 output{
+ #define printf ______printf
+ #ifdef __STDC__
+ #include <stdarg.h>
+ #else
+ #include <varargs.h>
+ #endif
+ #undef printf
+ _BEGIN_EXTERNS_
+ extern int printf _ARG_((const char*, ...));
+ _END_EXTERNS_
+ static va_list ap;
+ main()
+ {
+ #if TRY == 4
+ printf("\n#ifndef va_listref\n");
+ 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
+ #if TRY == 1
+ *ap++;
+ #endif /*TRY == 1*/
+ #if TRY == 2
+ *ap;
+ #endif /*TRY == 2*/
+ #if TRY == 3
+ ap++;
+ #endif /*TRY == 3*/
+
+ printf("\n#ifndef va_listref\n");
+ 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");
+ #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 defined(_WIN32) || !defined(va_copy)
+ printf("#ifndef va_copy\n");
+ #if TRY == 2
+ printf("#define va_copy(to,fr) memcpy(to,fr,sizeof(va_list))\t");
+ printf("/* copy va_list fr -> to */\n");
+ #else
+ printf("#define va_copy(to,fr) ((to)=(fr))\t");
+ printf("/* copy va_list fr -> to */\n");
+ #endif
+ printf("#endif\n");
+ #endif
+
+ printf("#undef _ast_va_list\n");
+ printf("#ifdef va_start\n");
+ printf("#define _ast_va_list va_list\n");
+ printf("#else\n");
+ #if TRY == 1 || TRY == 2
+ printf("#define _ast_va_list void*\t");
+ #else
+ #if TRY == 3
+ if (sizeof(va_list) == sizeof(long))
+ printf("#define _ast_va_list long\t");
+ else if (sizeof(va_list) == sizeof(short))
+ printf("#define _ast_va_list short\t");
+ else
+ printf("#define _ast_va_list int\t");
+ #else
+ printf("#define _ast_va_list ...\t");
+ #endif
+ #endif
+ printf("/* va_list that avoids #include */\n");
+ printf("#endif\n\n");
+ printf("#endif\n");
+ return 0;
+ }
+}end