[LON-CAPA-cvs] cvs: loncom / lonmaxima
raeburn
lon-capa-cvs-allow@mail.lon-capa.org
Thu, 19 Apr 2007 17:29:11 -0000
raeburn Thu Apr 19 13:29:11 2007 EDT
Modified files:
/loncom lonmaxima
Log:
If 'Incorrect syntax' is detected - stop computations.
Return 'Incorrect syntax' as reply.
Index: loncom/lonmaxima
diff -u loncom/lonmaxima:1.25 loncom/lonmaxima:1.26
--- loncom/lonmaxima:1.25 Thu Feb 8 05:08:02 2007
+++ loncom/lonmaxima Thu Apr 19 13:29:11 2007
@@ -3,7 +3,7 @@
# The LearningOnline Network with CAPA
# Connect to MAXIMA CAS
#
-# $Id: lonmaxima,v 1.25 2007/02/08 10:08:02 raeburn Exp $
+# $Id: lonmaxima,v 1.26 2007/04/19 17:29:11 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -251,25 +251,28 @@
&getmaximaoutput($command);
for (my $i=0; $i < $MAX_CLIENTS_PER_CHILD; $i++) {
- &status('Accepting connections');
- my $client = $server->accept() or last;
- print $command "kill(all);\n";
- &getmaximaoutput($command);
- &sync($command);
- while (my $cmd=<$client>) {
- &status('Processing command');
- print $command &unescape($cmd);
- my ($reply,$finished,$syntaxerr) = &getmaximaoutput($command,1);
- print $client &escape($reply)."\n";
- if ($reply=~/^Error\:/) {
- &logthis('Died through '.$reply);
- $client->close();
- $command->hard_close();
- exit;
- }
- &sync($command);
- &status('Waiting for commands');
- }
+ &status('Accepting connections');
+ my $client = $server->accept() or last;
+ print $command "kill(all);\n";
+ &getmaximaoutput($command);
+ &sync($command);
+ my $syntaxerr = 0;
+ while (my $cmd=<$client>) {
+ &status('Processing command');
+ print $command &unescape($cmd);
+ my ($reply,$syntaxerr) = &getmaximaoutput($command,1);
+ print $client &escape($reply)."\n";
+ if ($syntaxerr) {
+ last;
+ } elsif ($reply=~/^Error\:/) {
+ &logthis('Died through '.$reply);
+ $client->close();
+ $command->hard_close();
+ exit;
+ }
+ &sync($command);
+ &status('Waiting for commands');
+ }
}
# tidy up gracefully and finish
@@ -302,20 +305,34 @@
sub getmaximaoutput {
my ($command,$numcheck)=@_;
my $regexp = '\(\%i\d+\)';
+ my $syntaxerr=0;
if ($numcheck) {
if ($command->match() =~ /\(\%i(\d+)\)/) {
my $nextmatch = $1+1;
- $regexp = '\(\%i'.$nextmatch.'\)';
+ $regexp = '(\(\%i'.$nextmatch.'\)|Incorrect syntax\:)';
+ }
+ }
+ my $timeout = 20;
+ my (undef,$error,$matched,$output)=$command->expect($timeout, -re => $regexp);
+ if ($numcheck) {
+ if ($matched eq 'Incorrect syntax:') {
+ $syntaxerr = 1;
+ if (wantarray) {
+ return ($matched,$syntaxerr);
+ } else {
+ return $matched;
+ }
}
}
- my (undef,$error,undef,$output)=$command->expect(20, -re => $regexp);
if ($error) {
- return 'Error: '.$error;
+ if (wantarray) {
+ return ('Error: '.$error);
+ } else {
+ return 'Error: '.$error;
+ }
}
$output =~ s/\r+//g; # Remove Windows-style linebreaks
- my $hasoutput=0;
my $foundoutput=0;
- my $syntaxerr=0;
my $realoutput='';
foreach my $line (split(/\n/,$output)) {
if ($line=~/\;/) { $foundoutput=1; next; }
@@ -323,14 +340,13 @@
if ($line=~/^Incorrect syntax:/) { $syntaxerr = 1; next; }
(my $label, $line) = ($line=~ /^(\(\%o\d+\))(.+)$/);
if ($label) {
- $label=~s/\S/ /g;
- $line=$label.$line;
- $hasoutput = 1;
+ $label=~s/\S/ /g;
+ $line=$label.$line;
}
$realoutput.=$line."\n";
}
if (wantarray) {
- return ($realoutput,$hasoutput,$syntaxerr);
+ return ($realoutput,$syntaxerr);
} else {
return $realoutput;
}