diff options
-rwxr-xr-x | src/java/com/sun/gluegen/pcpp/ConcatenatingReader.java | 174 | ||||
-rw-r--r-- | src/java/com/sun/gluegen/pcpp/PCPP.java | 9 |
2 files changed, 182 insertions, 1 deletions
diff --git a/src/java/com/sun/gluegen/pcpp/ConcatenatingReader.java b/src/java/com/sun/gluegen/pcpp/ConcatenatingReader.java new file mode 100755 index 0000000..90192d2 --- /dev/null +++ b/src/java/com/sun/gluegen/pcpp/ConcatenatingReader.java @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * - Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistribution 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. + * + * Neither the name of Sun Microsystems, Inc. or the names of + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. ALL + * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN + * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR + * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR + * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR + * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR + * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE + * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, + * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF + * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + * + * You acknowledge that this software is not designed or intended for use + * in the design, construction, operation or maintenance of any nuclear + * facility. + * + * Sun gratefully acknowledges that this software was originally authored + * and developed by Kenneth Bradley Russell and Christopher John Kline. + */ + +package com.sun.gluegen.pcpp; + +import java.io.*; + +/** A Reader implementation which finds lines ending in the backslash + character ('\') and concatenates them with the next line. */ + +public class ConcatenatingReader extends FilterReader { + // Any leftover characters go here + private char[] curBuf; + private int curPos; + private BufferedReader in; + private static String newline = System.getProperty("line.separator"); + + /** This class requires that the input reader be a BufferedReader so + it can do line-oriented operations. */ + public ConcatenatingReader(BufferedReader in) { + super(in); + this.in = in; + } + + public int read() throws IOException { + char[] tmp = new char[1]; + int num = read(tmp, 0, 1); + if (num < 0) + return -1; + return tmp[0]; + } + + // It's easier not to support mark/reset since we don't need it + public boolean markSupported() { + return false; + } + + public void mark(int readAheadLimit) throws IOException { + throw new IOException("mark/reset not supported"); + } + + public void reset() throws IOException { + throw new IOException("mark/reset not supported"); + } + + public boolean ready() throws IOException { + if (curBuf != null || in.ready()) + return true; + return false; + } + + public int read(char[] cbuf, int off, int len) throws IOException { + if (curBuf == null) { + nextLine(); + } + + if (curBuf == null) { + return -1; + } + + int numRead = 0; + + while ((len > 0) && (curBuf != null) && (curPos < curBuf.length)) { + cbuf[off] = curBuf[curPos]; + ++curPos; + ++off; + --len; + ++numRead; + if (curPos == curBuf.length) { + nextLine(); + } + } + + return numRead; + } + + public long skip(long n) throws IOException { + long numSkipped = 0; + + while (n > 0) { + int intN = (int) n; + char[] tmp = new char[intN]; + int numRead = read(tmp, 0, intN); + n -= numRead; + numSkipped += numRead; + if (numRead < intN) + break; + } + return numSkipped; + } + + private void nextLine() throws IOException { + String cur = in.readLine(); + if (cur == null) { + curBuf = null; + return; + } + // The trailing newline was trimmed by the readLine() method. See + // whether we have to put it back or not, depending on whether the + // last character of the line is the concatenation character. + int numChars = cur.length(); + boolean needNewline = true; + if ((numChars > 0) && + (cur.charAt(cur.length() - 1) == '\\')) { + --numChars; + needNewline = false; + } + char[] buf = new char[numChars + (needNewline ? newline.length() : 0)]; + cur.getChars(0, numChars, buf, 0); + if (needNewline) { + newline.getChars(0, newline.length(), buf, numChars); + } + curBuf = buf; + curPos = 0; + } + + // Test harness + /* + public static void main(String[] args) throws IOException { + if (args.length != 1) { + System.out.println("Usage: java ConcatenatingReader [file name]"); + System.exit(1); + } + + ConcatenatingReader reader = new ConcatenatingReader(new BufferedReader(new FileReader(args[0]))); + OutputStreamWriter writer = new OutputStreamWriter(System.out); + char[] buf = new char[8192]; + boolean done = false; + while (!done && reader.ready()) { + int numRead = reader.read(buf, 0, buf.length); + writer.write(buf, 0, numRead); + if (numRead < buf.length) + done = true; + } + writer.flush(); + } + */ +} diff --git a/src/java/com/sun/gluegen/pcpp/PCPP.java b/src/java/com/sun/gluegen/pcpp/PCPP.java index 54bcda9..3978e18 100644 --- a/src/java/com/sun/gluegen/pcpp/PCPP.java +++ b/src/java/com/sun/gluegen/pcpp/PCPP.java @@ -58,7 +58,14 @@ public class PCPP { public void setOut(OutputStream out) { this.out = out; writer = new PrintWriter(out); } public void run(Reader reader, String filename) throws IOException { - StreamTokenizer tok = new StreamTokenizer(reader); + StreamTokenizer tok = null; + BufferedReader bufReader = null; + if (reader instanceof BufferedReader) { + bufReader = (BufferedReader) reader; + } else { + bufReader = new BufferedReader(reader); + } + tok = new StreamTokenizer(new ConcatenatingReader(bufReader)); tok.resetSyntax(); tok.wordChars('a', 'z'); tok.wordChars('A', 'Z'); |