--- /dev/null
+/*\r
+\r
+ Derby - Class org.apache.derby.impl.sql.compile.UCode_CharStream\r
+\r
+ Licensed to the Apache Software Foundation (ASF) under one or more\r
+ contributor license agreements. See the NOTICE file distributed with\r
+ this work for additional information regarding copyright ownership.\r
+ The ASF licenses this file to you under the Apache License, Version 2.0\r
+ (the "License"); you may not use this file except in compliance with\r
+ the License. You may obtain a copy of the License at\r
+\r
+ http://www.apache.org/licenses/LICENSE-2.0\r
+\r
+ Unless required by applicable law or agreed to in writing, software\r
+ distributed under the License is distributed on an "AS IS" BASIS,\r
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ See the License for the specific language governing permissions and\r
+ limitations under the License.\r
+\r
+ */\r
+\r
+/* Generated By:JavaCC: Do not edit this line. UCode_CharStream.java Version 0.7pre6 */\r
+package org.apache.derby.impl.sql.compile;\r
+\r
+/**\r
+ * An implementation of interface CharStream, where the stream is assumed to\r
+ * contain only Unicode characters.\r
+ */\r
+\r
+// NOTE: This class was modified to support the ability to get all the\r
+// characters in the input stream between two tokens. - Jeff\r
+\r
+public final class UCode_CharStream implements CharStream\r
+{\r
+ // The next two lines are added to support ability to get the input\r
+ // between two tokens.\r
+ int charCnt;\r
+ int[] charOffset;\r
+\r
+ public static final boolean staticFlag = false;\r
+ public int bufpos = -1;\r
+ int bufsize;\r
+ int available;\r
+ int tokenBegin;\r
+ private int bufline[];\r
+ private int bufcolumn[];\r
+\r
+ private int column = 0;\r
+ private int line = 1;\r
+\r
+ private boolean prevCharIsCR = false;\r
+ private boolean prevCharIsLF = false;\r
+\r
+ private java.io.Reader inputStream;\r
+\r
+ private char[] nextCharBuf;\r
+ private char[] buffer;\r
+ private int maxNextCharInd = 0;\r
+ private int nextCharInd = -1;\r
+\r
+ private final void ExpandBuff(boolean wrapAround)\r
+ {\r
+ char[] newbuffer = new char[bufsize + 2048];\r
+ int newbufline[] = new int[bufsize + 2048];\r
+ int newbufcolumn[] = new int[bufsize + 2048];\r
+\r
+ // The next line was added to support ability to get the input\r
+ // between two tokens.\r
+ int newcharOffset[] = new int[bufsize + 2048];\r
+\r
+ try\r
+ {\r
+ if (wrapAround)\r
+ {\r
+ System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);\r
+ System.arraycopy(buffer, 0, newbuffer,\r
+ bufsize - tokenBegin, bufpos);\r
+ buffer = newbuffer;\r
+\r
+ System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);\r
+ System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);\r
+ bufline = newbufline;\r
+\r
+ System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);\r
+ System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);\r
+ bufcolumn = newbufcolumn;\r
+\r
+ // The next three lines were added to support ability to get input\r
+ // between two tokens.\r
+ System.arraycopy(charOffset, tokenBegin, newcharOffset, 0, bufsize - tokenBegin);\r
+ System.arraycopy(charOffset, 0, newcharOffset, bufsize - tokenBegin, bufpos);\r
+ charOffset = newcharOffset;\r
+\r
+ bufpos += (bufsize - tokenBegin);\r
+ }\r
+ else\r
+ {\r
+ System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);\r
+ buffer = newbuffer;\r
+\r
+ System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);\r
+ bufline = newbufline;\r
+\r
+ System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);\r
+ bufcolumn = newbufcolumn;\r
+\r
+ // The next two lines were added to support ability to get input\r
+ // between two tokens.\r
+ System.arraycopy(charOffset, tokenBegin, newcharOffset, 0, bufsize - tokenBegin);\r
+ charOffset = newcharOffset;\r
+\r
+ bufpos -= tokenBegin;\r
+ }\r
+ }\r
+ catch (Throwable t)\r
+ {\r
+ throw new Error(t.getMessage());\r
+ }\r
+\r
+ available = (bufsize += 2048);\r
+ tokenBegin = 0;\r
+ }\r
+\r
+ private final void FillBuff() throws java.io.IOException\r
+ {\r
+ if (maxNextCharInd == nextCharBuf.length)\r
+ maxNextCharInd = nextCharInd = 0;\r
+\r
+ int i;\r
+ try {\r
+ if ((i = inputStream.read(nextCharBuf, maxNextCharInd,\r
+ nextCharBuf.length - maxNextCharInd)) == -1)\r
+ {\r
+ inputStream.close();\r
+ throw new java.io.IOException();\r
+ }\r
+ else\r
+ maxNextCharInd += i;\r
+ return;\r
+ }\r
+ catch(java.io.IOException e) {\r
+ if (bufpos != 0)\r
+ {\r
+ --bufpos;\r
+ backup(0);\r
+ }\r
+ else\r
+ {\r
+ bufline[bufpos] = line;\r
+ bufcolumn[bufpos] = column;\r
+ }\r
+ if (tokenBegin == -1)\r
+ tokenBegin = bufpos;\r
+ throw e;\r
+ }\r
+ }\r
+\r
+ private final char ReadChar() throws java.io.IOException\r
+ {\r
+ if (++nextCharInd >= maxNextCharInd)\r
+ FillBuff();\r
+\r
+ return nextCharBuf[nextCharInd];\r
+ }\r
+ \r
+ public char BeginToken() throws java.io.IOException\r
+ { \r
+ if (inBuf > 0)\r
+ {\r
+ --inBuf;\r
+ return buffer[tokenBegin = (bufpos == bufsize - 1) ? (bufpos = 0)\r
+ : ++bufpos];\r
+ }\r
+\r
+ tokenBegin = 0;\r
+ bufpos = -1;\r
+ char c = readChar();\r
+\r
+ return c;\r
+ } \r
+\r
+ private final void UpdateLineColumn(char c)\r
+ {\r
+ column++;\r
+\r
+ if (prevCharIsLF)\r
+ {\r
+ prevCharIsLF = false;\r
+ line += (column = 1);\r
+ }\r
+ else if (prevCharIsCR)\r
+ {\r
+ prevCharIsCR = false;\r
+ if (c == '\n')\r
+ {\r
+ prevCharIsLF = true;\r
+ }\r
+ else\r
+ line += (column = 1);\r
+ }\r
+\r
+ switch (c)\r
+ {\r
+ case '\r' :\r
+ prevCharIsCR = true;\r
+ break;\r
+ case '\n' :\r
+ prevCharIsLF = true;\r
+ break;\r
+ case '\t' :\r
+ column--;\r
+ column += (8 - (column & 07));\r
+ break;\r
+ default :\r
+ break;\r
+ }\r
+\r
+ bufline[bufpos] = line;\r
+ bufcolumn[bufpos] = column;\r
+ }\r
+\r
+ private int inBuf = 0;\r
+ public final char readChar() throws java.io.IOException\r
+ {\r
+ if (inBuf > 0)\r
+ {\r
+ --inBuf;\r
+ return (char)buffer[(bufpos == bufsize - 1) ? (bufpos = 0) : ++bufpos];\r
+ }\r
+\r
+ if (++bufpos == available)\r
+ {\r
+ if (available == bufsize)\r
+ {\r
+ if (tokenBegin > 2048)\r
+ {\r
+ bufpos = 0;\r
+ available = tokenBegin;\r
+ }\r
+ else if (tokenBegin < 0)\r
+ bufpos = 0;\r
+ else\r
+ ExpandBuff(false);\r
+ }\r
+ else if (available > tokenBegin)\r
+ available = bufsize;\r
+ else if ((tokenBegin - available) < 2048)\r
+ ExpandBuff(true);\r
+ else\r
+ available = tokenBegin;\r
+ }\r
+\r
+ char c = ReadChar();\r
+\r
+ UpdateLineColumn(c);\r
+\r
+ // The next line was added to support ability to get the input\r
+ // between two tokens.\r
+ charOffset[bufpos] = charCnt++;\r
+\r
+ return (buffer[bufpos] = c);\r
+ }\r
+\r
+ /**\r
+ * @deprecated \r
+ * @see #getEndColumn\r
+ */\r
+\r
+ public final int getColumn() {\r
+ return bufcolumn[bufpos];\r
+ }\r
+\r
+ /**\r
+ * @deprecated \r
+ * @see #getEndLine\r
+ */\r
+\r
+ public final int getLine() {\r
+ return bufline[bufpos];\r
+ }\r
+\r
+ public final int getEndColumn() {\r
+ return bufcolumn[bufpos];\r
+ }\r
+\r
+ public final int getEndLine() {\r
+ return bufline[bufpos];\r
+ }\r
+\r
+ public final int getBeginColumn() {\r
+ return bufcolumn[tokenBegin];\r
+ }\r
+\r
+ public final int getBeginLine() {\r
+ return bufline[tokenBegin];\r
+ }\r
+\r
+ // This method was added to support ability to get the input\r
+ // between two tokens.\r
+ public final int getBeginOffset() {\r
+ return charOffset[tokenBegin];\r
+ }\r
+\r
+ // This method was added to support ability to get the input\r
+ // between two tokens.\r
+ public final int getEndOffset() {\r
+ return charOffset[bufpos];\r
+ }\r
+\r
+ public final void backup(int amount) {\r
+\r
+ inBuf += amount;\r
+ if ((bufpos -= amount) < 0)\r
+ bufpos += bufsize;\r
+ }\r
+\r
+ public UCode_CharStream(java.io.Reader dstream,\r
+ int startline, int startcolumn, int buffersize)\r
+ {\r
+ inputStream = dstream;\r
+ line = startline;\r
+ column = startcolumn - 1;\r
+\r
+ available = bufsize = buffersize;\r
+ buffer = new char[buffersize];\r
+ nextCharBuf = new char[buffersize];\r
+ bufline = new int[buffersize];\r
+ bufcolumn = new int[buffersize];\r
+\r
+ // The next line was added to support ability to get the input\r
+ // between two tokens.\r
+ charOffset = new int[buffersize];\r
+ }\r
+\r
+ public UCode_CharStream(java.io.Reader dstream,\r
+ int startline, int startcolumn)\r
+ {\r
+ this(dstream, startline, startcolumn, 4096);\r
+ }\r
+\r
+ public void ReInit(java.io.Reader dstream,\r
+ int startline, int startcolumn, int buffersize)\r
+ {\r
+ inputStream = dstream;\r
+ line = startline;\r
+ column = startcolumn - 1;\r
+\r
+ if (buffer == null || buffersize != buffer.length)\r
+ {\r
+ available = bufsize = buffersize;\r
+ buffer = new char[buffersize];\r
+ nextCharBuf = new char[buffersize];\r
+ bufline = new int[buffersize];\r
+ bufcolumn = new int[buffersize];\r
+ }\r
+\r
+ // The next line was added to support ability to get the input\r
+ // between two tokens.\r
+ inBuf = maxNextCharInd = charCnt = tokenBegin = 0;\r
+ nextCharInd = bufpos = -1;\r
+ }\r
+\r
+ public void ReInit(java.io.Reader dstream,\r
+ int startline, int startcolumn)\r
+ {\r
+ ReInit(dstream, startline, startcolumn, 4096);\r
+ }\r
+ public UCode_CharStream(java.io.InputStream dstream, int startline,\r
+ int startcolumn, int buffersize)\r
+ {\r
+ this(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);\r
+ }\r
+\r
+ public UCode_CharStream(java.io.InputStream dstream, int startline,\r
+ int startcolumn)\r
+ {\r
+ this(dstream, startline, startcolumn, 4096);\r
+ }\r
+\r
+ public void ReInit(java.io.InputStream dstream, int startline,\r
+ int startcolumn, int buffersize)\r
+ {\r
+ ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096);\r
+ }\r
+ public void ReInit(java.io.InputStream dstream, int startline,\r
+ int startcolumn)\r
+ {\r
+ ReInit(dstream, startline, startcolumn, 4096);\r
+ }\r
+\r
+ public final String GetImage()\r
+ {\r
+ if (bufpos >= tokenBegin)\r
+ return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);\r
+ else\r
+ return new String(buffer, tokenBegin, bufsize - tokenBegin) +\r
+ new String(buffer, 0, bufpos + 1);\r
+ }\r
+\r
+ public final char[] GetSuffix(int len)\r
+ {\r
+ char[] ret = new char[len];\r
+\r
+ if ((bufpos + 1) >= len)\r
+ System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);\r
+ else\r
+ {\r
+ System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,\r
+ len - bufpos - 1);\r
+ System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);\r
+ }\r
+\r
+ return ret;\r
+ }\r
+\r
+ public void Done()\r
+ {\r
+ nextCharBuf = null;\r
+ buffer = null;\r
+ bufline = null;\r
+ bufcolumn = null;\r
+\r
+ // The next line was added to support ability to get the input\r
+ // between two tokens.\r
+ charOffset = null;\r
+ }\r
+\r
+ /**\r
+ * Method to adjust line and column numbers for the start of a token.<BR>\r
+ */\r
+ public void adjustBeginLineColumn(int newLine, int newCol)\r
+ {\r
+ int start = tokenBegin;\r
+ int len;\r
+\r
+ if (bufpos >= tokenBegin)\r
+ {\r
+ len = bufpos - tokenBegin + inBuf + 1;\r
+ }\r
+ else\r
+ {\r
+ len = bufsize - tokenBegin + bufpos + 1 + inBuf;\r
+ }\r
+\r
+ int i = 0, j = 0, k = 0;\r
+ int nextColDiff = 0, columnDiff = 0;\r
+\r
+ while (i < len &&\r
+ bufline[j = start % bufsize] == bufline[k = ++start % bufsize])\r
+ {\r
+ bufline[j] = newLine;\r
+ nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];\r
+ bufcolumn[j] = newCol + columnDiff;\r
+ columnDiff = nextColDiff;\r
+ i++;\r
+ } \r
+\r
+ if (i < len)\r
+ {\r
+ bufline[j] = newLine++;\r
+ bufcolumn[j] = newCol + columnDiff;\r
+\r
+ while (i++ < len)\r
+ {\r
+ if (bufline[j = start % bufsize] != bufline[++start % bufsize])\r
+ bufline[j] = newLine++;\r
+ else\r
+ bufline[j] = newLine;\r
+ }\r
+ }\r
+\r
+ line = bufline[j];\r
+ column = bufcolumn[j];\r
+ }\r
+\r
+}\r