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