source: trunk/third/gcc/scan-types.sh @ 8834

Revision 8834, 4.9 KB checked in by ghudson, 28 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r8833, which included commits to RCS files with non-trunk default branches.
  • Property svn:executable set to *
Line 
1#! /bin/sh
2# Deduce values of standard ANSI and POSIX types (e.g. size_t, pid_t).
3# Emits macros definitions for these, and some other types.
4# Intended to be used to massage the sys-protos.h file.
5# Expects one arg, which is the GCC source directory.
6
7CC=${CC-"./xgcc -B$1/"}
8CPP=${CPP-`echo ${CC} -E -I"$1/"`}
9SED=sed
10
11# Generate definitions for the standard types (such as mode_t)
12# compatible with those in the standard C header files.
13# It works by a dummy program through the C pre-processor, and then
14# using sed to search for typedefs in the output.
15
16cat >st-dummy.c <<!EOF!
17#include <sys/types.h>
18#include <stddef.h>
19#include <stdarg.h>
20#include <stdio.h>
21#include <time.h>
22#include <signal.h>
23#ifdef size_t
24typedef size_t Xsize_t;
25#elif defined(__SIZE_TYPE__)
26typedef __SIZE_TYPE__ Xsize_t;
27#endif
28#ifdef va_list
29typedef va_list XXXva_list;
30#endif
31!EOF!
32
33if ${CPP} st-dummy.c >TMP ; then true
34else
35  echo "scan-types: could not invoke ${CPP} on st-dummy.c" 1>&2 ; exit 1
36fi
37tr '    ' ' ' <TMP >st-dummy.out
38
39for 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 ; do
40    IMPORTED=`eval 'echo $'"$TYPE"`
41    if [ -n "${IMPORTED}" ] ; then
42        eval "$TYPE='$IMPORTED"
43    else
44        # Search st-dummy.out for a typedef for $TYPE, and write it out
45        # to TMP in #define syntax.
46        rm -f TMP
47        ${SED} -n -e "s|.*typedef  *\(.*\) X*$TYPE *;.*|\1|w TMP" <st-dummy.out>/dev/null
48        # Now select the first definition.
49        if [ -s TMP ]; then
50            # VALUE is now the typedef'd definition of $TYPE.
51            eval "VALUE='`${SED} -e 's| *$||' -e '2,$d' <TMP`'"
52            # Unless VALUE contains a blank, look for a typedef for it
53            # in turn (this could be a loop, but that would be over-kill).
54            if echo $VALUE | grep " " >/dev/null ; then true
55            else
56                rm -f TMP
57                ${SED} -n -e "s|.*typedef[      ][      ]*\(.*[^a-zA-Z0-9_]\)${VALUE}[  ]*;.*|\1|w TMP" <st-dummy.out>/dev/null
58                if [ -s TMP ]; then
59                    eval "VALUE='`${SED} -e '2,$d' -e 's|[      ]*$||' <TMP`'"
60                fi
61            fi
62            eval "$TYPE='$VALUE'"
63        fi
64    fi
65done
66
67cat <<!EOF!
68#define ${macro_prefix}clock_t ${clock_t-int /* default */}
69#define ${macro_prefix}dev_t ${dev_t-int /* default */}
70#define ${macro_prefix}fpos_t ${fpos_t-long /* default */}
71#define ${macro_prefix}gid_t ${gid_t-int /* default */}
72#define ${macro_prefix}ino_t ${ino_t-int /* default */}
73#define ${macro_prefix}mode_t ${mode_t-int /* default */}
74#define ${macro_prefix}nlink_t ${nlink_t-int /* default */}
75#define ${macro_prefix}off_t ${off_t-long /* default */}
76#define ${macro_prefix}pid_t ${pid_t-int /* default */}
77#define ${macro_prefix}ptrdiff_t __PTRDIFF_TYPE__
78#define ${macro_prefix}size_t __SIZE_TYPE__
79#define ${macro_prefix}time_t ${time_t-int /* default */}
80#define ${macro_prefix}uid_t ${uid_t-int /* default */}
81#define ${macro_prefix}wchar_t __WCHAR_TYPE__
82#define ${macro_prefix}int32_t ${int32_t-int /* default */}
83#define ${macro_prefix}uint32_t ${uint32_t-unsigned int /* default */}
84!EOF!
85
86# (wait_arg_t*) should be (int*), according to Posix, but
87# BSD traditionally used (union wait*).  Use (void*) to allow either usage.
88echo "#define ${macro_prefix}wait_arg_t void"
89
90# ssize_t is the signed version of size_t
91if [ -n "${ssize_t}" ] ; then
92    echo "#define ${macro_prefix}ssize_t ${ssize_t}"
93elif [ -z "${size_t}" ] ; then
94    echo "#define ${macro_prefix}ssize_t long"
95else
96    # Remove "unsigned" from ${size_t} to get ${ssize_t}.
97    tmp="`echo ${size_t} | ${SED} -e 's|unsigned||g' -e 's|  | |g'`"
98    if [ -z "$tmp" ] ; then
99        tmp=int
100    else
101        # check $tmp doesn't conflict with <unistd.h>
102        echo "#include <unistd.h>
103        extern $tmp read();" >st-dummy.c
104        ${CC} -c st-dummy.c >/dev/null 2>&1 || tmp=int
105    fi
106    echo "#define ${macro_prefix}ssize_t $tmp /* default */"
107fi
108
109# va_list can cause problems (e.g. some systems have va_list as a struct).
110# Check to see if ${va_list-char*} really is compatible with stdarg.h.
111cat >st-dummy.c <<!EOF!
112#define X_va_list ${va_list-char* /* default */}
113extern long foo(X_va_list ap); /* Check that X_va_list compiles on its own */
114#include <stdarg.h>
115long foo(X_va_list ap) { return va_arg(ap, long); }
116long bar(int i, ...)
117{ va_list ap; long j; va_start(ap, i); j = foo(ap); va_end(ap); return j; }
118!EOF!
119if ${CC} -c st-dummy.c >/dev/null 2>&1 ; then
120  # Ok: We have something that works.
121  echo "#define ${macro_prefix}va_list ${va_list-char* /* default */}"
122else
123  # No, it breaks.  Indicate that <stdarg.h> must be included.
124  echo "#define ${macro_prefix}NEED_STDARG_H
125#define ${macro_prefix}va_list va_list"
126fi
127
128# stuff needed for curses.h
129
130# This isn't correct for SVR4 (for example).  However, we only
131# use this when adding a missing prototype, so it shouldn't matter.
132echo "#define chtype int"
133# sys-protos.h uses non-standard names (due to the CHTYPE argument problem).
134echo "#define box32 box"
135echo "#define initscr32 initscr"
136echo "#define w32addch waddch"
137echo "#define w32insch winsch"
138
139rm -f st-dummy.c st-dummy.o TMP st-dummy.out
Note: See TracBrowser for help on using the repository browser.