version 1.122, 2002/10/22 13:29:57
|
version 1.123, 2002/10/22 18:54:53
|
Line 754 parametername should be a string such as
|
Line 754 parametername should be a string such as
|
sub MINPARM { |
sub MINPARM { |
my ($expression) = @_; |
my ($expression) = @_; |
my $min = undef; |
my $min = undef; |
study($expression); |
|
foreach $parameter (keys(%c)) { |
foreach $parameter (keys(%c)) { |
next if ($parameter !~ /$expression/); |
next if ($parameter !~ /$expression/); |
if ((! defined($min)) || ($min > $c{$parameter})) { |
if ((! defined($min)) || ($min > $c{$parameter})) { |
Line 777 parametername should be a string such as
|
Line 776 parametername should be a string such as
|
sub MAXPARM { |
sub MAXPARM { |
my ($expression) = @_; |
my ($expression) = @_; |
my $max = undef; |
my $max = undef; |
study($expression); |
|
foreach $parameter (keys(%c)) { |
foreach $parameter (keys(%c)) { |
next if ($parameter !~ /$expression/); |
next if ($parameter !~ /$expression/); |
if ((! defined($min)) || ($max < $c{$parameter})) { |
if ((! defined($min)) || ($max < $c{$parameter})) { |
Line 829 sub expandnamed {
|
Line 827 sub expandnamed {
|
my $returnvalue = ''; |
my $returnvalue = ''; |
my @matches = (); |
my @matches = (); |
$#matches = -1; |
$#matches = -1; |
study $expression; |
|
foreach $parameter (keys(%c)) { |
foreach $parameter (keys(%c)) { |
push @matches,$parameter if ($parameter =~ /$expression/); |
push @matches,$parameter if ($parameter =~ /$expression/); |
} |
} |
Line 918 sub sett {
|
Line 915 sub sett {
|
$t{'A0'}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.&expandnamed($2)/ge; |
$t{'A0'}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.&expandnamed($2)/ge; |
} |
} |
|
|
sub calc { |
|
undef %sheet_values; |
|
&sett(); |
|
my $notfinished=1; |
|
my $lastcalc=''; |
|
my $depth=0; |
|
while ($notfinished) { |
|
$notfinished=0; |
|
foreach (keys(%t)) { |
|
my $old=$sheet_values{$_}; |
|
$sheet_values{$_}=eval $t{$_}; |
|
if ($@) { |
|
undef %sheet_values; |
|
return $_.': '.$@; |
|
} |
|
if ($sheet_values{$_} ne $old) { $notfinished=1; $lastcalc=$_; } |
|
} |
|
$depth++; |
|
if ($depth>100) { |
|
undef %sheet_values; |
|
return $lastcalc.': Maximum calculation depth exceeded'; |
|
} |
|
} |
|
return ''; |
|
} |
|
|
|
# ------------------------------------------- End of "Inside of the safe space" |
# ------------------------------------------- End of "Inside of the safe space" |
ENDDEFS |
ENDDEFS |
$safeeval->reval($code); |
$safeeval->reval($code); |
Line 1033 sub outrow {
|
Line 1004 sub outrow {
|
} |
} |
|
|
# ------------------------------------------------ Add or change formula values |
# ------------------------------------------------ Add or change formula values |
|
sub update_values { |
|
my $sheet = shift; |
|
%{$sheet->{'safe'}->varglob('sheet_values')}=%{$sheet->{'values'}}; |
|
return undef; |
|
} |
|
|
|
sub setvalues { |
|
my $sheet=shift; |
|
my ($values) = @_; |
|
$values = {} if (! defined($values)); |
|
if (! ref($values)) { |
|
my %tmp = @_; |
|
$values = \%tmp; |
|
} |
|
$sheet->{'values'} = $values; |
|
%{$sheet->{'safe'}->varglob('sheet_values')}=%{$sheet->{'values'}}; |
|
return undef; |
|
} |
|
|
sub setformulas { |
sub setformulas { |
my ($sheet)=shift; |
my $sheet=shift; |
|
my ($formulas) = @_; |
|
$formulas = {} if (! defined($formulas)); |
|
if (! ref($formulas)) { |
|
my %tmp = @_; |
|
$formulas = \%tmp; |
|
} |
|
$sheet->{'f'} = $formulas; |
%{$sheet->{'safe'}->varglob('f')}=%{$sheet->{'f'}}; |
%{$sheet->{'safe'}->varglob('f')}=%{$sheet->{'f'}}; |
|
return undef; |
} |
} |
|
|
# ------------------------------------------------ Add or change formula values |
# ------------------------------------------------ Add or change formula values |
Line 1068 sub setrowlabels {
|
Line 1066 sub setrowlabels {
|
# ------------------------------------------------------- Calculate spreadsheet |
# ------------------------------------------------------- Calculate spreadsheet |
sub calcsheet { |
sub calcsheet { |
my $sheet=shift; |
my $sheet=shift; |
my $result = $sheet->{'safe'}->reval('&calc();'); |
&setvalues($sheet,undef); |
%{$sheet->{'values'}} = %{$sheet->{'safe'}->varglob('sheet_values')}; |
$sheet->{'safe'}->reval('&sett();'); |
return $result; |
my %t = %{$sheet->{'safe'}->varglob('t')}; |
|
my $notfinished=1; |
|
my $lastcalc=''; |
|
my $depth=0; |
|
while ($notfinished) { |
|
$notfinished=0; |
|
foreach (keys(%t)) { |
|
my $old=$sheet->{'values'}->{$_}; |
|
$sheet->{'values'}->{$_}=$sheet->{'safe'}->reval($t{$_}.';'); |
|
if ($@) { |
|
&setvalues($sheet,undef); |
|
return $_.': '.$@; |
|
} |
|
if ($sheet->{'values'}->{$_} ne $old) { |
|
$notfinished=1; |
|
$lastcalc=$_; |
|
} |
|
} |
|
if ($notfinished) { |
|
%{$sheet->{'safe'}->varglob('sheet_values')} = |
|
%{$sheet->{'values'}}; |
|
} |
|
|
|
$depth++; |
|
if ($depth>100) { |
|
&setvalues($sheet,undef); |
|
return $lastcalc.': Maximum calculation depth exceeded'; |
|
} |
|
} |
|
return ; |
} |
} |
|
|
# ---------------------------------------------------------------- Get formulas |
# ---------------------------------------------------------------- Get formulas |
Line 1354 sub readsheet {
|
Line 1381 sub readsheet {
|
my $fstring=''; |
my $fstring=''; |
if ($fstring=$spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}) { |
if ($fstring=$spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}) { |
my %tmp = split(/___;___/,$fstring); |
my %tmp = split(/___;___/,$fstring); |
$sheet->{'f'} = \%tmp; |
&setformulas($sheet,\%tmp); |
&setformulas($sheet); |
|
} else { |
} else { |
# Not cached, need to read |
# Not cached, need to read |
my %f=(); |
my %f=(); |
Line 1390 sub readsheet {
|
Line 1416 sub readsheet {
|
} |
} |
# Cache and set |
# Cache and set |
$spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f); |
$spreadsheets{$cnum.'_'.$cdom.'_'.$stype.'_'.$fn}=join('___;___',%f); |
$sheet->{'f'}=\%f; |
&setformulas($sheet,\%f); |
&setformulas($sheet); |
|
} |
} |
} |
} |
|
|
Line 1537 sub tmpread {
|
Line 1562 sub tmpread {
|
} else { |
} else { |
if ($nfield) { $fo{$nfield}=$nform; } |
if ($nfield) { $fo{$nfield}=$nform; } |
} |
} |
$sheet->{'f'}=\%fo; |
&setformulas($sheet,\%fo); |
&setformulas($sheet); |
|
} |
} |
|
|
################################################## |
################################################## |
Line 1684 sub updateclasssheet {
|
Line 1708 sub updateclasssheet {
|
} |
} |
} |
} |
if ($changed) { |
if ($changed) { |
$sheet->{'f'} = \%f; |
&setformulas($sheet,\%f); |
&setformulas($sheet,%f); |
|
} |
} |
# |
# |
$sheet->{'rowlabel'} = \%currentlist; |
$sheet->{'rowlabel'} = \%currentlist; |
Line 1826 sub updatestudentassesssheet {
|
Line 1849 sub updatestudentassesssheet {
|
} |
} |
} |
} |
if ($changed) { |
if ($changed) { |
$sheet->{'f'} = \%f; |
&setformulas($sheet,\%f); |
&setformulas($sheet); |
|
} |
} |
&setrowlabels($sheet); |
&setrowlabels($sheet); |
# |
# |
Line 1879 sub loadstudent {
|
Line 1901 sub loadstudent {
|
} |
} |
$cachedassess=''; |
$cachedassess=''; |
undef %cachedstores; |
undef %cachedstores; |
$sheet->{'f'} = \%f; |
&setformulas($sheet,\%f); |
&setformulas($sheet); |
|
&setconstants($sheet,\%c); |
&setconstants($sheet,\%c); |
} |
} |
|
|
Line 1940 ENDPOP
|
Line 1961 ENDPOP
|
} |
} |
} |
} |
} |
} |
$sheet->{'f'}=\%f; |
&setformulas($sheet,\%f); |
&setformulas($sheet); |
|
&setconstants($sheet,\%c); |
&setconstants($sheet,\%c); |
$r->print('<script>popwin.close()</script>'); |
$r->print('<script>popwin.close()</script>'); |
$r->rflush(); |
$r->rflush(); |