mirror of
https://github.com/Eaglercraft-TeaVM-Fork/eagler-teavm.git
synced 2024-12-22 16:14:10 -08:00
Adds input streams
This commit is contained in:
parent
6ef892bf26
commit
1ee9793ffd
|
@ -62,6 +62,10 @@ public class CharBuffer {
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void skip(int count) {
|
||||||
|
pos += count;
|
||||||
|
}
|
||||||
|
|
||||||
public void put(CharBuffer buffer) {
|
public void put(CharBuffer buffer) {
|
||||||
while (buffer.pos < buffer.end) {
|
while (buffer.pos < buffer.end) {
|
||||||
data[pos++] = buffer.data[buffer.pos++];
|
data[pos++] = buffer.data[buffer.pos++];
|
||||||
|
|
|
@ -0,0 +1,85 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2014 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.teavm.classlib.java.io;
|
||||||
|
|
||||||
|
import org.teavm.classlib.java.lang.TMath;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev
|
||||||
|
*/
|
||||||
|
public class TByteArrayInputStream extends TInputStream {
|
||||||
|
protected byte[] buf;
|
||||||
|
protected int pos;
|
||||||
|
protected int mark;
|
||||||
|
protected int count;
|
||||||
|
|
||||||
|
public TByteArrayInputStream(byte[] buf, int offset, int length) {
|
||||||
|
this.buf = buf;
|
||||||
|
pos = offset;
|
||||||
|
mark = offset;
|
||||||
|
count = offset + length;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TByteArrayInputStream(byte[] buf) {
|
||||||
|
this(buf, 0, buf.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int read() {
|
||||||
|
return pos < count ? buf[pos++] : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int read(byte[] b, int off, int len) {
|
||||||
|
int bytesToRead = TMath.min(len, count - pos);
|
||||||
|
for (int i = 0; i < bytesToRead; ++i) {
|
||||||
|
b[off++] = buf[pos++];
|
||||||
|
}
|
||||||
|
return bytesToRead > 0 ? bytesToRead : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public long skip(long n) {
|
||||||
|
int bytesSkipped = (int)TMath.min(n, count - pos);
|
||||||
|
pos += bytesSkipped;
|
||||||
|
return bytesSkipped;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int available() {
|
||||||
|
return count - pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean markSupported() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void mark(int readAheadLimit) {
|
||||||
|
mark = pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reset() {
|
||||||
|
pos = mark;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() {
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,86 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2014 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.teavm.classlib.java.io;
|
||||||
|
|
||||||
|
import org.teavm.classlib.java.lang.TInteger;
|
||||||
|
import org.teavm.classlib.java.lang.TObject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev
|
||||||
|
*/
|
||||||
|
public abstract class TInputStream extends TObject implements TCloseable {
|
||||||
|
public TInputStream() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract int read() throws TIOException;
|
||||||
|
|
||||||
|
public int read(byte[] b) throws TIOException {
|
||||||
|
return read(b, 0, b.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int read(byte[] b, int off, int len) throws TIOException {
|
||||||
|
for (int i = 0; i < len; ++i) {
|
||||||
|
int bt = read();
|
||||||
|
if (bt < 0) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
b[off++] = (byte)bt;
|
||||||
|
}
|
||||||
|
return len > 0 ? len : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long skip(long n) throws TIOException {
|
||||||
|
if (n < TInteger.MAX_VALUE) {
|
||||||
|
return skip((int)n);
|
||||||
|
} else {
|
||||||
|
for (long i = 0; i < n; ++i) {
|
||||||
|
if (read() < 0) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int skip(int n) throws TIOException {
|
||||||
|
for (int i = 0; i < n; ++i) {
|
||||||
|
if (read() < 0) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int available() throws TIOException {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws TIOException {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void mark(@SuppressWarnings("unused") int readlimit) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reset() throws TIOException {
|
||||||
|
throw new TIOException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean markSupported() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,133 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2014 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.teavm.classlib.java.io;
|
||||||
|
|
||||||
|
import org.teavm.classlib.impl.charset.ByteBuffer;
|
||||||
|
import org.teavm.classlib.impl.charset.CharBuffer;
|
||||||
|
import org.teavm.classlib.impl.charset.Charset;
|
||||||
|
import org.teavm.classlib.impl.charset.UTF8Charset;
|
||||||
|
import org.teavm.classlib.java.lang.TString;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev
|
||||||
|
*/
|
||||||
|
public class TInputStreamReader extends TReader {
|
||||||
|
private TInputStream stream;
|
||||||
|
private Charset charset;
|
||||||
|
private TString charsetName;
|
||||||
|
private byte[] inData = new byte[8192];
|
||||||
|
private ByteBuffer inBuffer = new ByteBuffer(inData);
|
||||||
|
private char[] outData = new char[1024];
|
||||||
|
private CharBuffer outBuffer = new CharBuffer(outData);
|
||||||
|
private boolean streamEof;
|
||||||
|
private boolean eof;
|
||||||
|
|
||||||
|
public TInputStreamReader(TInputStream in, TString charsetName) {
|
||||||
|
this(in, Charset.get(charsetName.toString()));
|
||||||
|
this.charsetName = charsetName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TInputStreamReader(TInputStream in) {
|
||||||
|
this(in, new UTF8Charset());
|
||||||
|
charsetName = TString.wrap("UTF-8");
|
||||||
|
}
|
||||||
|
|
||||||
|
private TInputStreamReader(TInputStream in, Charset charset) {
|
||||||
|
this.stream = in;
|
||||||
|
this.charset = charset;
|
||||||
|
outBuffer.skip(outBuffer.available());
|
||||||
|
inBuffer.skip(inBuffer.available());
|
||||||
|
}
|
||||||
|
|
||||||
|
public TString getEncoding() {
|
||||||
|
return charsetName;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void close() throws TIOException {
|
||||||
|
stream.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int read() throws TIOException {
|
||||||
|
if (eof) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (!outBuffer.end()) {
|
||||||
|
return outBuffer.get();
|
||||||
|
}
|
||||||
|
return fillBuffer() ? outBuffer.get() : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int read(char[] cbuf, int off, int len) throws TIOException {
|
||||||
|
CharBuffer wrapBuffer = new CharBuffer(cbuf, off, off + len);
|
||||||
|
while (!wrapBuffer.end()) {
|
||||||
|
wrapBuffer.put(outBuffer);
|
||||||
|
if (outBuffer.end() && !fillBuffer()) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return outBuffer.position() - off;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean fillBuffer() throws TIOException {
|
||||||
|
if (eof) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int i = 0;
|
||||||
|
while (!outBuffer.end()) {
|
||||||
|
outData[i++] = outBuffer.get();
|
||||||
|
}
|
||||||
|
outBuffer.rewind(i);
|
||||||
|
while (outBuffer.available() > 4) {
|
||||||
|
if (inBuffer.available() < 8 && !fillReadBuffer()) {
|
||||||
|
eof = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
charset.decode(inBuffer, outBuffer);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean fillReadBuffer() throws TIOException {
|
||||||
|
if (streamEof) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int off = 0;
|
||||||
|
while (!inBuffer.end()) {
|
||||||
|
inData[off] = inBuffer.get();
|
||||||
|
}
|
||||||
|
inBuffer.rewind(0);
|
||||||
|
while (off < inData.length) {
|
||||||
|
int bytesRead = stream.read(inData, off, inData.length - off);
|
||||||
|
if (bytesRead == -1) {
|
||||||
|
streamEof = true;
|
||||||
|
inBuffer = new ByteBuffer(inData, 0, inBuffer.position());
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
off += bytesRead;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean ready() throws TIOException {
|
||||||
|
return !outBuffer.end() || inBuffer.end();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,75 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2014 Alexey Andreev.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.teavm.classlib.java.io;
|
||||||
|
|
||||||
|
import org.teavm.classlib.java.lang.TMath;
|
||||||
|
import org.teavm.classlib.java.lang.TObject;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Alexey Andreev
|
||||||
|
*/
|
||||||
|
public abstract class TReader implements TCloseable {
|
||||||
|
protected TObject lock;
|
||||||
|
|
||||||
|
protected TReader() {
|
||||||
|
this(new TObject());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected TReader(TObject lock) {
|
||||||
|
this.lock = lock;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int read() throws TIOException {
|
||||||
|
char[] buf = new char[1];
|
||||||
|
return read(buf) >= 0 ? buf[0] : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int read(char[] cbuf) throws TIOException {
|
||||||
|
return read(cbuf, 0, cbuf.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract int read(char[] cbuf, int off, int len) throws TIOException;
|
||||||
|
|
||||||
|
public long skip(long n) throws TIOException {
|
||||||
|
char[] buffer = new char[1024];
|
||||||
|
long skipped = 0;
|
||||||
|
while (skipped < n) {
|
||||||
|
int charsRead = read(buffer, 0, (int)TMath.min(n, buffer.length));
|
||||||
|
if (charsRead < 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
skipped += charsRead;
|
||||||
|
}
|
||||||
|
return skipped;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean ready() throws TIOException {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean markSupported() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void mark(@SuppressWarnings("unused") int readAheadLimit) throws TIOException {
|
||||||
|
throw new TIOException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void reset() throws TIOException {
|
||||||
|
throw new TIOException();
|
||||||
|
}
|
||||||
|
}
|
|
@ -30,4 +30,12 @@ public final class TMath extends TObject {
|
||||||
public static int max(int a, int b) {
|
public static int max(int a, int b) {
|
||||||
return a > b ? a : b;
|
return a > b ? a : b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static long min(long a, long b) {
|
||||||
|
return a < b ? a : b;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static long max(long a, long b) {
|
||||||
|
return a > b ? a : b;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,7 +54,9 @@ import net.java.html.BrwsrCtx;
|
||||||
import net.java.html.js.JavaScriptBody;
|
import net.java.html.js.JavaScriptBody;
|
||||||
import org.apidesign.html.boot.spi.Fn;
|
import org.apidesign.html.boot.spi.Fn;
|
||||||
import org.apidesign.html.context.spi.Contexts;
|
import org.apidesign.html.context.spi.Contexts;
|
||||||
|
import org.apidesign.html.json.spi.Transfer;
|
||||||
import org.apidesign.html.json.tck.KnockoutTCK;
|
import org.apidesign.html.json.tck.KnockoutTCK;
|
||||||
|
import org.netbeans.html.ko4j.KO4J;
|
||||||
import org.testng.Assert;
|
import org.testng.Assert;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -93,8 +95,10 @@ public final class KnockoutFXTest extends KnockoutTCK {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public BrwsrCtx createContext() {
|
public BrwsrCtx createContext() {
|
||||||
Contexts.Builder cb = Contexts.newBuilder();
|
KO4J ko4j = new KO4J();
|
||||||
return cb.build();
|
return Contexts.newBuilder()
|
||||||
|
.register(Transfer.class, ko4j.transfer(), 1)
|
||||||
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
Loading…
Reference in New Issue
Block a user