aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKenneth Russel <[email protected]>2006-10-14 21:53:55 +0000
committerKenneth Russel <[email protected]>2006-10-14 21:53:55 +0000
commit3e4b755db1bdcf103eb75deaed0b91a22c5a38ea (patch)
treeb8335cea6c128246f8734911266f5ac15f31dd09
parent23fdd9dbd509c921e1408f8c36caa57252118963 (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
-rwxr-xr-xsrc/java/com/sun/gluegen/pcpp/ConcatenatingReader.java174
-rw-r--r--src/java/com/sun/gluegen/pcpp/PCPP.java9
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');