--- loncom/lonmaxima	2006/05/10 01:08:01	1.18
+++ loncom/lonmaxima	2007/02/03 04:09:30	1.23
@@ -3,7 +3,7 @@
 # The LearningOnline Network with CAPA
 # Connect to MAXIMA CAS
 #
-# $Id: lonmaxima,v 1.18 2006/05/10 01:08:01 www Exp $
+# $Id: lonmaxima,v 1.23 2007/02/03 04:09:30 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -31,7 +31,6 @@
 #
 
 use Expect; 
-use IPC::Open3;
 use IO::Select;
 use IO::Socket;
 use IO::File;
@@ -254,20 +253,24 @@ sub make_new_child {
         for (my $i=0; $i < $MAX_CLIENTS_PER_CHILD; $i++) {
            &status('Accepting connections');
            my $client = $server->accept()     or last;
-           print $command "kill(all);reset();\n";
-           &getmaximaoutput($command);
+           print $command "kill(all);\n";
+	   &getmaximaoutput($command);
+           &sync($command);
            while (my $cmd=<$client>) {
               &status('Processing command');
-	      &sync($command);
               print $command &unescape($cmd);
-              my $reply=&getmaximaoutput($command);
+              my ($reply,$finished,$syntaxerr) = &getmaximaoutput($command);
+              if ((!$finished) && (!$syntaxerr) && ($reply !~ /^Error\:/)) {
+                  ($reply,$finished,$syntaxerr) = &getmaximaoutput($command);
+              }
               print $client &escape($reply)."\n";
               if ($reply=~/^Error\:/) {
                  &logthis('Died through '.$reply);
                  $client->close();
                  $command->hard_close();     
                  exit;
-              }
+              }	      
+	      &sync($command);
               &status('Waiting for commands');
            }
         }
@@ -305,17 +308,26 @@ sub getmaximaoutput {
     if ($error) {
        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; }
        if (!$foundoutput) { next; }
-       my ($label)=($line=~s/^(\(\%o\d+\))//);
+       if ($line=~/^Incorrect syntax:/) { $syntaxerr = 1; next; }
+       (my $label, $line) = ($line=~ /^(\(\%o\d+\))(.+)$/);
        if ($label) {
           $label=~s/\S/ /g;
           $line=$label.$line;
+          $hasoutput = 1;
        }
        $realoutput.=$line."\n";
     }
-    return $realoutput;
+    if (wantarray) {
+        return ($realoutput,$hasoutput,$syntaxerr);
+    } else {
+        return $realoutput;
+    }
 }