--- loncom/interface/Attic/lonspreadsheet.pm 2000/12/04 19:38:35 1.3 +++ loncom/interface/Attic/lonspreadsheet.pm 2000/12/04 22:09:39 1.4 @@ -13,20 +13,29 @@ use Apache::lonnet; use Apache::Constants qw(:common); use HTML::TokeParser; -# -# f: formulas -# t: intermediate format (from f after sett) -# v: output values (from t after calcv) -# -use vars qw(%v %t %f); - -sub deffunc { - my $safeeval=shift; +sub initsheet { + my $safeeval = new Safe; + my $safehole = new Safe::Hole; + $safeeval->permit("entereval"); + $safeeval->permit(":base_math"); + $safeeval->permit("sort"); + $safeeval->deny(":base_io"); + $safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT'); my $code=<<'ENDDEFS'; # ---------------------------------------------------- Inside of the safe space +# +# f: formulas +# t: intermediate format (variable references expanded) +# v: output values +# + +%v=(); +%t=(); +%f=(); + sub mask { my ($lower,$upper)=@_; @@ -91,10 +100,9 @@ sub mask { } } } - return '^'.$alpha.$num.'$'; + return '^'.$alpha.$num."\$"; } - sub NUM { my $mask=mask(@_); my $num=0; @@ -215,14 +223,6 @@ sub SUMMIN { return $sum; } - -# ------------------------------------------- End of "Inside of the safe space" -ENDDEFS - $safeeval->reval($code); -} - -# --------------------------------------------------------- Initialize t from f - sub sett { %t=(); map { @@ -234,18 +234,16 @@ sub sett { } keys %f; } -# ------------------------------------------------------------ Calculate values - -sub calcv { - my $safeeval=shift; +sub calc { %v=(); + &sett(); my $notfinished=1; my $depth=0; while ($notfinished) { $notfinished=0; map { my $old=$v{$_}; - $v{$_}=$safeeval->reval($t{$_}); + $v{$_}=eval($t{$_}); if ($@) { %v=(); return $@; @@ -261,11 +259,45 @@ sub calcv { return ''; } +# ------------------------------------------- End of "Inside of the safe space" +ENDDEFS + $safeeval->reval($code); + return $safeeval; +} + +# ------------------------------------------------ Add or change formula values + +sub setformulas { + my ($safeeval,@f)=@_; + $safeeval->reval('%f=(%f,'."('".join("','",@f)."'));"); +} + +# ------------------------------------------------------- Calculate spreadsheet + +sub calcsheet { + my $safeeval=shift; + $safeeval->reval('&calc();'); +} + +# ------------------------------------------------------------------ Get values + +sub getvalues { + my $safeeval=shift; + return $safeeval->reval('%v'); +} + +# ---------------------------------------------------------------- Get formulas + +sub getformulas { + my $safeeval=shift; + return $safeeval->reval('%f'); +} + # ------------------------------------------------------------ Read spreadsheet sub readf { my $fn=shift; - %f=(); + my %f=(); my $content; { my $fh=Apache::File->new($fn); @@ -313,26 +345,6 @@ sub readmeta { } -# ------------------------------------------------------------ Returns safeeval - -sub init { - - %v=(); - %t=(); - %f=(); - my $safeeval = new Safe; - my $safehole = new Safe::Hole; - $safeeval->permit("entereval"); - $safeeval->permit(":base_math"); - $safeeval->permit("sort"); - $safeeval->deny(":base_io"); - $safehole->wrap(\&Apache::lonnet::EXT,$safeeval,'&EXT'); - $safeeval->share('%v','%t','%f'); - &deffunc($safeeval); - - return $safeeval; -} - # ----------------------------------------------------------------------------- sub handler { @@ -345,31 +357,17 @@ sub handler { $r->print('