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);