--- loncom/xml/run.pm 2004/02/26 23:39:04 1.45 +++ loncom/xml/run.pm 2005/10/04 16:30:23 1.52 @@ -1,6 +1,6 @@ package Apache::run; # -# $Id: run.pm,v 1.45 2004/02/26 23:39:04 albertel Exp $ +# $Id: run.pm,v 1.52 2005/10/04 16:30:23 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -46,7 +46,26 @@ while (!$_LONCAPA_INTERNAL_oldexpression # only match the above if there is not { [ ( coming up # Why? (I.e. this fails &a(1)[2] (?=[^\[\{\(]|$)/ - &__LC_INTERNAL_EVALUATE__($1,$2,$3)/sexg; + my ($__LC__a,$__LC__b,$__LC__c)=($1,$2,$3); + my $__LC__prefix; + my $__LC__result; + while (1) { + { + use strict; + no strict "vars"; + if (eval(defined(eval($__LC__a.$__LC__b)))) { + $__LC__result= $__LC__prefix.eval($__LC__a.$__LC__b.$__LC__c); + last; + } + } + $__LC__prefix.=substr($__LC__a,0,1,""); + if ($__LC__a!~m-^(\$|&|\#)-) { last; } + } + if (!defined($__LC__result)) { + $__LC__result=$__LC__prefix.$__LC__a.$__LC__b.$__LC__c; + } + $__LC__result; + /sexg; if (scalar(values(%_LONCAPA_INTERNAL_oldexpressions))>10) {last;} } ENDEVALUATE @@ -64,13 +83,13 @@ sub evaluate { }; my $innererror; eval { - alarm($Apache::lonnet::perlvar{'lonScriptTimeout'}); + &Apache::lonxml::start_alarm(); $safeeval->reval('{'.$decls.';$_=<<\'EXPRESSION\';'."\n".$expression. "\n".'EXPRESSION'."\n".$EVALUATE_STRING.'}'); $innererror=$@; - alarm(0); + &Apache::lonxml::end_alarm(); }; - my $error=$@; + my $error=$@; if ($error eq '' && $innererror eq '' && !$Apache::run::timeout) { $result = $safeeval->reval('return $_;'); chomp $result; @@ -80,12 +99,12 @@ sub evaluate { $Apache::lonnet::perlvar{'lonScriptTimeout'}.' seconds'; } &Apache::lonxml::error('substitution on
'.
-			       &HTML::Entities::encode($expression).
+			       &HTML::Entities::encode($expression,'<>&"').
 			       '
with
'.
-			       &HTML::Entities::encode($decls).
+			       &HTML::Entities::encode($decls,'<>&"').
 			       '
caused
'.
-			       &HTML::Entities::encode($error).' '.
-			       &HTML::Entities::encode($innererror).
+			       &HTML::Entities::encode($error,'<>&"').' '.
+			       &HTML::Entities::encode($innererror,'<>&"').
 			       '
'); } return $result @@ -102,10 +121,10 @@ sub run { }; my $innererror; eval { - alarm($Apache::lonnet::perlvar{'lonScriptTimeout'}); + &Apache::lonxml::start_alarm(); @result=$safeeval->reval($code); $innererror=$@; - alarm(0); + &Apache::lonxml::end_alarm(); }; my $error=$@; if (($Apache::run::timeout || $error ne '' || $innererror ne '') && !$hideerrors) { @@ -113,10 +132,10 @@ sub run { $error = 'Code ran too long. It ran for more than '. $Apache::lonnet::perlvar{'lonScriptTimeout'}.' seconds'; } - my $errormsg='
'.&HTML::Entities::encode($error).' '.
-	    &HTML::Entities::encode($innererror).
+	my $errormsg='
'.&HTML::Entities::encode($error,'<>&"').' '.
+	    &HTML::Entities::encode($innererror,'<>&"').
 	    '
occured while running
';
-	$code=&HTML::Entities::encode($code);
+	$code=&HTML::Entities::encode($code,'<>&"');
 	if ($innererror=~/line (\d+)/) {
 	    my $linenumber=$1;
 	    my @code=split("\n",$code);
@@ -141,19 +160,25 @@ sub dump {
 	if (($symname!~/^\_/) && ($symname!~/\:$/)) {
 	    my $line;
 	    if ($safeeval->reval('defined($'.$symname.')')) {
-		$line='$'.$symname.'='.$safeeval->reval('$'.$symname);
+		if ($symname =~ /^\w/) {
+		    $line.='$'.$symname.'='.$safeeval->reval('$'.$symname)."\n";
+		}
 	    }	
 	    if ($safeeval->reval('defined(@'.$symname.')')) {
-		$line='@'.$symname.'=('.
-		    $safeeval->reval('join(",",@'.$symname.')').")";
+		$line.='@'.$symname.'=('.
+		    $safeeval->reval('join(",",@'.$symname.')').")"."\n";
 	    }
 	    if ($safeeval->reval('defined(%'.$symname.')')) {
-		$line='%'.$symname.'=(';
+		$line.='%'.$symname.'=(';
 		$line.=$safeeval->reval('join(",",map { $_."=>".$'.
 					$symname.'{$_} } sort keys %'.
-					$symname.')').")"
+					$symname.')').")"."\n"
 				    }
-	    if ($line ne '') {$dump.=&HTML::Entities::encode($line)."
";} + if ($line ne '') { + $line=&HTML::Entities::encode($line,'<>&"'); + $line=~s|\n|
|g; + $dump.=$line; + } } } $dump.='';