Blame src/cmd/ksh93/features/math.sh

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
!