|
Packit Service |
a8c26c |
########################################################################
|
|
Packit Service |
a8c26c |
# #
|
|
Packit Service |
a8c26c |
# This software is part of the ast package #
|
|
Packit Service |
a8c26c |
# Copyright (c) 1982-2012 AT&T Intellectual Property #
|
|
Packit Service |
a8c26c |
# and is licensed under the #
|
|
Packit Service |
a8c26c |
# Eclipse Public License, Version 1.0 #
|
|
Packit Service |
a8c26c |
# by AT&T Intellectual Property #
|
|
Packit Service |
a8c26c |
# #
|
|
Packit Service |
a8c26c |
# A copy of the License is available at #
|
|
Packit Service |
a8c26c |
# http://www.eclipse.org/org/documents/epl-v10.html #
|
|
Packit Service |
a8c26c |
# (with md5 checksum b35adb5213ca9657e911e9befb180842) #
|
|
Packit Service |
a8c26c |
# #
|
|
Packit Service |
a8c26c |
# Information and Software Systems Research #
|
|
Packit Service |
a8c26c |
# AT&T Research #
|
|
Packit Service |
a8c26c |
# Florham Park NJ #
|
|
Packit Service |
a8c26c |
# #
|
|
Packit Service |
a8c26c |
# David Korn <dgk@research.att.com> #
|
|
Packit Service |
a8c26c |
# #
|
|
Packit Service |
a8c26c |
########################################################################
|
|
Packit Service |
a8c26c |
: generate the ksh math builtin table
|
|
Packit Service |
a8c26c |
: include math.tab
|
|
Packit Service |
a8c26c |
|
|
Packit Service |
a8c26c |
# @(#)math.sh (AT&T Research) 2012-06-13
|
|
Packit Service |
a8c26c |
|
|
Packit Service |
a8c26c |
command=$0
|
|
Packit Service |
a8c26c |
iffeflags="-n -v"
|
|
Packit Service |
a8c26c |
iffehdrs="math.h"
|
|
Packit Service |
a8c26c |
iffelibs="-lm"
|
|
Packit Service |
a8c26c |
table=/dev/null
|
|
Packit Service |
a8c26c |
|
|
Packit Service |
a8c26c |
eval $1
|
|
Packit Service |
a8c26c |
shift
|
|
Packit Service |
a8c26c |
table=$1
|
|
Packit Service |
a8c26c |
|
|
Packit Service |
a8c26c |
: check long double
|
|
Packit Service |
a8c26c |
|
|
Packit Service |
a8c26c |
eval `iffe $iffeflags -c "$cc" - typ long.double 2>&$stderr`
|
|
Packit Service |
a8c26c |
|
|
Packit Service |
a8c26c |
: check ast_standards.h
|
|
Packit Service |
a8c26c |
|
|
Packit Service |
a8c26c |
eval `iffe $iffeflags -F ast_standards.h -c "$cc" - tst use_ast_standards -lm 'note{' 'math.h needs ast_standards.h' '}end' 'link{' '#include <math.h>' '#ifndef isgreater' '#define isgreater(a,b) 0' '#endif' 'int main() { return isgreater(0.0,1.0); }' '}end'`
|
|
Packit Service |
a8c26c |
case $_use_ast_standards in
|
|
Packit Service |
a8c26c |
1) iffeflags="$iffeflags -F ast_standards.h" ;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
eval `iffe $iffeflags -c "$cc" - tst use_ieeefp -lm 'note{' 'ieeefp.h plays nice' '}end' 'link{' '#include <math.h>' '#include <ieeefp.h>' 'int main() { return 0; }' '}end'`
|
|
Packit Service |
a8c26c |
case $_use_ieeefp in
|
|
Packit Service |
a8c26c |
1) iffehdrs="$iffehdrs ieeefp.h" ;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
|
|
Packit Service |
a8c26c |
: read the table
|
|
Packit Service |
a8c26c |
|
|
Packit Service |
a8c26c |
exec < $table
|
|
Packit Service |
a8c26c |
ifs=$IFS
|
|
Packit Service |
a8c26c |
libs=
|
|
Packit Service |
a8c26c |
names=
|
|
Packit Service |
a8c26c |
nums=
|
|
Packit Service |
a8c26c |
while read type args name aka
|
|
Packit Service |
a8c26c |
do case $type in
|
|
Packit Service |
a8c26c |
[fix]) names="$names $name"
|
|
Packit Service |
a8c26c |
libs="$libs,$name"
|
|
Packit Service |
a8c26c |
case $_typ_long_double in
|
|
Packit Service |
a8c26c |
1) libs="$libs,${name}l" ;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
for a in $aka
|
|
Packit Service |
a8c26c |
do case $a in
|
|
Packit Service |
a8c26c |
'{'*) break
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
*=*) IFS='=|'
|
|
Packit Service |
a8c26c |
set $a
|
|
Packit Service |
a8c26c |
IFS=$ifs
|
|
Packit Service |
a8c26c |
case ",$libs" in
|
|
Packit Service |
a8c26c |
*,$1,*) ;;
|
|
Packit Service |
a8c26c |
*) names="$names $1"
|
|
Packit Service |
a8c26c |
libs="$libs,$1"
|
|
Packit Service |
a8c26c |
case $_typ_long_double in
|
|
Packit Service |
a8c26c |
1) libs="$libs,${1}l" ;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
shift
|
|
Packit Service |
a8c26c |
while :
|
|
Packit Service |
a8c26c |
do case $# in
|
|
Packit Service |
a8c26c |
0) break ;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
case ",$nums" in
|
|
Packit Service |
a8c26c |
*,$1,*) ;;
|
|
Packit Service |
a8c26c |
*) nums="$nums,$1" ;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
shift
|
|
Packit Service |
a8c26c |
done
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
done
|
|
Packit Service |
a8c26c |
eval TYPE_$name='$type' ARGS_$name='$args' AKA_$name='$aka'
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
done
|
|
Packit Service |
a8c26c |
|
|
Packit Service |
a8c26c |
: check the math library
|
|
Packit Service |
a8c26c |
|
|
Packit Service |
a8c26c |
eval `iffe $iffeflags -c "$cc" - lib $libs $iffehdrs $iffelibs 2>&$stderr`
|
|
Packit Service |
a8c26c |
lib=
|
|
Packit Service |
a8c26c |
for name in $names
|
|
Packit Service |
a8c26c |
do eval x='$'_lib_${name}l y='$'_lib_${name}
|
|
Packit Service |
a8c26c |
case $x in
|
|
Packit Service |
a8c26c |
1) lib="$lib,${name}l" ;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
case $y in
|
|
Packit Service |
a8c26c |
1) case $x in
|
|
Packit Service |
a8c26c |
'') lib="$lib,${name}" ;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
done
|
|
Packit Service |
a8c26c |
eval `iffe $iffeflags -c "$cc" - dat,npt,mac $lib $iffehdrs $iffelibs 2>&$stderr`
|
|
Packit Service |
a8c26c |
eval `iffe $iffeflags -c "$cc" - num $nums $iffehdrs $iffelibs 2>&$stderr`
|
|
Packit Service |
a8c26c |
|
|
Packit Service |
a8c26c |
cat <
|
|
Packit Service |
a8c26c |
#pragma prototyped
|
|
Packit Service |
a8c26c |
|
|
Packit Service |
a8c26c |
/* : : generated by $command from $table : : */
|
|
Packit Service |
a8c26c |
|
|
Packit Service |
a8c26c |
typedef Sfdouble_t (*Math_f)(Sfdouble_t,...);
|
|
Packit Service |
a8c26c |
|
|
Packit Service |
a8c26c |
!
|
|
Packit Service |
a8c26c |
case $_use_ast_standards in
|
|
Packit Service |
a8c26c |
1) echo "#include <ast_standards.h>" ;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
echo "#include <math.h>"
|
|
Packit Service |
a8c26c |
case $_hdr_ieeefp in
|
|
Packit Service |
a8c26c |
1) echo "#include <ieeefp.h>" ;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
echo
|
|
Packit Service |
a8c26c |
|
|
Packit Service |
a8c26c |
: generate the intercept functions and table entries
|
|
Packit Service |
a8c26c |
|
|
Packit Service |
a8c26c |
nl='
|
|
Packit Service |
a8c26c |
'
|
|
Packit Service |
a8c26c |
ht=' '
|
|
Packit Service |
a8c26c |
tab=
|
|
Packit Service |
a8c26c |
for name in $names
|
|
Packit Service |
a8c26c |
do eval x='$'_lib_${name}l y='$'_lib_${name} r='$'TYPE_${name} a='$'ARGS_${name} aka='$'AKA_${name}
|
|
Packit Service |
a8c26c |
case $r in
|
|
Packit Service |
a8c26c |
i) L=int R=1 ;;
|
|
Packit Service |
a8c26c |
x) L=Sfdouble_t R=4 ;;
|
|
Packit Service |
a8c26c |
*) L=Sfdouble_t R=0 ;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
F=local_$name
|
|
Packit Service |
a8c26c |
case $x:$y in
|
|
Packit Service |
a8c26c |
1:*) f=${name}l
|
|
Packit Service |
a8c26c |
t=Sfdouble_t
|
|
Packit Service |
a8c26c |
local=
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
*:1) f=${name}
|
|
Packit Service |
a8c26c |
t=double
|
|
Packit Service |
a8c26c |
local=$_typ_long_double
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
*) body=
|
|
Packit Service |
a8c26c |
for k in $aka
|
|
Packit Service |
a8c26c |
do case $body in
|
|
Packit Service |
a8c26c |
?*) body="$body $k"
|
|
Packit Service |
a8c26c |
continue
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
case $k in
|
|
Packit Service |
a8c26c |
'{'*) body=$k
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
*=*) IFS='=|'
|
|
Packit Service |
a8c26c |
set $k
|
|
Packit Service |
a8c26c |
IFS=$ifs
|
|
Packit Service |
a8c26c |
f=$1
|
|
Packit Service |
a8c26c |
shift
|
|
Packit Service |
a8c26c |
v=$*
|
|
Packit Service |
a8c26c |
eval x='$'_lib_${f}l y='$'_lib_${f}
|
|
Packit Service |
a8c26c |
case $x:$y in
|
|
Packit Service |
a8c26c |
1:*) f=${f}l
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
*:1) ;;
|
|
Packit Service |
a8c26c |
*) continue
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
y=
|
|
Packit Service |
a8c26c |
while :
|
|
Packit Service |
a8c26c |
do case $# in
|
|
Packit Service |
a8c26c |
0) break ;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
eval x='$'_num_$1
|
|
Packit Service |
a8c26c |
case $x in
|
|
Packit Service |
a8c26c |
1) case $y in
|
|
Packit Service |
a8c26c |
?*) y="$y || " ;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
y="${y}q == $1"
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
shift
|
|
Packit Service |
a8c26c |
done
|
|
Packit Service |
a8c26c |
case $y in
|
|
Packit Service |
a8c26c |
'') ;;
|
|
Packit Service |
a8c26c |
*) r=int R=1
|
|
Packit Service |
a8c26c |
echo "static $r $F(Sfdouble_t a1) { $r q = $f(a1); return $y; }"
|
|
Packit Service |
a8c26c |
tab="$tab$nl$ht\"\\0${R}${a}${name}\",$ht(Math_f)${F},"
|
|
Packit Service |
a8c26c |
break
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
done
|
|
Packit Service |
a8c26c |
case $body in
|
|
Packit Service |
a8c26c |
?*) code="static $L $F("
|
|
Packit Service |
a8c26c |
sep=
|
|
Packit Service |
a8c26c |
ta=
|
|
Packit Service |
a8c26c |
tc=
|
|
Packit Service |
a8c26c |
td=
|
|
Packit Service |
a8c26c |
for p in 1 2 3 4 5 6 7 8 9
|
|
Packit Service |
a8c26c |
do case $R:$p in
|
|
Packit Service |
a8c26c |
4:2) T=int ;;
|
|
Packit Service |
a8c26c |
*) T=Sfdouble_t ;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
code="$code${sep}$T a$p"
|
|
Packit Service |
a8c26c |
ta="$ta${sep}a$p"
|
|
Packit Service |
a8c26c |
tc="$tc${sep}0"
|
|
Packit Service |
a8c26c |
td="${td}$T a$p;"
|
|
Packit Service |
a8c26c |
case $a in
|
|
Packit Service |
a8c26c |
$p) break ;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
sep=","
|
|
Packit Service |
a8c26c |
done
|
|
Packit Service |
a8c26c |
_it_links_=0
|
|
Packit Service |
a8c26c |
eval `iffe $iffeflags -c "$cc" - tst it_links_ note{ $F function links }end link{ "static $L $F($ta)$td${body}int main(){return $F($tc)!=0;}" }end sfio.h $iffehdrs $iffelibs 2>&$stderr`
|
|
Packit Service |
a8c26c |
case $_it_links_ in
|
|
Packit Service |
a8c26c |
1) code="$code)$body"
|
|
Packit Service |
a8c26c |
echo "$code"
|
|
Packit Service |
a8c26c |
tab="$tab$nl$ht\"\\0${R}${a}${name}\",$ht(Math_f)${F},"
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
continue
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
case $r in
|
|
Packit Service |
a8c26c |
i) r=int ;;
|
|
Packit Service |
a8c26c |
*) r=$t ;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
eval n='$'_npt_$f m='$'_mac_$f d='$'_dat_$f
|
|
Packit Service |
a8c26c |
case $d:$m:$n in
|
|
Packit Service |
a8c26c |
1:*:*|*:1:*)
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
*:*:1) code="extern $r $f("
|
|
Packit Service |
a8c26c |
sep=
|
|
Packit Service |
a8c26c |
for p in 1 2 3 4 5 6 7
|
|
Packit Service |
a8c26c |
do case $p:$f in
|
|
Packit Service |
a8c26c |
2:ldexp*) code="$code${sep}int" ;;
|
|
Packit Service |
a8c26c |
*) code="$code${sep}$t" ;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
case $a in
|
|
Packit Service |
a8c26c |
$p) break ;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
sep=","
|
|
Packit Service |
a8c26c |
done
|
|
Packit Service |
a8c26c |
code="$code);"
|
|
Packit Service |
a8c26c |
echo "$code"
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
case $local:$m:$n:$d in
|
|
Packit Service |
a8c26c |
1:*:*:*|*:1:*:*|*:*:1:)
|
|
Packit Service |
a8c26c |
args=
|
|
Packit Service |
a8c26c |
code="static $L local_$f("
|
|
Packit Service |
a8c26c |
sep=
|
|
Packit Service |
a8c26c |
for p in 1 2 3 4 5 6 7 8 9
|
|
Packit Service |
a8c26c |
do args="$args${sep}a$p"
|
|
Packit Service |
a8c26c |
case $R:$p in
|
|
Packit Service |
a8c26c |
4:2) T=int ;;
|
|
Packit Service |
a8c26c |
*) T=Sfdouble_t ;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
code="$code${sep}$T a$p"
|
|
Packit Service |
a8c26c |
case $a in
|
|
Packit Service |
a8c26c |
$p) break ;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
sep=","
|
|
Packit Service |
a8c26c |
done
|
|
Packit Service |
a8c26c |
code="$code){return $f($args);}"
|
|
Packit Service |
a8c26c |
echo "$code"
|
|
Packit Service |
a8c26c |
f=local_$f
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
for x in $name $aka
|
|
Packit Service |
a8c26c |
do case $x in
|
|
Packit Service |
a8c26c |
'{'*) break
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
*=*) continue
|
|
Packit Service |
a8c26c |
;;
|
|
Packit Service |
a8c26c |
esac
|
|
Packit Service |
a8c26c |
tab="$tab$nl$ht\"\\0${R}${a}${x}\",$ht(Math_f)$f,"
|
|
Packit Service |
a8c26c |
done
|
|
Packit Service |
a8c26c |
done
|
|
Packit Service |
a8c26c |
tab="$tab$nl$ht\"\",$ht$ht(Math_f)0"
|
|
Packit Service |
a8c26c |
|
|
Packit Service |
a8c26c |
cat <
|
|
Packit Service |
a8c26c |
|
|
Packit Service |
a8c26c |
/*
|
|
Packit Service |
a8c26c |
* first byte is two-digit octal number. Last digit is number of args
|
|
Packit Service |
a8c26c |
* first digit is 0 if return value is double, 1 for integer
|
|
Packit Service |
a8c26c |
*/
|
|
Packit Service |
a8c26c |
const struct mathtab shtab_math[] =
|
|
Packit Service |
a8c26c |
{$tab
|
|
Packit Service |
a8c26c |
};
|
|
Packit Service |
a8c26c |
!
|