--- loncom/xml/lonxml.pm 2001/05/28 18:27:46 1.80 +++ loncom/xml/lonxml.pm 2001/05/30 17:42:15 1.82 @@ -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); @@ -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, '');