--- loncom/xml/lonxml.pm 2001/05/28 18:27:46 1.80 +++ loncom/xml/lonxml.pm 2001/05/31 22:38:36 1.83 @@ -17,8 +17,7 @@ use strict; use HTML::TokeParser; use Safe; use Safe::Hole; -use Math::Trig; -use Math::Cephes qw(j0 j1 jn jv y0 y1 yn yv); +use Math::Cephes qw(:trigs :hypers :bessels erf erfc); use Opcode; sub register { @@ -173,62 +172,7 @@ sub xmlparse { my $safeeval = new Safe; my $safehole = new Safe::Hole; - $safeeval->permit("entereval"); - $safeeval->permit(":base_math"); - $safeeval->permit("sort"); - $safeeval->deny(":base_io"); -# $safe->share_from('Math::Trig',['acsc','asin','acos','atan']); - $safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT'); - $safehole->wrap(\&Math::Trig::acsc,$safeeval,'&acsc'); - $safehole->wrap(\&Math::Trig::acosec,$safeeval,'&acosec'); - $safehole->wrap(\&Math::Trig::asec,$safeeval,'&asec'); - $safehole->wrap(\&Math::Trig::acot,$safeeval,'&acot'); - $safehole->wrap(\&Math::Trig::acotan,$safeeval,'&acotan'); - $safehole->wrap(\&Math::Trig::acsch,$safeeval,'&acsch'); - $safehole->wrap(\&Math::Trig::acosech,$safeeval,'&acosech'); - $safehole->wrap(\&Math::Trig::asech,$safeeval,'&asech'); - $safehole->wrap(\&Math::Trig::acoth,$safeeval,'&acoth'); - $safehole->wrap(\&Math::Trig::acotanh,$safeeval,'&acotanh'); - $safehole->wrap(\&Math::Trig::asin,$safeeval,'&asin'); - $safehole->wrap(\&Math::Trig::acos,$safeeval,'&acos'); - $safehole->wrap(\&Math::Trig::atan,$safeeval,'&atan'); - $safehole->wrap(\&Math::Trig::asinh,$safeeval,'&asinh'); - $safehole->wrap(\&Math::Trig::acosh,$safeeval,'&acosh'); - $safehole->wrap(\&Math::Trig::atanh,$safeeval,'&atanh'); - $safehole->wrap(\&Math::Trig::atan2,$safeeval,'&atan2'); - $safehole->wrap(\&Math::Trig::csc,$safeeval,'&csc'); - $safehole->wrap(\&Math::Trig::cosec,$safeeval,'&cosec'); - $safehole->wrap(\&Math::Trig::sec,$safeeval,'&sec'); - $safehole->wrap(\&Math::Trig::cot,$safeeval,'&cot'); - $safehole->wrap(\&Math::Trig::cotan,$safeeval,'&cotan'); - $safehole->wrap(\&Math::Trig::csch,$safeeval,'&csch'); - $safehole->wrap(\&Math::Trig::cosech,$safeeval,'&cosech'); - $safehole->wrap(\&Math::Trig::sech,$safeeval,'&sech'); - $safehole->wrap(\&Math::Trig::coth,$safeeval,'&coth'); - $safehole->wrap(\&Math::Trig::cotanh,$safeeval,'&cptanh'); - $safehole->wrap(\&Math::Trig::deg2rad,$safeeval,'°2rad'); - $safehole->wrap(\&Math::Trig::deg2grad,$safeeval,'°2grad'); - $safehole->wrap(\&Math::Trig::grad2deg,$safeeval,'&grad2deg'); - $safehole->wrap(\&Math::Trig::grad2rad,$safeeval,'&grad2rad'); - $safehole->wrap(\&Math::Trig::rad2deg,$safeeval,'&rad2deg'); - $safehole->wrap(\&Math::Trig::rad2grad,$safeeval,'&rad2grad'); - $safehole->wrap(\&Math::Trig::pi,$safeeval,'&pi'); - $safehole->wrap(\&Math::Cephes::erf,$safeeval,'&erf'); - $safehole->wrap(\&Math::Cephes::erfc,$safeeval,'&erfc'); - $safehole->wrap(\&Math::Cephes::j0,$safeeval,'&j0'); - $safehole->wrap(\&Math::Cephes::j1,$safeeval,'&j1'); - $safehole->wrap(\&Math::Cephes::jn,$safeeval,'&jn'); - $safehole->wrap(\&Math::Cephes::jv,$safeeval,'&jv'); - $safehole->wrap(\&Math::Cephes::y0,$safeeval,'&y0'); - $safehole->wrap(\&Math::Cephes::y1,$safeeval,'&y1'); - $safehole->wrap(\&Math::Cephes::yn,$safeeval,'&yn'); - $safehole->wrap(\&Math::Cephes::yv,$safeeval,'&yv'); - -#need to inspect this class of ops -# $safeeval->deny(":base_orig"); - $safeinit .= ';$external::target='.$target.';'; - $safeinit .= ';$external::randomseed='.&Apache::lonnet::rndseed().';'; - &Apache::run::run($safeinit,$safeeval); + &init_safespace($target,$safeeval,$safehole,$safeinit); #-------------------- Redefinition of the target in the case of compound target ($target, my @tenta) = split('&&',$target); @@ -421,7 +365,7 @@ sub callsub { } } } - &Apache::lonxml::debug("nodefalt:$nodefault:"); +# &Apache::lonxml::debug("nodefalt:$nodefault:"); if ($currentstring eq '' && $nodefault eq '') { if ($target eq 'edit') { &Apache::lonxml::debug("doing default edit for $token->[1]"); @@ -444,6 +388,41 @@ sub callsub { return $currentstring; } +sub init_safespace { + my ($target,$safeeval,$safehole,$safeinit) = @_; + $safeeval->permit("entereval"); + $safeeval->permit(":base_math"); + $safeeval->permit("sort"); + $safeeval->deny(":base_io"); + $safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT'); + + $safehole->wrap(\&Math::Cephes::asin,$safeeval,'&asin'); + $safehole->wrap(\&Math::Cephes::acos,$safeeval,'&acos'); + $safehole->wrap(\&Math::Cephes::atan,$safeeval,'&atan'); + $safehole->wrap(\&Math::Cephes::sinh,$safeeval,'&sinh'); + $safehole->wrap(\&Math::Cephes::cosh,$safeeval,'&cosh'); + $safehole->wrap(\&Math::Cephes::tanh,$safeeval,'&tanh'); + $safehole->wrap(\&Math::Cephes::asinh,$safeeval,'&asinh'); + $safehole->wrap(\&Math::Cephes::acosh,$safeeval,'&acosh'); + $safehole->wrap(\&Math::Cephes::atanh,$safeeval,'&atanh'); + $safehole->wrap(\&Math::Cephes::erf,$safeeval,'&erf'); + $safehole->wrap(\&Math::Cephes::erfc,$safeeval,'&erfc'); + $safehole->wrap(\&Math::Cephes::j0,$safeeval,'&j0'); + $safehole->wrap(\&Math::Cephes::j1,$safeeval,'&j1'); + $safehole->wrap(\&Math::Cephes::jn,$safeeval,'&jn'); + $safehole->wrap(\&Math::Cephes::jv,$safeeval,'&jv'); + $safehole->wrap(\&Math::Cephes::y0,$safeeval,'&y0'); + $safehole->wrap(\&Math::Cephes::y1,$safeeval,'&y1'); + $safehole->wrap(\&Math::Cephes::yn,$safeeval,'&yn'); + $safehole->wrap(\&Math::Cephes::yv,$safeeval,'&yv'); + +#need to inspect this class of ops +# $safeeval->deny(":base_orig"); + $safeinit .= ';$external::target='.$target.';'; + $safeinit .= ';$external::randomseed='.&Apache::lonnet::rndseed().';'; + &Apache::run::run($safeinit,$safeeval); +} + sub startredirection { $Apache::lonxml::redirection++; push (@Apache::lonxml::outputstack, ''); @@ -757,6 +736,14 @@ sub warning { } } +sub get_param { + my ($param,$parstack,$safeeval,$context) = @_; + if ( ! $context ) { $context = -1; } + my $args =''; + if ( $#$parstack > (-2-$context) ) { $args=$$parstack[$context]; } + return &Apache::run::run("{$args;".'return $'.$param.'}',$safeeval); #' +} + sub register_insert { my @data = split /\n/, &Apache::lonnet::getfile('/home/httpd/lonTabs/insertlist.tab'); my $i;