diff options
author | Kenneth Russel <[email protected]> | 2006-10-14 21:53:55 +0000 |
---|---|---|
committer | Kenneth Russel <[email protected]> | 2006-10-14 21:53:55 +0000 |
commit | 3e4b755db1bdcf103eb75deaed0b91a22c5a38ea (patch) | |
tree | b8335cea6c128246f8734911266f5ac15f31dd09 /src/java/com/sun/gluegen/pcpp/ConcatenatingReader.java | |
parent | 23fdd9dbd509c921e1408f8c36caa57252118963 (diff) |
Fixed Issue 3: Support for backslash line-splitting by PCPP
Added ConcatenatingReader class and used it internally in PCPP to
stitch together lines ending in backslash/newline.
git-svn-id: file:///usr/local/projects/SUN/JOGL/git-svn/../svn-server-sync/gluegen/trunk@49 a78bb65f-1512-4460-ba86-f6dc96a7bf27
Diffstat (limited to 'src/java/com/sun/gluegen/pcpp/ConcatenatingReader.java')
-rwxr-xr-x | src/java/com/sun/gluegen/pcpp/ConcatenatingReader.java | 174 |
1 files changed, 174 insertions, 0 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(); + } + */ +} |