xref: /onnv-gate/usr/src/lib/libshell/common/features/math.sh (revision 12068:08a39a083754)
14887Schin########################################################################
24887Schin#                                                                      #
34887Schin#               This software is part of the ast package               #
4*12068SRoger.Faulkner@Oracle.COM#          Copyright (c) 1982-2010 AT&T Intellectual Property          #
54887Schin#                      and is licensed under the                       #
64887Schin#                  Common Public License, Version 1.0                  #
78462SApril.Chin@Sun.COM#                    by AT&T Intellectual Property                     #
84887Schin#                                                                      #
94887Schin#                A copy of the License is available at                 #
104887Schin#            http://www.opensource.org/licenses/cpl1.0.txt             #
114887Schin#         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         #
124887Schin#                                                                      #
134887Schin#              Information and Software Systems Research               #
144887Schin#                            AT&T Research                             #
154887Schin#                           Florham Park NJ                            #
164887Schin#                                                                      #
174887Schin#                  David Korn <dgk@research.att.com>                   #
184887Schin#                                                                      #
194887Schin########################################################################
204887Schin: generate the ksh math builtin table
214887Schin: include math.tab
224887Schin
2310898Sroland.mainz@nrubsig.org# @(#)math.sh (AT&T Research) 2009-08-18
244887Schin
254887Schincommand=$0
2610898Sroland.mainz@nrubsig.orgiffeflags="-n -v"
274887Schiniffehdrs="math.h ieeefp.h"
284887Schiniffelibs="-lm"
294887Schintable=/dev/null
304887Schin
314887Schineval $1
324887Schinshift
334887Schintable=$1
344887Schin
354887Schinnames=
364887Schintests=
374887Schin
388462SApril.Chin@Sun.COM: check long double
398462SApril.Chin@Sun.COM
408462SApril.Chin@Sun.COMeval `iffe $iffeflags -c "$cc" - typ long.double 2>&$stderr`
418462SApril.Chin@Sun.COM
4210898Sroland.mainz@nrubsig.org: check ast_standards.h
4310898Sroland.mainz@nrubsig.org
4410898Sroland.mainz@nrubsig.orgeval `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'`
4510898Sroland.mainz@nrubsig.orgcase $_use_ast_standards in
4610898Sroland.mainz@nrubsig.org1)	iffeflags="$iffeflags -F ast_standards.h" ;;
4710898Sroland.mainz@nrubsig.orgesac
4810898Sroland.mainz@nrubsig.org
494887Schin: read the table
504887Schin
514887Schinexec < $table
524887Schinwhile	read type args name aka comment
534887Schindo	case $type in
544887Schin	[fi])	names="$names $name"
558462SApril.Chin@Sun.COM		tests="$tests,$name"
568462SApril.Chin@Sun.COM		case $_typ_long_double in
578462SApril.Chin@Sun.COM		1)	tests="$tests,${name}l" ;;
588462SApril.Chin@Sun.COM		esac
594887Schin		eval TYPE_$name=$type ARGS_$name=$args AKA_$name=$aka
604887Schin		;;
614887Schin	esac
624887Schindone
634887Schin
644887Schin: check the math library
654887Schin
668462SApril.Chin@Sun.COMeval `iffe $iffeflags -c "$cc" - lib $tests $iffehdrs $iffelibs 2>&$stderr`
674887Schinlib=
684887Schinfor name in $names
694887Schindo	eval x='$'_lib_${name}l y='$'_lib_${name}
704887Schin	case $x in
714887Schin	1)	lib="$lib,${name}l" ;;
724887Schin	esac
734887Schin	case $y in
744887Schin	1)	case $x in
754887Schin		'')	lib="$lib,${name}" ;;
764887Schin		esac
774887Schin		;;
784887Schin	esac
794887Schindone
804887Schineval `iffe $iffeflags -c "$cc" - dat,npt,mac $lib $iffehdrs $iffelibs 2>&$stderr`
814887Schin
824887Schincat <<!
834887Schin#pragma prototyped
844887Schin
854887Schin/* : : generated by $command from $table : : */
864887Schin
874887Schintypedef Sfdouble_t (*Math_f)(Sfdouble_t,...);
884887Schin
894887Schin!
9010898Sroland.mainz@nrubsig.orgcase $_use_ast_standards in
9110898Sroland.mainz@nrubsig.org1)	echo "#include <ast_standards.h>" ;;
9210898Sroland.mainz@nrubsig.orgesac
934887Schinecho "#include <math.h>"
944887Schincase $_hdr_ieeefp in
9510898Sroland.mainz@nrubsig.org1)	echo "#include <ieeefp.h>" ;;
964887Schinesac
9710898Sroland.mainz@nrubsig.orgecho
984887Schin
994887Schin: generate the intercept functions and table entries
1004887Schin
1014887Schinnl='
1024887Schin'
1034887Schinht='	'
1044887Schintab=
1054887Schinfor name in $names
1064887Schindo	eval x='$'_lib_${name}l y='$'_lib_${name} r='$'TYPE_${name} a='$'ARGS_${name} aka='$'AKA_${name}
1074887Schin	case $x:$y in
1084887Schin	1:*)	f=${name}l
1094887Schin		t=Sfdouble_t
1104887Schin		local=
1114887Schin		;;
1124887Schin	*:1)	f=${name}
1134887Schin		t=double
1144887Schin		local=$_typ_long_double
1154887Schin		;;
11610898Sroland.mainz@nrubsig.org	*)	case $aka in
11710898Sroland.mainz@nrubsig.org		*=*)	f=${aka%%=*}
11810898Sroland.mainz@nrubsig.org			v=${aka#*=}
11910898Sroland.mainz@nrubsig.org			eval x='$'_lib_${f}l y='$'_lib_${f}
12010898Sroland.mainz@nrubsig.org			case $x:$y in
12110898Sroland.mainz@nrubsig.org			1:*)	f=${f}l
12210898Sroland.mainz@nrubsig.org				;;
12310898Sroland.mainz@nrubsig.org			*:1)	;;
12410898Sroland.mainz@nrubsig.org			*)	continue
12510898Sroland.mainz@nrubsig.org				;;
12610898Sroland.mainz@nrubsig.org			esac
12710898Sroland.mainz@nrubsig.org			L=local_$name r=int R=1
12810898Sroland.mainz@nrubsig.org			echo "#ifdef $v${nl}static $r $L(Sfdouble_t x) { return $f(x) == $v; }${nl}#endif"
12910898Sroland.mainz@nrubsig.org			tab="$tab$nl#ifdef $v$nl$ht\"\\0${R}${a}${name}\",$ht(Math_f)${L},${nl}#endif"
13010898Sroland.mainz@nrubsig.org			;;
13110898Sroland.mainz@nrubsig.org		esac
13210898Sroland.mainz@nrubsig.org		continue
1334887Schin		;;
1344887Schin	esac
1354887Schin	eval n='$'_npt_$f m='$'_mac_$f d='$'_dat_$f
1364887Schin	case $r in
1374887Schin	i)	L=int r=int R=1 ;;
1384887Schin	*)	L=Sfdouble_t r=$t R=0 ;;
1394887Schin	esac
1404887Schin	case $d:$m:$n in
1414887Schin	1:*:*|*:1:*)
1424887Schin		;;
1434887Schin	*:*:1)	code="extern $r $f("
1444887Schin		sep=
1454887Schin		for p in 1 2 3 4 5 6 7
1464887Schin		do	code="$code${sep}$t"
1474887Schin			case $a in
1484887Schin			$p)	break ;;
1494887Schin			esac
1504887Schin			sep=","
1514887Schin		done
1524887Schin		code="$code);"
1534887Schin		echo "$code"
1544887Schin		;;
1554887Schin	esac
1564887Schin	case $local:$m:$n:$d in
1578462SApril.Chin@Sun.COM	1:*:*:*|*:1:*:*|*:*:1:)
1584887Schin		args=
1594887Schin		code="static $L local_$f("
1604887Schin		sep=
1614887Schin		for p in 1 2 3 4 5 6 7 8 9
1624887Schin		do	args="$args${sep}a$p"
1634887Schin			code="$code${sep}Sfdouble_t a$p"
1644887Schin			case $a in
1654887Schin			$p)	break ;;
1664887Schin			esac
1674887Schin			sep=","
1684887Schin		done
1694887Schin		code="$code){return $f($args);}"
1704887Schin		echo "$code"
1714887Schin		f=local_$f
1724887Schin		;;
1734887Schin	esac
1744887Schin	for x in $name $aka
1754887Schin	do	tab="$tab$nl$ht\"\\0${R}${a}${x}\",$ht(Math_f)$f,"
1764887Schin	done
1774887Schindone
1784887Schintab="$tab$nl$ht\"\",$ht$ht(Math_f)0"
1794887Schin
1804887Schincat <<!
1814887Schin
1824887Schin/*
1834887Schin * first byte is two-digit octal number.  Last digit is number of args
1844887Schin * first digit is 0 if return value is double, 1 for integer
1854887Schin */
1864887Schinconst struct mathtab shtab_math[] =
1874887Schin{$tab
1884887Schin};
1894887Schin!
190