forked from jasder/antlr
combine Reader/InputStream into InputStream
[git-p4: depot-paths = "//depot/code/antlr4/main/": change = 9419]
This commit is contained in:
parent
6abc73cba3
commit
3e216a258d
|
@ -28,7 +28,10 @@
|
||||||
*/
|
*/
|
||||||
package org.antlr.v4.runtime;
|
package org.antlr.v4.runtime;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
|
||||||
/** This is a char buffer stream that is loaded from a file
|
/** This is a char buffer stream that is loaded from a file
|
||||||
* all at once when you construct the object. This looks very
|
* all at once when you construct the object. This looks very
|
||||||
|
|
|
@ -30,14 +30,32 @@ package org.antlr.v4.runtime;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
|
import java.io.Reader;
|
||||||
|
|
||||||
/** A kind of ReaderStream that pulls from an InputStream.
|
/** Vacuum all input from a Reader and then treat it like a StringStream.
|
||||||
* Useful for reading from stdin and specifying file encodings etc...
|
* Manage the buffer manually to avoid unnecessary data copying.
|
||||||
|
*
|
||||||
|
* If you need encoding, use ANTLRInputStream.
|
||||||
*/
|
*/
|
||||||
public class ANTLRInputStream extends ANTLRReaderStream {
|
public class ANTLRInputStream extends ANTLRStringStream {
|
||||||
|
public static final int READ_BUFFER_SIZE = 1024;
|
||||||
|
public static final int INITIAL_BUFFER_SIZE = 1024;
|
||||||
|
|
||||||
public ANTLRInputStream() {
|
public ANTLRInputStream() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ANTLRInputStream(Reader r) throws IOException {
|
||||||
|
this(r, INITIAL_BUFFER_SIZE, READ_BUFFER_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ANTLRInputStream(Reader r, int size) throws IOException {
|
||||||
|
this(r, size, READ_BUFFER_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ANTLRInputStream(Reader r, int size, int readChunkSize) throws IOException {
|
||||||
|
load(r, size, readChunkSize);
|
||||||
|
}
|
||||||
|
|
||||||
public ANTLRInputStream(InputStream input) throws IOException {
|
public ANTLRInputStream(InputStream input) throws IOException {
|
||||||
this(input, null);
|
this(input, null);
|
||||||
}
|
}
|
||||||
|
@ -69,4 +87,44 @@ public class ANTLRInputStream extends ANTLRReaderStream {
|
||||||
}
|
}
|
||||||
load(isr, size, readBufferSize);
|
load(isr, size, readBufferSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void load(Reader r, int size, int readChunkSize)
|
||||||
|
throws IOException
|
||||||
|
{
|
||||||
|
if ( r==null ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if ( size<=0 ) {
|
||||||
|
size = INITIAL_BUFFER_SIZE;
|
||||||
|
}
|
||||||
|
if ( readChunkSize<=0 ) {
|
||||||
|
readChunkSize = READ_BUFFER_SIZE;
|
||||||
|
}
|
||||||
|
// System.out.println("load "+size+" in chunks of "+readChunkSize);
|
||||||
|
try {
|
||||||
|
// alloc initial buffer size.
|
||||||
|
data = new char[size];
|
||||||
|
// read all the data in chunks of readChunkSize
|
||||||
|
int numRead=0;
|
||||||
|
int p = 0;
|
||||||
|
do {
|
||||||
|
if ( p+readChunkSize > data.length ) { // overflow?
|
||||||
|
// System.out.println("### overflow p="+p+", data.length="+data.length);
|
||||||
|
char[] newdata = new char[data.length*2]; // resize
|
||||||
|
System.arraycopy(data, 0, newdata, 0, data.length);
|
||||||
|
data = newdata;
|
||||||
|
}
|
||||||
|
numRead = r.read(data, p, readChunkSize);
|
||||||
|
// System.out.println("read "+numRead+" chars; p was "+p+" is now "+(p+numRead));
|
||||||
|
p += numRead;
|
||||||
|
} while (numRead!=-1); // while not EOF
|
||||||
|
// set the actual size of the data available;
|
||||||
|
// EOF subtracted one above in p+=numRead; add one back
|
||||||
|
super.n = p+1;
|
||||||
|
//System.out.println("n="+n);
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
r.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,96 +0,0 @@
|
||||||
/*
|
|
||||||
[The "BSD license"]
|
|
||||||
Copyright (c) 2005-2009 Terence Parr
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions
|
|
||||||
are met:
|
|
||||||
1. Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
3. The name of the author may not be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
package org.antlr.v4.runtime;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.Reader;
|
|
||||||
|
|
||||||
/** Vacuum all input from a Reader and then treat it like a StringStream.
|
|
||||||
* Manage the buffer manually to avoid unnecessary data copying.
|
|
||||||
*
|
|
||||||
* If you need encoding, use ANTLRInputStream.
|
|
||||||
*/
|
|
||||||
public class ANTLRReaderStream extends ANTLRStringStream {
|
|
||||||
public static final int READ_BUFFER_SIZE = 1024;
|
|
||||||
public static final int INITIAL_BUFFER_SIZE = 1024;
|
|
||||||
|
|
||||||
public ANTLRReaderStream() {
|
|
||||||
}
|
|
||||||
|
|
||||||
public ANTLRReaderStream(Reader r) throws IOException {
|
|
||||||
this(r, INITIAL_BUFFER_SIZE, READ_BUFFER_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ANTLRReaderStream(Reader r, int size) throws IOException {
|
|
||||||
this(r, size, READ_BUFFER_SIZE);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ANTLRReaderStream(Reader r, int size, int readChunkSize) throws IOException {
|
|
||||||
load(r, size, readChunkSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void load(Reader r, int size, int readChunkSize)
|
|
||||||
throws IOException
|
|
||||||
{
|
|
||||||
if ( r==null ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if ( size<=0 ) {
|
|
||||||
size = INITIAL_BUFFER_SIZE;
|
|
||||||
}
|
|
||||||
if ( readChunkSize<=0 ) {
|
|
||||||
readChunkSize = READ_BUFFER_SIZE;
|
|
||||||
}
|
|
||||||
// System.out.println("load "+size+" in chunks of "+readChunkSize);
|
|
||||||
try {
|
|
||||||
// alloc initial buffer size.
|
|
||||||
data = new char[size];
|
|
||||||
// read all the data in chunks of readChunkSize
|
|
||||||
int numRead=0;
|
|
||||||
int p = 0;
|
|
||||||
do {
|
|
||||||
if ( p+readChunkSize > data.length ) { // overflow?
|
|
||||||
// System.out.println("### overflow p="+p+", data.length="+data.length);
|
|
||||||
char[] newdata = new char[data.length*2]; // resize
|
|
||||||
System.arraycopy(data, 0, newdata, 0, data.length);
|
|
||||||
data = newdata;
|
|
||||||
}
|
|
||||||
numRead = r.read(data, p, readChunkSize);
|
|
||||||
// System.out.println("read "+numRead+" chars; p was "+p+" is now "+(p+numRead));
|
|
||||||
p += numRead;
|
|
||||||
} while (numRead!=-1); // while not EOF
|
|
||||||
// set the actual size of the data available;
|
|
||||||
// EOF subtracted one above in p+=numRead; add one back
|
|
||||||
super.n = p+1;
|
|
||||||
//System.out.println("n="+n);
|
|
||||||
}
|
|
||||||
finally {
|
|
||||||
r.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue