1420 lines
25 KiB
Bash
1420 lines
25 KiB
Bash
: $XConsortium: shipiffe.sh /main/3 1996/05/10 16:41:50 drk $
|
|
:
|
|
# Glenn Fowler & Phong Vo
|
|
# AT&T Bell Laboratories
|
|
#
|
|
# test if feature exists
|
|
#
|
|
# @(#)iffe (AT&T Bell Laboratories) 05/09/95
|
|
#
|
|
# NOTE: .exe a.out suffix and [\\/] in path patterns for dos/nt
|
|
|
|
command=iffe
|
|
version=05/09/95
|
|
|
|
binding="-Bdynamic -Bstatic -Wl,-ashared -Wl,-aarchive -call_shared -non_shared"
|
|
occ=cc
|
|
defhdr=
|
|
usr=
|
|
deflib=
|
|
dir=FEATURE
|
|
executable="test -x"
|
|
gothdr=
|
|
gotlib=
|
|
ifs=$IFS
|
|
in=
|
|
menu=
|
|
nl="
|
|
"
|
|
one=
|
|
out=
|
|
puthdr=
|
|
putlib=
|
|
pragma=
|
|
prompt=
|
|
case $RANDOM in
|
|
$RANDOM)shell=bsh
|
|
$executable . 2>/dev/null || executable='test -r'
|
|
;;
|
|
*) shell=ksh
|
|
;;
|
|
esac
|
|
static=.
|
|
statictest=
|
|
style=C
|
|
case $COTEMP in
|
|
"") case $HOSTNAME in
|
|
""|?|??|???|????|????)
|
|
tmp=${HOSTNAME}
|
|
;;
|
|
*) case $shell in
|
|
ksh) tmp=${HOSTNAME%${HOSTNAME#????}} ;;
|
|
*) eval `echo $HOSTNAME | sed 's/\(....\).*/tmp=\1/'` ;;
|
|
esac
|
|
;;
|
|
esac
|
|
tmp=${tmp}$$
|
|
;;
|
|
*) tmp=$COTEMP
|
|
;;
|
|
esac
|
|
case $tmp in
|
|
??????????*)
|
|
case $shell in
|
|
ksh) tmp=${tmp%${tmp#?????????}} ;;
|
|
*) eval `echo $tmp | sed 's/\(.........\).*/tmp=\1/'` ;;
|
|
esac
|
|
;;
|
|
?????????)
|
|
;;
|
|
????????)
|
|
tmp=F$tmp
|
|
;;
|
|
esac
|
|
tmp=./$tmp
|
|
|
|
# standard error to /dev/null unless debugging
|
|
# standard output to the current output file
|
|
#
|
|
# stdout original standard output
|
|
# stderr original standard error
|
|
# nullin /dev/null input
|
|
# nullout /dev/null output
|
|
|
|
stdin=4 stdout=5 stderr=6 nullin=7 nullout=8
|
|
eval "exec $stdin<&0 $nullin>/dev/null $nullout>/dev/null $stdout>&1 $stderr>&2 2>&$nullout"
|
|
|
|
# options -- `-' for output to stdout otherwise usage
|
|
|
|
while :
|
|
do case $# in
|
|
0) in=-
|
|
break
|
|
;;
|
|
esac
|
|
case $1 in
|
|
-) out=-
|
|
;;
|
|
-*) echo "Usage: $command [-] [op [arg ... [-l* *.a *.sh * ...]] [: op ...]" >&$stderr
|
|
exit 2
|
|
;;
|
|
*) break
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
# tmp files cleaned up on exit
|
|
# status: 0:success 1:failure 2:interrupt
|
|
|
|
status=2
|
|
trap "rm -f $tmp*.*; exit \$status" 0 1 2
|
|
|
|
# standard header for c source
|
|
|
|
std='#if defined(__STDC__) || defined(__cplusplus) || defined(c_plusplus)
|
|
#define _STD_ 1
|
|
#define _ARG_(x) x
|
|
#define _VOID_ void
|
|
#else
|
|
#define _STD_ 0
|
|
#define _ARG_(x) ()
|
|
#define _VOID_ char
|
|
#endif
|
|
#if defined(__cplusplus)
|
|
#define _BEGIN_EXTERNS_ extern "C" {
|
|
#define _END_EXTERNS_ }
|
|
#else
|
|
#define _BEGIN_EXTERNS_
|
|
#define _END_EXTERNS_
|
|
#endif
|
|
#define _NIL_(x) ((x)0)'
|
|
|
|
# loop on op [ arg [ ... ] ] [ : op [ arg [ ... ] ] ]
|
|
|
|
cur=.
|
|
while :
|
|
do case $in in
|
|
"") case $# in
|
|
0) set set out + ;;
|
|
esac
|
|
;;
|
|
*) read lin || lin="set out +"
|
|
set x $lin
|
|
shift
|
|
;;
|
|
esac
|
|
|
|
# check if "run xxx" is equivalent to "set in xxx"
|
|
|
|
case $1 in
|
|
run) case $shell in
|
|
ksh) x=${2##*[\\/]}
|
|
;;
|
|
*) case $2 in
|
|
*/*) x=`echo $2 | sed -e 's,.*[\\\\/],,'` ;;
|
|
*) x=$2 ;;
|
|
esac
|
|
;;
|
|
esac
|
|
case $x in
|
|
*.*) ;;
|
|
*) set set in $2 ;;
|
|
esac
|
|
;;
|
|
esac
|
|
|
|
# set drops out early
|
|
|
|
case $1 in
|
|
""|\#*) continue
|
|
;;
|
|
set) shift
|
|
case $1 in
|
|
""|\#*) op=
|
|
;;
|
|
*) op=$1
|
|
shift
|
|
arg=
|
|
while :
|
|
do case $# in
|
|
0) break ;;
|
|
esac
|
|
case $1 in
|
|
*" "*) shift
|
|
continue
|
|
;;
|
|
""|\#*) break
|
|
;;
|
|
:) shift
|
|
break
|
|
;;
|
|
esac
|
|
case $arg in
|
|
"") arg=$1 ;;
|
|
*) arg="$arg $1" ;;
|
|
esac
|
|
shift
|
|
done
|
|
;;
|
|
esac
|
|
case $op in
|
|
cc) occ=
|
|
for x in $arg
|
|
do case $occ in
|
|
"") case $x in
|
|
*=*) case $shell in
|
|
ksh) export $x
|
|
;;
|
|
*) eval $x
|
|
export `echo $x | sed -e 's/=.*//'`
|
|
;;
|
|
esac
|
|
;;
|
|
*) occ=$x
|
|
;;
|
|
esac
|
|
;;
|
|
*) occ="$occ $x"
|
|
;;
|
|
esac
|
|
done
|
|
continue
|
|
;;
|
|
debug) case $arg in
|
|
0) exec 2>&$nullout
|
|
set -
|
|
;;
|
|
""|1) exec 2>&$stderr
|
|
set -
|
|
;;
|
|
2) exec 2>&$stderr
|
|
case $shell in
|
|
ksh) PS4="${PS4%+*([ ])}+\$LINENO+ "
|
|
esac
|
|
set -x
|
|
;;
|
|
*) echo "$command: $arg: debug levels are 0, 1, 2" >&$stderr
|
|
;;
|
|
esac
|
|
continue
|
|
;;
|
|
"in") case $arg in
|
|
"") in=-
|
|
;;
|
|
*) in=$arg
|
|
if test ! -r $in
|
|
then echo "$command: $in: not found" >&$stderr
|
|
exit 1
|
|
fi
|
|
exec < $in
|
|
case $out in
|
|
"") case $in in
|
|
*[.\\/]*)
|
|
case $shell in
|
|
ksh) out=${in##*[\\/]}
|
|
out=${out%.*}
|
|
;;
|
|
*) eval `echo $in | sed -e 's,.*[\\\\/],,' -e 's/\.[^.]*//' -e 's/^/out=/'`
|
|
;;
|
|
esac
|
|
;;
|
|
*) out=$in
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
continue
|
|
;;
|
|
nodebug)exec 2>&$nullout
|
|
set -
|
|
continue
|
|
;;
|
|
out) out=$arg
|
|
defhdr=
|
|
usr=
|
|
deflib=
|
|
gothdr=
|
|
gotlib=
|
|
one=
|
|
puthdr=
|
|
putlib=
|
|
;;
|
|
prototyped|noprototyped)
|
|
pragma="$pragma $op"
|
|
;;
|
|
pragma) pragma="$pragma $arg"
|
|
;;
|
|
shell) shell=$arg
|
|
continue
|
|
;;
|
|
static) static=$arg
|
|
continue
|
|
;;
|
|
*) echo "$command: $op: unkown option" >&$stderr
|
|
exit 1
|
|
;;
|
|
esac
|
|
;;
|
|
*) case $1 in
|
|
*\{) op=-
|
|
;;
|
|
*) op=$1
|
|
shift
|
|
;;
|
|
esac
|
|
arg=
|
|
cc=$occ
|
|
fail=
|
|
hdr=
|
|
lib=
|
|
lst=hdr
|
|
note=
|
|
opt=
|
|
pass=
|
|
run=
|
|
src=
|
|
test=
|
|
case $# in
|
|
0) ;;
|
|
*) case $1 in
|
|
\#*) set x
|
|
shift
|
|
;;
|
|
*) case $op in
|
|
ref) ;;
|
|
*) case $1 in
|
|
*\{) arg=-
|
|
;;
|
|
*) arg=$1
|
|
shift
|
|
esac
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
while :
|
|
do case $# in
|
|
0) break ;;
|
|
esac
|
|
case $1 in
|
|
"") ;;
|
|
\#*) set x
|
|
;;
|
|
[a-z]*\{)
|
|
v=$1
|
|
shift
|
|
x=
|
|
case $v in
|
|
menu\{) sep=" $nl " ;;
|
|
*) sep=$nl ;;
|
|
esac
|
|
while :
|
|
do case $# in
|
|
0) case $in in
|
|
"") echo "$command: missing }end" >&$stderr
|
|
exit 1
|
|
;;
|
|
esac
|
|
while :
|
|
do if read lin
|
|
then set "" $lin
|
|
case $2 in
|
|
\}end) shift
|
|
break 2
|
|
;;
|
|
esac
|
|
x="$x$sep$lin"
|
|
else echo "$command: missing }end" >&$stderr
|
|
exit 1
|
|
fi
|
|
done
|
|
;;
|
|
esac
|
|
case $1 in
|
|
\}end) break
|
|
;;
|
|
*) x="$x$sep$1"
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
case $v in
|
|
fail\{) fail=$x ;;
|
|
menu\{) menu=$x ;;
|
|
nofail\{) pass=$x v=pass\{ ;;
|
|
nopass\{) fail=$x v=fail\{ ;;
|
|
note\{) note=$x ;;
|
|
pass\{) pass=$x ;;
|
|
prompt\{) prompt=$x ;;
|
|
test\{) test=$x ;;
|
|
*) src=$x run=$v ;;
|
|
esac
|
|
;;
|
|
:) shift
|
|
break
|
|
;;
|
|
*[\(\)\{\}\ \ ]*)
|
|
test="$test $1"
|
|
;;
|
|
-) case $lst in
|
|
hdr) hdr="$hdr $1" ;;
|
|
lib) lib="$lib $1" ;;
|
|
esac
|
|
;;
|
|
-l*) lib="$lib $1"
|
|
lst=lib
|
|
;;
|
|
-*|+*) case $op in
|
|
ref) cc="$cc $1" occ="$occ $1" ;;
|
|
run) opt="$opt $1" ;;
|
|
*) cc="$cc $1" ;;
|
|
esac
|
|
;;
|
|
*.a) lib="$lib $1"
|
|
lst=lib
|
|
;;
|
|
*[.\\/]*)
|
|
hdr="$hdr $1"
|
|
lst=hdr
|
|
;;
|
|
*) test="$test $1"
|
|
;;
|
|
esac
|
|
shift
|
|
done
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
|
|
# check for interactive queries
|
|
|
|
case $menu$prompt in
|
|
?*) style=sh
|
|
case $arg in
|
|
"") arg=REPLY ;;
|
|
esac
|
|
eval $arg=
|
|
while :
|
|
do case $prompt in
|
|
?*) case $prompt in
|
|
$nl*) ;;
|
|
*) echo >&$stdout ;;
|
|
esac
|
|
echo "$prompt" >&$stdout
|
|
esac
|
|
echo >&$stdout
|
|
IFS=" "
|
|
set "" $menu "$nl"
|
|
IFS=$ifs
|
|
shift
|
|
any=
|
|
n=
|
|
while :
|
|
do case $1 in
|
|
$nl) shift; continue ;;
|
|
esac
|
|
n=_$n
|
|
case $# in
|
|
0) break ;;
|
|
esac
|
|
case $1 in
|
|
-) p="*" any=1 ;;
|
|
*) p=$1 ;;
|
|
esac
|
|
shift
|
|
case $1 in
|
|
$nl) t= ;;
|
|
-) t=; shift ;;
|
|
*) t=" $1"; shift ;;
|
|
esac
|
|
v=$1
|
|
shift
|
|
case $1 in
|
|
$nl) shift ;;
|
|
esac
|
|
x=$v
|
|
case $v in
|
|
-|$nl) v= ;;
|
|
esac
|
|
case $t in
|
|
"") t=$v ;;
|
|
esac
|
|
case $v$x in
|
|
$nl) v=$p ;;
|
|
esac
|
|
echo " $p)$t" >&$stdout
|
|
eval p$n='"$p"' v$n='"$v"'
|
|
done
|
|
eval p$n="*" v$n=
|
|
case $n in
|
|
_) any=1 ;;
|
|
*) echo >&$stdout ;;
|
|
esac
|
|
case $shell in
|
|
ksh) read -u$stdin val ;;
|
|
*) val=`exec <&$stdin; read val; echo val` ;;
|
|
esac
|
|
i=
|
|
while :
|
|
do i=_$i
|
|
case $i in
|
|
$n) case $any in
|
|
"") val= ;;
|
|
esac
|
|
break
|
|
;;
|
|
esac
|
|
eval p='$'p$i v='$'v$i
|
|
case $val in
|
|
"$p") any=1
|
|
val=$v
|
|
break
|
|
;;
|
|
"$v") any=1
|
|
break
|
|
;;
|
|
esac
|
|
done
|
|
case $any:$val in
|
|
":") ;;
|
|
*) eval $arg=\$val
|
|
case $test in
|
|
"") break ;;
|
|
*) ( eval "$test" ) <&$stdin >&$stdout 2>&$stderr && break ;;
|
|
esac
|
|
;;
|
|
esac
|
|
echo "$command: invalid input" >&$stderr
|
|
done
|
|
menu=
|
|
prompt=
|
|
op=val
|
|
;;
|
|
esac
|
|
|
|
# check the candidate headers
|
|
|
|
case $hdr in
|
|
?*) z=$hdr
|
|
hdr=
|
|
hit=0
|
|
for x in $z
|
|
do case $x in
|
|
-) case $hit in
|
|
0) hit=1 ;;
|
|
1) ;;
|
|
*) break ;;
|
|
esac
|
|
continue
|
|
;;
|
|
*.h) case " $gothdr " in
|
|
*" - $x "*)
|
|
continue
|
|
;;
|
|
*" + $x "*)
|
|
;;
|
|
*) echo "#include <$x>" > $tmp.c
|
|
if $cc -E $tmp.c <&$nullin >&$nullout
|
|
then gothdr="$gothdr + $x"
|
|
else gothdr="$gothdr - $x"
|
|
continue
|
|
fi
|
|
;;
|
|
esac
|
|
;;
|
|
*) test -r $x || continue
|
|
;;
|
|
esac
|
|
hdr="$hdr $x"
|
|
case $hit in
|
|
0) ;;
|
|
1) hit=2 ;;
|
|
esac
|
|
done
|
|
;;
|
|
esac
|
|
|
|
# check the candidate libraries
|
|
|
|
case $lib in
|
|
?*) z=$lib
|
|
e=
|
|
lib=
|
|
echo "int main(){return(0);}" > $tmp.c
|
|
for x in $z
|
|
do case $x in
|
|
-) case $lib in
|
|
"") continue ;;
|
|
esac
|
|
break
|
|
;;
|
|
esac
|
|
while :
|
|
do case $e in
|
|
"") p=$x ;;
|
|
*) p="$e $x" ;;
|
|
esac
|
|
case " $gotlib " in
|
|
*"- $p "*)
|
|
;;
|
|
*"+ $p"*)
|
|
lib="$lib $p"
|
|
e=
|
|
break
|
|
;;
|
|
*) rm -f $tmp.exe
|
|
if $cc -o $tmp.exe $tmp.c $p <&$nullin >&$nullout
|
|
then gotlib="$gotlib + $p"
|
|
lib="$lib $p"
|
|
e=
|
|
break
|
|
else gotlib="$gotlib - $p"
|
|
fi
|
|
;;
|
|
esac
|
|
case $e in
|
|
"") e=$x
|
|
break
|
|
;;
|
|
*) e=
|
|
;;
|
|
esac
|
|
done
|
|
done
|
|
;;
|
|
esac
|
|
|
|
# precheck some more ops
|
|
|
|
case $op in
|
|
ref) deflib="$deflib $lib"
|
|
defhdr="$defhdr $hdr"
|
|
continue
|
|
;;
|
|
esac
|
|
IFS=,
|
|
eval op=\"$op\"
|
|
eval arg=\"$arg\"
|
|
IFS=$ifs
|
|
|
|
# check for op aliases
|
|
|
|
x=
|
|
for o in $op
|
|
do case $o in
|
|
def|default) x="$x cmd dat hdr key lib mth sys typ" ;;
|
|
*) x="$x $o" ;;
|
|
esac
|
|
done
|
|
|
|
# loop on the ops o and args a
|
|
|
|
for o in $x
|
|
do for a in $arg
|
|
do user=
|
|
case $a in
|
|
*[.\\/]*)
|
|
case $o in
|
|
hdr|sys)
|
|
case $a in
|
|
*[\\/]*) x=/ ;;
|
|
*) x=. ;;
|
|
esac
|
|
case $shell in
|
|
ksh) p=${a%%${x}*}
|
|
v=${a##*${x}}
|
|
;;
|
|
*) eval `echo $a | sed -e "s/\\(.*\\)\\\\${x}\\(.*\\)/p=\\1 v=\\2/"`
|
|
;;
|
|
esac
|
|
case $v in
|
|
lcl) t=$p
|
|
p=$v
|
|
v=$t
|
|
;;
|
|
esac
|
|
;;
|
|
*) case $shell in
|
|
ksh) p=${a%.*}
|
|
p=${p##*[\\/]}
|
|
v=${a##*.}
|
|
v=${v##*[\\/]}
|
|
;;
|
|
*) eval `echo $a | sed -e 's,.*[\\\\/],,' -e 's/\(.*\)\.\(.*\)/p=\1 v=\2/'`
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
f=${p}/${v}
|
|
case $o in
|
|
run) v=$p
|
|
p=
|
|
m=_${v}
|
|
;;
|
|
mem) m=_${v}_${p}
|
|
;;
|
|
*) m=_${p}_${v}
|
|
;;
|
|
esac
|
|
;;
|
|
*) p=
|
|
v=$a
|
|
f=$a
|
|
m=_${v}
|
|
;;
|
|
esac
|
|
|
|
# check output redirection
|
|
|
|
case $out in
|
|
$cur) ;;
|
|
*) case $cur in
|
|
$a|$v) ;;
|
|
*) case $cur in
|
|
.) ;;
|
|
-) case $style in
|
|
C) echo "#endif" ;;
|
|
esac
|
|
;;
|
|
*) case $style in
|
|
C) echo "#endif" ;;
|
|
esac
|
|
exec >&-
|
|
case $cur in
|
|
*[\\/]*|*.h) x=$cur ;;
|
|
*) x=$dir/$cur ;;
|
|
esac
|
|
case $style in
|
|
C) proto -r $tmp.h
|
|
sed 's,/\*[^/]*\*/, ,g' $tmp.h > $tmp.c
|
|
sed 's,/\*[^/]*\*/, ,g' $x > $tmp.t
|
|
;;
|
|
*) sed '/^#/d' $tmp.h > $tmp.c
|
|
sed '/^#/d' $x > $tmp.t
|
|
;;
|
|
esac
|
|
if cmp -s $tmp.c $tmp.t
|
|
then rm -f $tmp.h
|
|
else case $x in
|
|
${dir}[\\/]$cur) test -d $dir || mkdir $dir || exit 1 ;;
|
|
esac
|
|
mv $tmp.h $x
|
|
fi
|
|
;;
|
|
esac
|
|
case $out in
|
|
+) case $status in
|
|
1) ;;
|
|
*) status=0 ;;
|
|
esac
|
|
exit $status
|
|
;;
|
|
-) eval "exec >&$stdout"
|
|
;;
|
|
*) exec >$tmp.h
|
|
;;
|
|
esac
|
|
case $out in
|
|
"") case $a in
|
|
*[\\/]*|???????????????*) cur=$v ;;
|
|
*) cur=$a ;;
|
|
esac
|
|
;;
|
|
*) cur=$out
|
|
;;
|
|
esac
|
|
case $in in
|
|
""|-|+) case $o in
|
|
run) x=" from $a" ;;
|
|
*) x= ;;
|
|
esac
|
|
;;
|
|
*) x=" from $in"
|
|
;;
|
|
esac
|
|
case $style in
|
|
C) echo "/* : : generated$x by $command version $version : : */"
|
|
for x in $pragma
|
|
do echo "#pragma $x"
|
|
done
|
|
case $out in
|
|
""|-|+) x=$m
|
|
;;
|
|
*.*) case $shell in
|
|
ksh) i=$out
|
|
x=_
|
|
while :
|
|
do case $i in
|
|
*.*) x=$x${i%%.*}_
|
|
i=${i#*.}
|
|
;;
|
|
*) x=$x$i
|
|
break
|
|
;;
|
|
esac
|
|
done
|
|
;;
|
|
*) eval `echo $in | sed -e 's,\.,_,g' -e 's/^/x=/'`
|
|
;;
|
|
esac
|
|
;;
|
|
*) x=_$out
|
|
;;
|
|
esac
|
|
case $x in
|
|
*-*) echo "#if 1"
|
|
;;
|
|
*) x=`pwd | sed -e 's,.*[\\\\/],,' -e 's,\..*,,' -e 's,^lib,,' -e 's,^,'${x}_',' -e 's,[^a-zA-Z0-9_],_,g'`
|
|
echo "#ifndef _def${x}"
|
|
echo "#define _def${x} 1"
|
|
;;
|
|
esac
|
|
;;
|
|
*) echo "# : : generated$x by $command version $version : : #"
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
|
|
# set up the candidate include list
|
|
|
|
inc=
|
|
for x in $defhdr $hdr
|
|
do case $x in
|
|
*.h) case $shell in
|
|
ksh) c=${x##*[\\/]}
|
|
c=${c%%.*}
|
|
case $x in
|
|
*/*) c=${x%%[\\/]*}_${c} ;;
|
|
esac
|
|
;;
|
|
*) eval `echo $x | sed -e 's,^\([^\\\\/]*\).*[\\\\/]\([^\\\\/]*\)\$,\1_\2,' -e 's/\..*//' -e 's/^/c=/'`
|
|
;;
|
|
esac
|
|
case $x in
|
|
*/*) c=_${c} ;;
|
|
*) c=_hdr_${c} ;;
|
|
esac
|
|
case " $puthdr " in
|
|
*" $c "*)
|
|
;;
|
|
*) puthdr="$puthdr $c"
|
|
usr="$usr$nl#define $c 1"
|
|
echo "#define $c 1 /* #include <$x> ok */"
|
|
;;
|
|
esac
|
|
inc="$inc
|
|
#include <$x>"
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# set up the candidate lib list
|
|
|
|
for x in $lib $deflib
|
|
do case " $putlib " in
|
|
*" $x "*)
|
|
;;
|
|
*) putlib="$putlib $x"
|
|
echo "/* candidate library $x found */"
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# src overrides builtin test
|
|
|
|
case $o in
|
|
tst) ;;
|
|
*) m=_${o}${m} ;;
|
|
esac
|
|
pre="#undef $v"
|
|
case $src in
|
|
?*) cat > $tmp.c <<!
|
|
$std
|
|
$usr
|
|
$inc
|
|
$src
|
|
!
|
|
e=
|
|
case $run in
|
|
cat*|nocat*)
|
|
echo "$src"
|
|
;;
|
|
run*|norun*)
|
|
(eval "$src") <&$nullin || e=1
|
|
;;
|
|
mac*|nomac*)
|
|
if $cc -E $tmp.c <&$nullin >$tmp.i
|
|
then sed -e '/<<[ ]*".*"[ ]*>>/!d' -e 's/<<[ ]*"//g' -e 's/"[ ]*>>//g' $tmp.i
|
|
else e=1
|
|
fi
|
|
;;
|
|
p*|nop*)$cc -DTEST=$p -DID=$v -E $tmp.c <&$nullin >&$nullout || e=1
|
|
;;
|
|
c*|noc*)$cc -DTEST=$p -DID=$v -c $tmp.c <&$nullin >&$nullout || e=1
|
|
;;
|
|
*) rm -f $tmp.exe
|
|
if $cc -DTEST=$p -DID=$v -o $tmp.exe $tmp.c $lib $deflib <&$nullin >&$nullout && $executable $tmp.exe
|
|
then case $run in
|
|
l*|nol*);;
|
|
o*|noo*)$tmp.exe <&$nullin || e=1 ;;
|
|
*) $tmp.exe <&$nullin >&$nullout || e=1 ;;
|
|
esac
|
|
else e=1
|
|
fi
|
|
;;
|
|
esac
|
|
case $run in
|
|
no*) case $e in
|
|
"") e=1 ;;
|
|
*) e= ;;
|
|
esac
|
|
;;
|
|
esac
|
|
case $e in
|
|
"") case $m in
|
|
*-*) ;;
|
|
*) usr="$usr$nl#define $m 1"
|
|
case $note in
|
|
"") echo "#define $m 1 /* ${run}} passed */" ;;
|
|
*) echo "#define $m 1 /*"$note" */" ;;
|
|
esac
|
|
;;
|
|
esac
|
|
(eval "$pass") <&$nullin
|
|
;;
|
|
*) (eval "$fail") <&$nullin
|
|
;;
|
|
esac
|
|
continue
|
|
;;
|
|
esac
|
|
|
|
# initialize common builtin state
|
|
|
|
case $o in
|
|
dat|lib|mth|run)
|
|
case $statictest in
|
|
"") statictest=FoobaR
|
|
echo "$std
|
|
$usr
|
|
_BEGIN_EXTERNS_
|
|
extern int $statictest;
|
|
_END_EXTERNS_
|
|
int main(){char* i = (char*)&$statictest; return i!=0;}" > $tmp.c
|
|
rm -f $tmp.exe
|
|
if $cc -o $tmp.exe $tmp.c <&$nullin >&$nullout && $executable $tmp.exe
|
|
then case $static in
|
|
.) static=
|
|
echo '#include <stdio.h>
|
|
int main(){printf("hello");return(0);}' > $tmp.c
|
|
rm -f $tmp.exe
|
|
if $cc -c $tmp.c <&$nullin >&$nullout && $cc -o $tmp.exe $tmp.o <&$nullin >&$nullout 2>$tmp.e && $executable $tmp.exe
|
|
then e=`wc -l $tmp.e`
|
|
set x x $binding
|
|
while :
|
|
do shift
|
|
shift
|
|
case $# in
|
|
0) break ;;
|
|
esac
|
|
rm -f $tmp.exe
|
|
$cc -o $tmp.exe $1 $tmp.o <&$nullin >&$nullout 2>$tmp.e && $executable $tmp.exe || continue
|
|
case `wc -l $tmp.e` in
|
|
$e) ;;
|
|
*) continue ;;
|
|
esac
|
|
d=`ls -s $tmp.exe`
|
|
rm -f $tmp.exe
|
|
$cc -o $tmp.exe $2 $tmp.o <&$nullin >&$nullout 2>$tmp.e && $executable $tmp.exe || continue
|
|
case `wc -l $tmp.e` in
|
|
$e) ;;
|
|
*) continue ;;
|
|
esac
|
|
case `ls -s $tmp.exe` in
|
|
$d) ;;
|
|
*) static=$2
|
|
set x
|
|
shift
|
|
break
|
|
;;
|
|
esac
|
|
done
|
|
fi
|
|
;;
|
|
esac
|
|
else static=
|
|
fi
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
|
|
# builtin tests
|
|
|
|
case $o in
|
|
cmd) case $p in
|
|
?*) continue ;;
|
|
esac
|
|
k=
|
|
for j in "" usr
|
|
do case $j in
|
|
"") d= s= ;;
|
|
*) d=/$j s=_$j ;;
|
|
esac
|
|
for i in bin etc ucb
|
|
do if test -f $d/$i/$a
|
|
then case $k in
|
|
"") k=1
|
|
usr="$usr$nl#define $m 1"
|
|
echo "#define $m 1 /* $a in ?(/usr)/(bin|etc|ucb) */"
|
|
;;
|
|
esac
|
|
c=${s}_${i}_${v}
|
|
usr="$usr$nl#define $c 1"
|
|
echo "#define $c 1 /* $d/$i/$a found */"
|
|
fi
|
|
done
|
|
done
|
|
;;
|
|
dat) case $p in
|
|
?*) continue ;;
|
|
esac
|
|
{
|
|
echo "$std
|
|
$usr
|
|
$pre"
|
|
case $inc in
|
|
?*) echo "$inc"
|
|
;;
|
|
*) echo "_BEGIN_EXTERNS_
|
|
extern int $v;
|
|
_END_EXTERNS_"
|
|
;;
|
|
esac
|
|
echo "int main(){char* i = (char*)&$v; return i!=0;}"
|
|
} > $tmp.c
|
|
$cc -c $tmp.c <&$nullin >&$nullout &&
|
|
rm -f $tmp.exe
|
|
if $cc $static -o $tmp.exe $tmp.o $lib $deflib <&$nullin >&$nullout && $executable $tmp.exe
|
|
then usr="$usr$nl#define $m 1"
|
|
echo "#define $m 1 /* $v in default lib(s) */"
|
|
fi
|
|
;;
|
|
hdr|lcl|sys)
|
|
case $o in
|
|
lcl) p=lcl ;;
|
|
esac
|
|
case $p in
|
|
lcl) eval p='$'_lcl_$v
|
|
case $p in
|
|
?*) continue ;;
|
|
esac
|
|
eval _lcl_$v=1
|
|
p=
|
|
f=$v
|
|
;;
|
|
*) case " $puthdr " in
|
|
*" $m "*)
|
|
;;
|
|
*) case $o in
|
|
hdr) x=$f.h ;;
|
|
sys) x=sys/$f.h ;;
|
|
esac
|
|
case " $gothdr " in
|
|
*" - $x "*)
|
|
;;
|
|
*" + $x "*)
|
|
;;
|
|
*) echo "#include <$x>" > $tmp.c
|
|
if $cc -E $tmp.c <&$nullin >&$nullout
|
|
then gothdr="$gothdr + $x"
|
|
usr="$usr$nl#define $m 1"
|
|
echo "#define $m 1 /* #include <$x> ok */"
|
|
else gothdr="$gothdr - $x"
|
|
fi
|
|
;;
|
|
esac
|
|
;;
|
|
esac
|
|
continue
|
|
;;
|
|
esac
|
|
case $p in
|
|
?*) x="$p\\$v" ;;
|
|
*) x=$f ;;
|
|
esac
|
|
case $f in
|
|
*[\\/]*)g=$f ;;
|
|
*) g="$f sys/$f" ;;
|
|
esac
|
|
for f in $g
|
|
do echo "$pre
|
|
$inc
|
|
#include <$f.h>" > $tmp.c
|
|
case $f in
|
|
sys/*) e= ;;
|
|
*) e='-e /[\\\\/]sys[\\\\/]'$x'\.h"/d' ;;
|
|
esac
|
|
if $cc -E $tmp.c <&$nullin >$tmp.i
|
|
then i=`sed -e '/^#[line ]*[0-9][0-9]*[ ][ ]*"[\\\\/].*[\\\\/]'$x'\.h"/!d' $e -e '/\/bits\//d' -e s'/.*"\(.*\)".*/\1/' -e 's,\\\\,/,g' -e 's,///*,/,g' $tmp.i | sort -u`
|
|
for i in $i
|
|
do break
|
|
done
|
|
else i=
|
|
fi
|
|
case $i in
|
|
[\\/]*) echo "#if defined(__STDPP__directive)"
|
|
echo "__STDPP__directive pragma pp:hosted"
|
|
echo "#endif"
|
|
echo "#include \"$i\" /* untrusted local <$f.h> */"
|
|
echo "#undef $m"
|
|
usr="$usr$nl#define $m 1"
|
|
echo "#define $m 1"
|
|
break
|
|
;;
|
|
*) echo "/* no local <$f.h> */"
|
|
;;
|
|
esac
|
|
done
|
|
;;
|
|
key) case $p in
|
|
?*) continue ;;
|
|
esac
|
|
echo "$pre
|
|
int f(){int $v = 1;return($v);}" > $tmp.c
|
|
$cc -c $tmp.c <&$nullin >&$nullout ||
|
|
{
|
|
usr="$usr$nl#define $m 1"
|
|
echo "#define $m 1 /* $v is a reserved keyword */"
|
|
}
|
|
;;
|
|
lib|mth)case $p in
|
|
?*) continue ;;
|
|
esac
|
|
echo "$std
|
|
$usr
|
|
$pre
|
|
$inc
|
|
_BEGIN_EXTERNS_
|
|
extern int $v();
|
|
_END_EXTERNS_
|
|
static int ((*i)())=$v;int main(){return(i==0);}" > $tmp.c
|
|
$cc -c $tmp.c <&$nullin >&$nullout &&
|
|
rm -f $tmp.exe
|
|
if $cc $static -o $tmp.exe $tmp.o $lib $deflib <&$nullin >&$nullout && $executable $tmp.exe
|
|
then case $o in
|
|
lib) usr="$usr$nl#define $m 1"
|
|
echo "#define $m 1 /* $v() in default lib(s) */" ;;
|
|
esac
|
|
else case $o in
|
|
mth) rm -f $tmp.exe
|
|
$cc $static -o $tmp.exe $tmp.o -lm <&$nullin >&$nullout &&
|
|
$executable $tmp.exe &&
|
|
{
|
|
usr="$usr$nl#define $m 1"
|
|
echo "#define $m 1 /* $v() in math lib */"
|
|
}
|
|
;;
|
|
esac
|
|
fi
|
|
;;
|
|
mac) case $p in
|
|
?*) continue ;;
|
|
esac
|
|
echo "$pre
|
|
$inc
|
|
#ifdef $v
|
|
'#define $m 1 /* $v is a macro */'
|
|
#endif" > $tmp.c
|
|
$cc -E $tmp.c <&$nullin | sed -e "/#define/!d" -e "s/'//g" -e "s/^[ ][ ]*//"
|
|
;;
|
|
mem) case $p in
|
|
?*) for i in "" "struct "
|
|
do echo "$pre
|
|
$inc
|
|
static $i$p i;
|
|
int n = sizeof(i.$v);" > $tmp.c
|
|
if $cc -c $tmp.c <&$nullin >&$nullout
|
|
then usr="$usr$nl#define $m 1"
|
|
echo "#define $m 1 /* $v is member of $i$p */"
|
|
break
|
|
fi
|
|
done
|
|
;;
|
|
*) echo "$command: $o: <struct>.<member> expected" >&$stderr
|
|
status=1
|
|
;;
|
|
esac
|
|
;;
|
|
nop) ;;
|
|
one) for i in $a $hdr
|
|
do x="#include <$i>"
|
|
case " $gothdr " in
|
|
*" - $i "*)
|
|
continue
|
|
;;
|
|
*" + $i "*)
|
|
;;
|
|
*) echo "$x" > $tmp.c
|
|
if $cc -E $tmp.c <&$nullin >&$nullout
|
|
then gothdr="$gothdr + $x"
|
|
else gothdr="$gothdr - $x"
|
|
continue
|
|
fi
|
|
;;
|
|
esac
|
|
case $one in
|
|
"") one=$x
|
|
;;
|
|
*"$x"*) break
|
|
;;
|
|
*) echo "$one" > $tmp.c
|
|
if $cc -E $tmp.c <&$nullin >$tmp.i
|
|
then c=$i
|
|
case $c in
|
|
*[\\/]*) c=`echo $c | sed 's,[\\\\/],[/],g'` ;;
|
|
esac
|
|
case `sed -e '/^#[line ]*1[ ][ ]*"[\\\\/].*[\\\\/]'$c'"/!d' $tmp.i` in
|
|
?*) break ;;
|
|
esac
|
|
fi
|
|
one="$one$nl$x"
|
|
;;
|
|
esac
|
|
echo "$x"
|
|
break
|
|
done
|
|
;;
|
|
out) ;;
|
|
run) if test ! -r $a
|
|
then echo "$command: $a: not found" >&$stderr
|
|
exit 1
|
|
fi
|
|
case $a in
|
|
*.c) rm -f $tmp.exe
|
|
cp $a $tmp.c
|
|
$cc -o $tmp.exe $tmp.c $lib $deflib <&$nullin >&$stderr 2>&$stderr &&
|
|
$executable $tmp.exe &&
|
|
$tmp.exe $opt <&$nullin
|
|
;;
|
|
*.sh) (
|
|
set "cc='$cc' executable='$executable' id='$m' static='$static' tmp='$tmp'" $opt $hdr $test
|
|
. $a
|
|
) <&$nullin
|
|
;;
|
|
*) false
|
|
;;
|
|
esac
|
|
case $? in
|
|
0) ;;
|
|
*) echo "$command: $a: cannot run" >&$stderr
|
|
exit 1
|
|
;;
|
|
esac
|
|
;;
|
|
sym) case $test in
|
|
"") x=$v ;;
|
|
*) x=$test ;;
|
|
esac
|
|
echo "$pre
|
|
$inc
|
|
'=' $x '='" > $tmp.c
|
|
$cc -E $tmp.c <&$nullin \
|
|
| sed \
|
|
-e "/'='/!d" \
|
|
-e "s/'='//g" \
|
|
-e 's/[ ]//g' \
|
|
-e 's/((([^()]*)))->/->/g' \
|
|
-e 's/(([^()]*))->/->/g' \
|
|
-e 's/([^()]*)->/->/g' \
|
|
-e 's/\([a-zA-Z_][a-zA-Z_0-9]*\)\[/\
|
|
ary \1[/g' \
|
|
-e 's/\([a-zA-Z_][a-zA-Z_0-9]*\)(/\
|
|
fun \1[/g' \
|
|
-e 's/\*->\([a-zA-Z_]\)/->\
|
|
ptr \1/g' \
|
|
-e 's/->\([a-zA-Z_]\)/->\
|
|
reg \1/g' \
|
|
-e "/^$v\$/d" \
|
|
-e 's/^[a-zA-Z_][a-zA-Z_0-9]*$/\
|
|
nam &/g' \
|
|
| sed \
|
|
-e '/^... /!d' \
|
|
| sort \
|
|
-u \
|
|
| sed \
|
|
-e 's/\(...\) \([a-zA-Z_][a-zA-Z_0-9]*\).*/#ifndef _\1_'$v'\
|
|
#define _\1_'$v' \2\
|
|
#define _\1_'$v'_str "\2"\
|
|
#endif/'
|
|
;;
|
|
typ) case $p in
|
|
"") x= ;;
|
|
*) x="$p " ;;
|
|
esac
|
|
case $typ in
|
|
"") typ="
|
|
#include <sys/types.h>"
|
|
c=_hdr_
|
|
h=
|
|
for i in time "" times
|
|
do case $i in
|
|
"") c=_sys_
|
|
h=sys/
|
|
continue
|
|
;;
|
|
esac
|
|
f=$h$i.h
|
|
t="$typ
|
|
#include <$f>"
|
|
case " $gothdr " in
|
|
*" - $f "*)
|
|
continue
|
|
;;
|
|
*" + $f "*)
|
|
;;
|
|
*) echo "$t" > $tmp.c
|
|
if $cc -c $tmp.c <&$nullin >&$nullout
|
|
then gothdr="$gothdr + $f"
|
|
else gothdr="$gothdr - $f"
|
|
continue
|
|
fi
|
|
;;
|
|
esac
|
|
typ="$t"
|
|
c=$c$i
|
|
case " $puthdr " in
|
|
*" $c "*)
|
|
;;
|
|
*) puthdr="$puthdr $c"
|
|
usr="$usr$nl#define $c 1"
|
|
echo "#define $c 1 /* #include <$f> ok */"
|
|
;;
|
|
esac
|
|
done
|
|
t=
|
|
for i in stddef stdlib
|
|
do f=$i.h
|
|
u="$t
|
|
#include <$f>"
|
|
case " $gothdr " in
|
|
*" - $f "*)
|
|
break
|
|
;;
|
|
*" + $f "*)
|
|
;;
|
|
*) echo "$u$typ" > $tmp.c
|
|
if $cc -c $tmp.c <&$nullin >&$nullout
|
|
then gothdr="$gothdr + $f"
|
|
else gothdr="$gothdr - $f"
|
|
break
|
|
fi
|
|
;;
|
|
esac
|
|
t="$u"
|
|
c=_hdr_$i
|
|
case " $puthdr " in
|
|
*" $c "*)
|
|
;;
|
|
*) puthdr="$puthdr $c"
|
|
usr="$usr$nl#define $c 1"
|
|
echo "#define $c 1 /* #include <$f> ok */"
|
|
;;
|
|
esac
|
|
done
|
|
typ="$t$typ"
|
|
;;
|
|
esac
|
|
{
|
|
case $p in
|
|
long) echo "$pre
|
|
$typ$inc
|
|
static $x$v i;
|
|
$x$v f() {
|
|
$x$v v; v = i;"
|
|
echo "v <<= 4; i = v >> 2; i = v * i; i = i / v; v = v + i; i = i - v; i = 10; i = v % i; i |= v; v ^= i; i = 123; v &= i;
|
|
return v; }"
|
|
;;
|
|
*) echo "$pre
|
|
$typ$inc
|
|
struct xxx { $x$v mem; };
|
|
static struct xxx v;
|
|
struct xxx* f() { return &v; }"
|
|
;;
|
|
esac
|
|
echo "int main() { f(); return 0; }"
|
|
} > $tmp.c
|
|
rm -f $tmp.exe
|
|
if $cc -o $tmp.exe $tmp.c $lib $deflib <&$nullin >&$nullout &&
|
|
$executable $tmp.exe
|
|
then usr="$usr$nl#define $m 1"
|
|
echo "#define $m 1 /* $x$v is a type */"
|
|
user=$pass
|
|
else user=$fail
|
|
fi
|
|
;;
|
|
val) case $arg in
|
|
\"*\") echo $arg=\'$val\' ;;
|
|
*) echo $arg=\"$val\" ;;
|
|
esac
|
|
;;
|
|
:) shift
|
|
;;
|
|
*) echo "$command: $o: unknown feature test" >&$stderr
|
|
status=1
|
|
;;
|
|
esac
|
|
case $user in
|
|
?*) (eval "$user") <&$nullin ;;
|
|
esac
|
|
done
|
|
done
|
|
done
|