#! /bin/sh # Deduce values of standard ANSI and POSIX types (e.g. size_t, pid_t). # Emits macros definitions for these, and some other types. # Intended to be used to massage the sys-protos.h file. # Expects one arg, which is the GCC source directory. setglobal CC = $(CC-"./xgcc -B$1/") setglobal CPP = $(CPP-`echo ${CC} -E -I"$1/"`) setglobal SED = 'sed' # Generate definitions for the standard types (such as mode_t) # compatible with those in the standard C header files. # It works by a dummy program through the C pre-processor, and then # using sed to search for typedefs in the output. cat >st-dummy.c << """ #include #include #include #include #include #include #ifdef size_t typedef size_t Xsize_t; #elif defined(__SIZE_TYPE__) typedef __SIZE_TYPE__ Xsize_t; #endif #ifdef va_list typedef va_list XXXva_list; #endif """ if $(CPP) st-dummy.c >TMP { true } else { echo "scan-types: could not invoke $(CPP) on st-dummy.c" !1 > !2 ; exit 1 } tr ' ' ' ' st-dummy.out for TYPE in [dev_t clock_t fpos_t gid_t ino_t mode_t nlink_t off_t pid_t size_t ssize_t time_t uid_t va_list int32_t uint_32_t] { setglobal IMPORTED = $[eval 'echo $'"$TYPE] if test -n $(IMPORTED) { eval "$TYPE='$IMPORTED" } else { # Search st-dummy.out for a typedef for $TYPE, and write it out # to TMP in #define syntax. rm -f TMP $(SED) -n -e "s|.*typedef *\(.*\) X*$TYPE *;.*|\1|w TMP" /dev/null # Now select the first definition. if test -s TMP { # VALUE is now the typedef'd definition of $TYPE. eval "VALUE='$[$(SED) -e 's| *$||' -e '2,$d' /dev/null { true } else { rm -f TMP $(SED) -n -e "s|.*typedef[ ][ ]*\(.*[^a-zA-Z0-9_]\)$(VALUE)[ ]*;.*|\1|w TMP" /dev/null if test -s TMP { eval "VALUE='$[$(SED) -e '2,$d' -e 's|[ ]*$||' echo "#include extern $tmp read();" >st-dummy.c $(CC) -c st-dummy.c >/dev/null !2 > !1 || setglobal tmp = 'int' } echo "#define $(macro_prefix)ssize_t $tmp /* default */" } # va_list can cause problems (e.g. some systems have va_list as a struct). # Check to see if ${va_list-char*} really is compatible with stdarg.h. cat >st-dummy.c << """ #define X_va_list $(va_list-char* /* default */) extern long foo(X_va_list ap); /* Check that X_va_list compiles on its own */ #include long foo(X_va_list ap) { return va_arg(ap, long); } long bar(int i, ...) { va_list ap; long j; va_start(ap, i); j = foo(ap); va_end(ap); return j; } """ if $(CC) -c st-dummy.c >/dev/null !2 > !1 { # Ok: We have something that works. echo "#define $(macro_prefix)va_list $(va_list-char* /* default */)" } else { # No, it breaks. Indicate that must be included. echo "#define $(macro_prefix)NEED_STDARG_H #define $(macro_prefix)va_list va_list" } # stuff needed for curses.h # This isn't correct for SVR4 (for example). However, we only # use this when adding a missing prototype, so it shouldn't matter. echo "#define chtype int" # sys-protos.h uses non-standard names (due to the CHTYPE argument problem). echo "#define box32 box" echo "#define initscr32 initscr" echo "#define w32addch waddch" echo "#define w32insch winsch" rm -f st-dummy.c st-dummy.o TMP st-dummy.out