From f3c650e13377bcb68dfa3571dc7561bc60e76ffd Mon Sep 17 00:00:00 2001 From: brian Date: Sat, 8 May 2004 00:31:32 -0700 Subject: [PATCH] win32 console support darcs-hash:20040508073132-24bed-4a212fea35e33c8dd98c008d2da631477e9e5a22.gz --- src/org/ibex/nestedvm/Runtime.java | 39 +++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/src/org/ibex/nestedvm/Runtime.java b/src/org/ibex/nestedvm/Runtime.java index 0543fd0..1af6f73 100644 --- a/src/org/ibex/nestedvm/Runtime.java +++ b/src/org/ibex/nestedvm/Runtime.java @@ -157,7 +157,8 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable { } } - addFD(new StdinFD(System.in)); + InputStream stdin = Boolean.valueOf(getSystemProperty("nestedvm.textstdin")).booleanValue() ? new TextInputStream(System.in) : System.in; + addFD(new StdinFD(stdin)); addFD(new StdoutFD(System.out)); addFD(new StdoutFD(System.err)); } @@ -1215,6 +1216,42 @@ public abstract class Runtime implements UsermodeConstants,Registers,Cloneable { public FStat _fstat() { return new FStat() { public int type() { return S_IFCHR; } }; } } + // FEATURE: TextInputStream: This is pretty inefficient but it is only used for reading from the console on win32 + static class TextInputStream extends InputStream { + private int pushedBack = -1; + private final InputStream parent; + public TextInputStream(InputStream parent) { this.parent = parent; } + public int read() throws IOException { + if(pushedBack != -1) { int c = pushedBack; pushedBack = -1; return c; } + int c = parent.read(); + if(c == '\r' && (c = parent.read()) != '\n') { pushedBack = c; return '\r'; } + return c; + } + public int read(byte[] buf, int pos, int len) throws IOException { + boolean pb = false; + if(pushedBack != -1 && len > 0) { + buf[0] = (byte) pushedBack; + pushedBack = -1; + pos++; len--; pb = true; + } + int n = parent.read(buf,pos,len); + if(n == -1) return -1; + for(int i=0;i