package railo.runtime.sql.old; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; public final class SimpleCharStream { private final void ExpandBuff(boolean flag) { char ac[] = new char[bufsize + 2048]; int ai[] = new int[bufsize + 2048]; int ai1[] = new int[bufsize + 2048]; try { if(flag) { System.arraycopy(buffer, tokenBegin, ac, 0, bufsize - tokenBegin); System.arraycopy(buffer, 0, ac, bufsize - tokenBegin, bufpos); buffer = ac; System.arraycopy(bufline, tokenBegin, ai, 0, bufsize - tokenBegin); System.arraycopy(bufline, 0, ai, bufsize - tokenBegin, bufpos); bufline = ai; System.arraycopy(bufcolumn, tokenBegin, ai1, 0, bufsize - tokenBegin); System.arraycopy(bufcolumn, 0, ai1, bufsize - tokenBegin, bufpos); bufcolumn = ai1; maxNextCharInd = bufpos += bufsize - tokenBegin; } else { System.arraycopy(buffer, tokenBegin, ac, 0, bufsize - tokenBegin); buffer = ac; System.arraycopy(bufline, tokenBegin, ai, 0, bufsize - tokenBegin); bufline = ai; System.arraycopy(bufcolumn, tokenBegin, ai1, 0, bufsize - tokenBegin); bufcolumn = ai1; maxNextCharInd = bufpos -= tokenBegin; } } catch(Throwable throwable) { throw new Error(throwable.getMessage()); } bufsize += 2048; available = bufsize; tokenBegin = 0; } private final void FillBuff() throws IOException { if(maxNextCharInd == available) if(available == bufsize) { if(tokenBegin > 2048) { bufpos = maxNextCharInd = 0; available = tokenBegin; } else if(tokenBegin < 0) bufpos = maxNextCharInd = 0; else ExpandBuff(false); } else if(available > tokenBegin) available = bufsize; else if(tokenBegin - available < 2048) ExpandBuff(true); else available = tokenBegin; int i; try { if((i = inputStream.read(buffer, maxNextCharInd, available - maxNextCharInd)) == -1) { inputStream.close(); throw new IOException(); } maxNextCharInd += i; return; } catch(IOException ioexception) { bufpos--; backup(0); if(tokenBegin == -1) tokenBegin = bufpos; throw ioexception; } } public final char BeginToken() throws IOException { tokenBegin = -1; char c = readChar(); tokenBegin = bufpos; return c; } private final void UpdateLineColumn(char c) { column++; if(prevCharIsLF) { prevCharIsLF = false; line += column = 1; } else if(prevCharIsCR) { prevCharIsCR = false; if(c == '\n') prevCharIsLF = true; else line += column = 1; } switch(c) { case 13: // '\r' prevCharIsCR = true; break; case 10: // '\n' prevCharIsLF = true; break; case 9: // '\t' column--; column += 8 - (column & 7); break; } bufline[bufpos] = line; bufcolumn[bufpos] = column; } public final char readChar() throws IOException { if(inBuf > 0) { inBuf--; if(++bufpos == bufsize) bufpos = 0; return buffer[bufpos]; } if(++bufpos >= maxNextCharInd) FillBuff(); char c = buffer[bufpos]; UpdateLineColumn(c); return c; } /** * @deprecated Method getColumn is deprecated */ public final int getColumn() { return bufcolumn[bufpos]; } /** * @deprecated Method getLine is deprecated */ public final int getLine() { return bufline[bufpos]; } public final int getEndColumn() { return bufcolumn[bufpos]; } public final int getEndLine() { return bufline[bufpos]; } public final int getBeginColumn() { return bufcolumn[tokenBegin]; } public final int getBeginLine() { return bufline[tokenBegin]; } public final void backup(int i) { inBuf += i; if((bufpos -= i) < 0) bufpos += bufsize; } public SimpleCharStream(Reader reader, int i, int j, int k) { bufpos = -1; column = 0; line = 1; prevCharIsCR = false; prevCharIsLF = false; maxNextCharInd = 0; inBuf = 0; inputStream = reader; line = i; column = j - 1; available = bufsize = k; buffer = new char[k]; bufline = new int[k]; bufcolumn = new int[k]; } public SimpleCharStream(Reader reader, int i, int j) { this(reader, i, j, 4096); } public SimpleCharStream(Reader reader) { this(reader, 1, 1, 4096); } public void ReInit(Reader reader, int i, int j, int k) { inputStream = reader; line = i; column = j - 1; if(buffer == null || k != buffer.length) { available = bufsize = k; buffer = new char[k]; bufline = new int[k]; bufcolumn = new int[k]; } prevCharIsLF = prevCharIsCR = false; tokenBegin = inBuf = maxNextCharInd = 0; bufpos = -1; } public void ReInit(Reader reader, int i, int j) { ReInit(reader, i, j, 4096); } public void ReInit(Reader reader) { ReInit(reader, 1, 1, 4096); } public SimpleCharStream(InputStream inputstream, int i, int j, int k) { this(( (new InputStreamReader(inputstream))), i, j, 4096); } public SimpleCharStream(InputStream inputstream, int i, int j) { this(inputstream, i, j, 4096); } public SimpleCharStream(InputStream inputstream) { this(inputstream, 1, 1, 4096); } public void ReInit(InputStream inputstream, int i, int j, int k) { ReInit(( (new InputStreamReader(inputstream))), i, j, 4096); } public void ReInit(InputStream inputstream) { ReInit(inputstream, 1, 1, 4096); } public void ReInit(InputStream inputstream, int i, int j) { ReInit(inputstream, i, j, 4096); } public final String GetImage() { if(bufpos >= tokenBegin) return new String(buffer, tokenBegin, (bufpos - tokenBegin) + 1); return new String(buffer, tokenBegin, bufsize - tokenBegin) + new String(buffer, 0, bufpos + 1); } public final char[] GetSuffix(int i) { char ac[] = new char[i]; if(bufpos + 1 >= i) { System.arraycopy(buffer, (bufpos - i) + 1, ac, 0, i); } else { System.arraycopy(buffer, bufsize - (i - bufpos - 1), ac, 0, i - bufpos - 1); System.arraycopy(buffer, 0, ac, i - bufpos - 1, bufpos + 1); } return ac; } public void Done() { buffer = null; bufline = null; bufcolumn = null; } public void adjustBeginLineColumn(int i, int j) { int k = tokenBegin; int l; if(bufpos >= tokenBegin) l = (bufpos - tokenBegin) + inBuf + 1; else l = (bufsize - tokenBegin) + bufpos + 1 + inBuf; int i1 = 0; int j1 = 0; //boolean flag = false; //boolean flag1 = false; int i2 = 0; int k1; for(; i1 < l && bufline[j1 = k % bufsize] == bufline[k1 = ++k % bufsize]; i1++) { bufline[j1] = i; int l1 = (i2 + bufcolumn[k1]) - bufcolumn[j1]; bufcolumn[j1] = j + i2; i2 = l1; } if(i1 < l) { bufline[j1] = i++; bufcolumn[j1] = j + i2; while(i1++ < l) if(bufline[j1 = k % bufsize] != bufline[++k % bufsize]) bufline[j1] = i++; else bufline[j1] = i; } line = bufline[j1]; column = bufcolumn[j1]; } public static final boolean staticFlag = false; int bufsize; int available; int tokenBegin; public int bufpos; private int bufline[]; private int bufcolumn[]; private int column; private int line; private boolean prevCharIsCR; private boolean prevCharIsLF; private Reader inputStream; private char buffer[]; private int maxNextCharInd; private int inBuf; }