Move user stream IO setup to common PrologControl

This allows Gerrit Code Review's PrologShell to setup the
user_{input,output,error} streams the same way the other
repl code does

Streams are optional and are simply not registered if
passed as null.

Change-Id: I78ab48d8779a12d05b9109cada6048f4e08037f8
diff --git a/src/lang/PrologControl.java b/src/lang/PrologControl.java
index b10a178..5882060 100644
--- a/src/lang/PrologControl.java
+++ b/src/lang/PrologControl.java
@@ -3,6 +3,14 @@
 import com.googlecode.prolog_cafe.exceptions.HaltException;
 import com.googlecode.prolog_cafe.exceptions.PrologException;
 
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.PushbackReader;
 import java.util.Set;
 
 /**
@@ -73,7 +81,36 @@
       engine.pcl = cl;
     }
 
-    /** Sets a goal and its arguments to this Prolog thread. 
+    /**
+     * Registers {@code user_input}, {@code user_output}, and {@code user_error}
+     * streams.
+     */
+    public void configureUserIO(InputStream in, OutputStream out,
+        OutputStream err) {
+      if (in != null) {
+        engine.streamManager.put(
+            SymbolTerm.intern("user_input"),
+            new JavaObjectTerm(new PushbackReader(
+                new BufferedReader(new InputStreamReader(in)),
+                Prolog.PUSHBACK_SIZE)));
+      }
+      if (out != null) {
+        engine.streamManager.put(
+            SymbolTerm.intern("user_output"),
+            new JavaObjectTerm(new PrintWriter(
+                new BufferedWriter(new OutputStreamWriter(out)),
+                true)));
+      }
+      if (err != null) {
+        engine.streamManager.put(
+            SymbolTerm.intern("user_error"),
+            new JavaObjectTerm(new PrintWriter(
+                new BufferedWriter(new OutputStreamWriter(err)),
+                true)));
+      }
+    }
+
+    /** Sets a goal and its arguments to this Prolog thread.
      * An initial continuation goal (a <code>Success</code> object)
      * is set to the <code>cont</code> field of goal <code>p</code> as continuation.
      */
@@ -82,7 +119,7 @@
       code = p;
     }
 
-    /** Sets a goal <code>call(t)</code> to this Prolog thread. 
+    /** Sets a goal <code>call(t)</code> to this Prolog thread.
      * An initial continuation goal (a <code>Success</code> object)
      * is set to the <code>cont</code> field of goal <code>p</code> as continuation.
      */
diff --git a/src/repl/BlockingPrologControl.java b/src/repl/BlockingPrologControl.java
index 829d91d..45989f4 100644
--- a/src/repl/BlockingPrologControl.java
+++ b/src/repl/BlockingPrologControl.java
@@ -119,11 +119,6 @@
     engine.init();
   }
 
-  /** Returns the stream manager. */
-  HashtableOfTerm getStreamManager() {
-    return engine.getStreamManager();
-  }
-
   /**
    * Returns <code>true</code> if the system succeeds to find a first solution
    * of the given goal, <code>false</code> otherwise.<br>
diff --git a/src/repl/PrologMain.java b/src/repl/PrologMain.java
index 4a83588..1c36e86 100644
--- a/src/repl/PrologMain.java
+++ b/src/repl/PrologMain.java
@@ -65,20 +65,7 @@
 
 	    p = new BlockingPrologControl();
 	    p.setEnabled(EnumSet.allOf(Prolog.Feature.class), true);
-		p.getStreamManager().put(
-			SymbolTerm.intern("user_input"),
-			new JavaObjectTerm(new PushbackReader(new BufferedReader(
-				new InputStreamReader(System.in)),
-				Prolog.PUSHBACK_SIZE)));
-		p.getStreamManager().put(
-			SymbolTerm.intern("user_output"),
-			new JavaObjectTerm(new PrintWriter(new BufferedWriter(
-				new OutputStreamWriter(System.out)), true)));
-		p.getStreamManager().put(
-			SymbolTerm.intern("user_error"),
-			new JavaObjectTerm(new PrintWriter(new BufferedWriter(
-				new OutputStreamWriter(System.err)), true)));
-
+	    p.configureUserIO(System.in, System.out, System.err);
 	    p.setPredicate(Prolog.BUILTIN, "initialization", arg1, arg2);
 	    for (boolean r = p.call(); r; r = p.redo()) {}
 	    System.exit(0);