da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin########################################################################
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# This software is part of the ast package #
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner# Copyright (c) 1982-2010 AT&T Intellectual Property #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# and is licensed under the #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Common Public License, Version 1.0 #
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin# by AT&T Intellectual Property #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# A copy of the License is available at #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# http://www.opensource.org/licenses/cpl1.0.txt #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Information and Software Systems Research #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# AT&T Research #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# Florham Park NJ #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# David Korn <dgk@research.att.com> #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin# #
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin########################################################################
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin: generate the ksh math builtin table
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin: include math.tab
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz# @(#)math.sh (AT&T Research) 2009-08-18
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincommand=$0
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainziffeflags="-n -v"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chiniffehdrs="math.h ieeefp.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chiniffelibs="-lm"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintable=/dev/null
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chineval $1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinshift
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintable=$1
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinnames=
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintests=
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin: check long double
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chineval `iffe $iffeflags -c "$cc" - typ long.double 2>&$stderr`
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz: check ast_standards.h
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzeval `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'`
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcase $_use_ast_standards in
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz1) iffeflags="$iffeflags -F ast_standards.h" ;;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzesac
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin: read the table
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinexec < $table
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinwhile read type args name aka comment
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindo case $type in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin [fi]) names="$names $name"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin tests="$tests,$name"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin case $_typ_long_double in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 1) tests="$tests,${name}l" ;;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin eval TYPE_$name=$type ARGS_$name=$args AKA_$name=$aka
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin: check the math library
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chineval `iffe $iffeflags -c "$cc" - lib $tests $iffehdrs $iffelibs 2>&$stderr`
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinlib=
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfor name in $names
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindo eval x='$'_lib_${name}l y='$'_lib_${name}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case $x in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 1) lib="$lib,${name}l" ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case $y in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 1) case $x in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin '') lib="$lib,${name}" ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chineval `iffe $iffeflags -c "$cc" - dat,npt,mac $lib $iffehdrs $iffelibs 2>&$stderr`
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincat <<!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#pragma prototyped
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* : : generated by $command from $table : : */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef Sfdouble_t (*Math_f)(Sfdouble_t,...);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzcase $_use_ast_standards in
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz1) echo "#include <ast_standards.h>" ;;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzesac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinecho "#include <math.h>"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincase $_hdr_ieeefp in
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz1) echo "#include <ieeefp.h>" ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinesac
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainzecho
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin: generate the intercept functions and table entries
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinnl='
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin'
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinht=' '
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintab=
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinfor name in $names
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindo eval x='$'_lib_${name}l y='$'_lib_${name} r='$'TYPE_${name} a='$'ARGS_${name} aka='$'AKA_${name}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case $x:$y in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 1:*) f=${name}l
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t=Sfdouble_t
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin local=
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *:1) f=${name}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t=double
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin local=$_typ_long_double
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz *) case $aka in
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz *=*) f=${aka%%=*}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz v=${aka#*=}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz eval x='$'_lib_${f}l y='$'_lib_${f}
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz case $x:$y in
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz 1:*) f=${f}l
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ;;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz *:1) ;;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz *) continue
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ;;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz esac
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz L=local_$name r=int R=1
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz echo "#ifdef $v${nl}static $r $L(Sfdouble_t x) { return $f(x) == $v; }${nl}#endif"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz tab="$tab$nl#ifdef $v$nl$ht\"\\0${R}${a}${name}\",$ht(Math_f)${L},${nl}#endif"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz ;;
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz esac
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz continue
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin eval n='$'_npt_$f m='$'_mac_$f d='$'_dat_$f
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case $r in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin i) L=int r=int R=1 ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *) L=Sfdouble_t r=$t R=0 ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case $d:$m:$n in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 1:*:*|*:1:*)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *:*:1) code="extern $r $f("
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sep=
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for p in 1 2 3 4 5 6 7
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do code="$code${sep}$t"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case $a in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin $p) break ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sep=","
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin done
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin code="$code);"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin echo "$code"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case $local:$m:$n:$d in
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin 1:*:*:*|*:1:*:*|*:*:1:)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin args=
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin code="static $L local_$f("
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sep=
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for p in 1 2 3 4 5 6 7 8 9
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do args="$args${sep}a$p"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin code="$code${sep}Sfdouble_t a$p"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case $a in
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin $p) break ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sep=","
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin done
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin code="$code){return $f($args);}"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin echo "$code"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin f=local_$f
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ;;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin esac
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for x in $name $aka
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do tab="$tab$nl$ht\"\\0${R}${a}${x}\",$ht(Math_f)$f,"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin done
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chindone
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintab="$tab$nl$ht\"\",$ht$ht(Math_f)0"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincat <<!
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * first byte is two-digit octal number. Last digit is number of args
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * first digit is 0 if return value is double, 1 for integer
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinconst struct mathtab shtab_math[] =
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{$tab
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin};
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin!