--- loncom/interface/Attic/lonspreadsheet.pm 2002/04/11 13:35:23 1.84
+++ loncom/interface/Attic/lonspreadsheet.pm 2002/07/05 01:31:25 1.95
@@ -1,5 +1,5 @@
#
-# $Id: lonspreadsheet.pm,v 1.84 2002/04/11 13:35:23 matthew Exp $
+# $Id: lonspreadsheet.pm,v 1.95 2002/07/05 01:31:25 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -106,6 +106,13 @@ my %courseopt;
my %useropt;
my %parmhash;
+#
+# Some hashes for stats on timing and performance
+#
+
+my %starttimes;
+my %usedtimes;
+
# Stuff that only the screen handler can know
my $includedir;
@@ -165,6 +172,10 @@ $cfn='';
$usymb='';
+# error messages
+
+$errormsg='';
+
sub mask {
my ($lower,$upper)=@_;
@@ -740,7 +751,25 @@ sub expandnamed {
return 0;
}
} else {
- return '$c{\''.$expression.'\'}';
+ # it is not a function, so it is a parameter name
+ # We should do the following:
+ # 1. Take the list of parameter names
+ # 2. look through the list for ones that match the parameter we want
+ # 3. If there are no collisions, return the one that matches
+ # 4. If there is a collision, return 'bad parameter name error'
+ my $returnvalue = '';
+ my @matches = ();
+ $#matches = -1;
+ study $expression;
+ foreach $parameter (keys(%c)) {
+ push @matches,$parameter if ($parameter =~ /$expression/);
+ }
+ if ($#matches == 0) {
+ $returnvalue = '$c{\''.$matches[0].'\'}';
+ } else {
+ $returnvalue = "'bad parameter name : $expression'";
+ }
+ return $returnvalue;
}
}
@@ -760,11 +789,17 @@ sub sett {
if ($_=~/A(\d+)/) {
my $trow=$1;
if ($trow) {
+ # Get the name of this cell
my $lb=$col.$trow;
+ # Grab the template declaration
$t{$lb}=$f{'template_'.$col};
+ # Replace '#' with the row number
$t{$lb}=~s/\#/$trow/g;
+ # Replace '....' with ','
$t{$lb}=~s/\.\.+/\,/g;
+ # Replace 'A0' with the value from 'A0'
$t{$lb}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g;
+ # Replace parameters
$t{$lb}=~s/(^|[^\"\'])\[([^\]]+)\]/$1.&expandnamed($2)/ge;
}
}
@@ -787,6 +822,8 @@ sub sett {
}
}
}
+ # For some reason 'A0' gets special treatment... This seems superfluous
+ # but I imagine it is here for a reason.
$t{'A0'}=$f{'A0'};
$t{'A0'}=~s/\.\.+/\,/g;
$t{'A0'}=~s/(^|[^\"\'])([A-Za-z]\d+)/$1\$v\{\'$2\'\}/g;
@@ -794,28 +831,29 @@ sub sett {
}
sub calc {
- %v=();
+ undef %v;
&sett();
my $notfinished=1;
my $depth=0;
+ my $errormsg;
while ($notfinished) {
$notfinished=0;
foreach (keys(%t)) {
my $old=$v{$_};
$v{$_}=eval($t{$_});
if ($@) {
- %v=();
- return $@;
+ $v{$_}='"error"';
+ $errormsg.=$_.': '.$@."\n";
}
if ($v{$_} ne $old) { $notfinished=1; }
}
$depth++;
if ($depth>100) {
- %v=();
+ undef %v;
return 'Maximum calculation depth exceeded';
}
}
- return '';
+ return $errormsg;
}
sub templaterow {
@@ -837,9 +875,11 @@ sub outrowassess {
my @cols=();
if ($n) {
my ($usy,$ufn)=split(/\_\_\&\&\&\_\_/,$f{'A'.$n});
+ if ($rl{$usy}) {
$cols[0]=$rl{$usy}.' '.
'