![]() ![]() | ![]() |
- should improve errormessages quite a bit.
1: package Apache::run; 2: # 3: # $Id: run.pm,v 1.26 2002/04/10 15:22:02 albertel Exp $ 4: # 5: # Copyright Michigan State University Board of Trustees 6: # 7: # This file is part of the LearningOnline Network with CAPA (LON-CAPA). 8: # 9: # LON-CAPA is free software; you can redistribute it and/or modify 10: # it under the terms of the GNU General Public License as published by 11: # the Free Software Foundation; either version 2 of the License, or 12: # (at your option) any later version. 13: # 14: # LON-CAPA is distributed in the hope that it will be useful, 15: # but WITHOUT ANY WARRANTY; without even the implied warranty of 16: # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17: # GNU General Public License for more details. 18: # 19: # You should have received a copy of the GNU General Public License 20: # along with LON-CAPA; if not, write to the Free Software 21: # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 22: # 23: # /home/httpd/html/adm/gpl.txt 24: # 25: # http://www.lon-capa.org/ 26: # 27: 28: use HTML::Entities; 29: 30: $Apache::run::EVALUATE_STRING=<<'ENDEVALUATE'; 31: my %_LONCAPA_INTERNAL_oldexpressions=(); 32: my $i=0; 33: while (!$_LONCAPA_INTERNAL_oldexpressions{$_}) { 34: $_LONCAPA_INTERNAL_oldexpressions{$_}=1; 35: $_ =~s/((?:\$|\&)(?:[\#|\$]*[A-Za-z][\w]*|\{[A-Za-z][\w]*\}))([\[\{][^\$\&\]\}]+[\]\}])*?(\([^\$\&\)]+\))*?(?=[^\[\{\(]|$)/eval(defined(eval($1.$2))?eval('$1.$2.$3'):'$1.$2.$3')/seg; 36: if ($i++ > 10 ) { last; } 37: } 38: ENDEVALUATE 39: 40: sub evaluate { 41: my ($expression,$safeeval,$decls) = @_; 42: unless (defined($expression)) { return ''; } 43: if (!$Apache::lonxml::evaluate) { return $expression; } 44: my $result = ''; 45: $@=''; 46: $safeeval->reval('{'.$decls.';$_=<<\'EXPRESSION\';'."\n".$expression. 47: "\n".'EXPRESSION'."\n".$EVALUATE_STRING.'}'); 48: # $safeeval->reval('{'.$decls.';<< &evaluate(q|'.$expression.'|);}'); 49: my $error=$@; 50: if ($@ eq '') { 51: $result = $safeeval->reval('return $_;'); 52: chomp $result; 53: } else { 54: &Apache::lonxml::error('substitution on <pre>'.$expression. 55: '</pre> with <pre>'.$decls. 56: '</pre> caused <pre>'.$error); 57: } 58: return $result 59: } 60: 61: sub run { 62: my ($code,$safeeval,$hideerrors) = @_; 63: # print "inside run\n"; 64: $@=''; 65: my (@result)=$safeeval->reval($code); 66: my $error=$@; 67: if ($error ne '' && !$hideerrors) { 68: &Apache::lonxml::error('<pre>'.&HTML::Entities::encode($error). 69: '</pre> occured while running <pre>'. 70: &HTML::Entities::encode($code).'</pre>'); 71: } 72: if ( $#result < '1') { 73: return $result[0]; 74: } else { 75: &Apache::lonxml::debug("<b>Got lots results</b>:$#result:"); 76: return (@result); 77: } 78: } 79: 80: sub dump { 81: my ($target,$safeeval)=@_; 82: my $dump=''; 83: foreach my $symname (sort keys %{$safeeval->varglob('main::')}) { 84: if (($symname!~/^\_/) && ($symname!~/\:$/)) { 85: if ($safeeval->reval('defined($'.$symname.')')) { 86: $dump.='$'.$symname.'='.$safeeval->reval('$'.$symname)."\n"; 87: } 88: if ($safeeval->reval('defined(@'.$symname.')')) { 89: $dump.='@'.$symname.'=('. 90: $safeeval->reval('join(",",@'.$symname.')').")\n"; 91: } 92: if ($safeeval->reval('defined(%'.$symname.')')) { 93: $dump.='%'.$symname.'=('; 94: $dump.=$safeeval->reval('join(",",map { $_."=>".$'. 95: $symname.'{$_} } sort keys %'. 96: $symname.')').")\n"; 97: } 98: } 99: } 100: $dump.=''; 101: return $dump; 102: } 103: 104: 1; 105: __END__;