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) #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 #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