1d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen/* Generated By:JavaCC: Do not edit this line. SimpleCharStream.java Version 4.0 */ 2d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen/* 3d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * Copyright 2004 the mime4j project 4d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * 5d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * Licensed under the Apache License, Version 2.0 (the "License"); 6d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * you may not use this file except in compliance with the License. 7d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * You may obtain a copy of the License at 8d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * 9d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * http://www.apache.org/licenses/LICENSE-2.0 10d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * 11d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * Unless required by applicable law or agreed to in writing, software 12d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * distributed under the License is distributed on an "AS IS" BASIS, 13d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * See the License for the specific language governing permissions and 15d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * limitations under the License. 16d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen */ 17d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chenpackage org.apache.james.mime4j.field.contenttype.parser; 18d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 19d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen/** 20d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * An implementation of interface CharStream, where the stream is assumed to 21d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * contain only ASCII characters (without unicode processing). 22d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen */ 23d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 24d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chenpublic class SimpleCharStream 25d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen{ 26d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public static final boolean staticFlag = false; 27d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen int bufsize; 28d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen int available; 29d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen int tokenBegin; 30d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public int bufpos = -1; 31d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen protected int bufline[]; 32d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen protected int bufcolumn[]; 33d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 34d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen protected int column = 0; 35d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen protected int line = 1; 36d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 37d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen protected boolean prevCharIsCR = false; 38d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen protected boolean prevCharIsLF = false; 39d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 40d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen protected java.io.Reader inputStream; 41d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 42d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen protected char[] buffer; 43d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen protected int maxNextCharInd = 0; 44d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen protected int inBuf = 0; 45d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen protected int tabSize = 8; 46d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 47d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen protected void setTabSize(int i) { tabSize = i; } 48d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen protected int getTabSize(int i) { return tabSize; } 49d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 50d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 51d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen protected void ExpandBuff(boolean wrapAround) 52d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 53d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen char[] newbuffer = new char[bufsize + 2048]; 54d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen int newbufline[] = new int[bufsize + 2048]; 55d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen int newbufcolumn[] = new int[bufsize + 2048]; 56d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 57d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen try 58d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 59d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen if (wrapAround) 60d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 61d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin); 62d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen System.arraycopy(buffer, 0, newbuffer, 63d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen bufsize - tokenBegin, bufpos); 64d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen buffer = newbuffer; 65d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 66d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin); 67d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos); 68d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen bufline = newbufline; 69d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 70d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin); 71d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos); 72d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen bufcolumn = newbufcolumn; 73d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 74d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen maxNextCharInd = (bufpos += (bufsize - tokenBegin)); 75d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 76d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen else 77d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 78d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin); 79d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen buffer = newbuffer; 80d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 81d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin); 82d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen bufline = newbufline; 83d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 84d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin); 85d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen bufcolumn = newbufcolumn; 86d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 87d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen maxNextCharInd = (bufpos -= tokenBegin); 88d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 89d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 90d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen catch (Throwable t) 91d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 92d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen throw new Error(t.getMessage()); 93d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 94d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 95d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 96d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen bufsize += 2048; 97d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen available = bufsize; 98d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen tokenBegin = 0; 99d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 100d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 101d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen protected void FillBuff() throws java.io.IOException 102d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 103d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen if (maxNextCharInd == available) 104d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 105d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen if (available == bufsize) 106d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 107d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen if (tokenBegin > 2048) 108d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 109d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen bufpos = maxNextCharInd = 0; 110d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen available = tokenBegin; 111d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 112d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen else if (tokenBegin < 0) 113d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen bufpos = maxNextCharInd = 0; 114d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen else 115d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen ExpandBuff(false); 116d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 117d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen else if (available > tokenBegin) 118d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen available = bufsize; 119d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen else if ((tokenBegin - available) < 2048) 120d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen ExpandBuff(true); 121d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen else 122d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen available = tokenBegin; 123d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 124d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 125d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen int i; 126d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen try { 127d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen if ((i = inputStream.read(buffer, maxNextCharInd, 128d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen available - maxNextCharInd)) == -1) 129d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 130d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen inputStream.close(); 131d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen throw new java.io.IOException(); 132d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 133d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen else 134d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen maxNextCharInd += i; 135d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen return; 136d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 137d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen catch(java.io.IOException e) { 138d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen --bufpos; 139d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen backup(0); 140d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen if (tokenBegin == -1) 141d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen tokenBegin = bufpos; 142d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen throw e; 143d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 144d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 145d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 146d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public char BeginToken() throws java.io.IOException 147d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 148d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen tokenBegin = -1; 149d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen char c = readChar(); 150d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen tokenBegin = bufpos; 151d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 152d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen return c; 153d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 154d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 155d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen protected void UpdateLineColumn(char c) 156d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 157d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen column++; 158d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 159d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen if (prevCharIsLF) 160d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 161d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen prevCharIsLF = false; 162d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen line += (column = 1); 163d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 164d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen else if (prevCharIsCR) 165d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 166d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen prevCharIsCR = false; 167d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen if (c == '\n') 168d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 169d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen prevCharIsLF = true; 170d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 171d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen else 172d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen line += (column = 1); 173d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 174d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 175d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen switch (c) 176d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 177d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen case '\r' : 178d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen prevCharIsCR = true; 179d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen break; 180d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen case '\n' : 181d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen prevCharIsLF = true; 182d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen break; 183d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen case '\t' : 184d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen column--; 185d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen column += (tabSize - (column % tabSize)); 186d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen break; 187d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen default : 188d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen break; 189d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 190d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 191d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen bufline[bufpos] = line; 192d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen bufcolumn[bufpos] = column; 193d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 194d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 195d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public char readChar() throws java.io.IOException 196d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 197d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen if (inBuf > 0) 198d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 199d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen --inBuf; 200d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 201d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen if (++bufpos == bufsize) 202d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen bufpos = 0; 203d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 204d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen return buffer[bufpos]; 205d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 206d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 207d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen if (++bufpos >= maxNextCharInd) 208d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen FillBuff(); 209d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 210d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen char c = buffer[bufpos]; 211d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 212d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen UpdateLineColumn(c); 213d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen return (c); 214d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 215d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 216d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen /** 217d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * @deprecated 218d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * @see #getEndColumn 219d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen */ 220d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen @Deprecated 221d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public int getColumn() { 222d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen return bufcolumn[bufpos]; 223d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 224d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 225d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen /** 226d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * @deprecated 227d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * @see #getEndLine 228d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen */ 229d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen @Deprecated 230d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public int getLine() { 231d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen return bufline[bufpos]; 232d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 233d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 234d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public int getEndColumn() { 235d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen return bufcolumn[bufpos]; 236d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 237d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 238d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public int getEndLine() { 239d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen return bufline[bufpos]; 240d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 241d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 242d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public int getBeginColumn() { 243d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen return bufcolumn[tokenBegin]; 244d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 245d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 246d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public int getBeginLine() { 247d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen return bufline[tokenBegin]; 248d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 249d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 250d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public void backup(int amount) { 251d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 252d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen inBuf += amount; 253d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen if ((bufpos -= amount) < 0) 254d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen bufpos += bufsize; 255d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 256d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 257d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public SimpleCharStream(java.io.Reader dstream, int startline, 258d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen int startcolumn, int buffersize) 259d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 260d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen inputStream = dstream; 261d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen line = startline; 262d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen column = startcolumn - 1; 263d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 264d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen available = bufsize = buffersize; 265d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen buffer = new char[buffersize]; 266d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen bufline = new int[buffersize]; 267d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen bufcolumn = new int[buffersize]; 268d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 269d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 270d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public SimpleCharStream(java.io.Reader dstream, int startline, 271d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen int startcolumn) 272d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 273d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen this(dstream, startline, startcolumn, 4096); 274d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 275d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 276d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public SimpleCharStream(java.io.Reader dstream) 277d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 278d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen this(dstream, 1, 1, 4096); 279d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 280d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public void ReInit(java.io.Reader dstream, int startline, 281d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen int startcolumn, int buffersize) 282d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 283d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen inputStream = dstream; 284d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen line = startline; 285d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen column = startcolumn - 1; 286d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 287d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen if (buffer == null || buffersize != buffer.length) 288d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 289d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen available = bufsize = buffersize; 290d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen buffer = new char[buffersize]; 291d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen bufline = new int[buffersize]; 292d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen bufcolumn = new int[buffersize]; 293d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 294d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen prevCharIsLF = prevCharIsCR = false; 295d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen tokenBegin = inBuf = maxNextCharInd = 0; 296d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen bufpos = -1; 297d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 298d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 299d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public void ReInit(java.io.Reader dstream, int startline, 300d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen int startcolumn) 301d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 302d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen ReInit(dstream, startline, startcolumn, 4096); 303d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 304d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 305d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public void ReInit(java.io.Reader dstream) 306d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 307d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen ReInit(dstream, 1, 1, 4096); 308d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 309d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline, 310d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException 311d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 312d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen this(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize); 313d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 314d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 315d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public SimpleCharStream(java.io.InputStream dstream, int startline, 316d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen int startcolumn, int buffersize) 317d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 318d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen this(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize); 319d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 320d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 321d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public SimpleCharStream(java.io.InputStream dstream, String encoding, int startline, 322d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen int startcolumn) throws java.io.UnsupportedEncodingException 323d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 324d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen this(dstream, encoding, startline, startcolumn, 4096); 325d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 326d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 327d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public SimpleCharStream(java.io.InputStream dstream, int startline, 328d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen int startcolumn) 329d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 330d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen this(dstream, startline, startcolumn, 4096); 331d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 332d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 333d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public SimpleCharStream(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException 334d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 335d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen this(dstream, encoding, 1, 1, 4096); 336d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 337d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 338d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public SimpleCharStream(java.io.InputStream dstream) 339d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 340d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen this(dstream, 1, 1, 4096); 341d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 342d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 343d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public void ReInit(java.io.InputStream dstream, String encoding, int startline, 344d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen int startcolumn, int buffersize) throws java.io.UnsupportedEncodingException 345d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 346d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen ReInit(encoding == null ? new java.io.InputStreamReader(dstream) : new java.io.InputStreamReader(dstream, encoding), startline, startcolumn, buffersize); 347d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 348d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 349d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public void ReInit(java.io.InputStream dstream, int startline, 350d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen int startcolumn, int buffersize) 351d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 352d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, buffersize); 353d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 354d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 355d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public void ReInit(java.io.InputStream dstream, String encoding) throws java.io.UnsupportedEncodingException 356d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 357d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen ReInit(dstream, encoding, 1, 1, 4096); 358d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 359d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 360d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public void ReInit(java.io.InputStream dstream) 361d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 362d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen ReInit(dstream, 1, 1, 4096); 363d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 364d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public void ReInit(java.io.InputStream dstream, String encoding, int startline, 365d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen int startcolumn) throws java.io.UnsupportedEncodingException 366d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 367d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen ReInit(dstream, encoding, startline, startcolumn, 4096); 368d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 369d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public void ReInit(java.io.InputStream dstream, int startline, 370d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen int startcolumn) 371d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 372d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen ReInit(dstream, startline, startcolumn, 4096); 373d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 374d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public String GetImage() 375d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 376d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen if (bufpos >= tokenBegin) 377d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen return new String(buffer, tokenBegin, bufpos - tokenBegin + 1); 378d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen else 379d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen return new String(buffer, tokenBegin, bufsize - tokenBegin) + 380d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen new String(buffer, 0, bufpos + 1); 381d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 382d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 383d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public char[] GetSuffix(int len) 384d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 385d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen char[] ret = new char[len]; 386d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 387d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen if ((bufpos + 1) >= len) 388d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen System.arraycopy(buffer, bufpos - len + 1, ret, 0, len); 389d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen else 390d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 391d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0, 392d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen len - bufpos - 1); 393d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1); 394d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 395d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 396d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen return ret; 397d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 398d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 399d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public void Done() 400d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 401d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen buffer = null; 402d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen bufline = null; 403d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen bufcolumn = null; 404d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 405d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 406d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen /** 407d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen * Method to adjust line and column numbers for the start of a token. 408d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen */ 409d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen public void adjustBeginLineColumn(int newLine, int newCol) 410d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 411d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen int start = tokenBegin; 412d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen int len; 413d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 414d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen if (bufpos >= tokenBegin) 415d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 416d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen len = bufpos - tokenBegin + inBuf + 1; 417d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 418d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen else 419d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 420d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen len = bufsize - tokenBegin + bufpos + 1 + inBuf; 421d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 422d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 423d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen int i = 0, j = 0, k = 0; 424d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen int nextColDiff = 0, columnDiff = 0; 425d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 426d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen while (i < len && 427d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen bufline[j = start % bufsize] == bufline[k = ++start % bufsize]) 428d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 429d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen bufline[j] = newLine; 430d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j]; 431d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen bufcolumn[j] = newCol + columnDiff; 432d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen columnDiff = nextColDiff; 433d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen i++; 434d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 435d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 436d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen if (i < len) 437d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 438d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen bufline[j] = newLine++; 439d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen bufcolumn[j] = newCol + columnDiff; 440d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 441d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen while (i++ < len) 442d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen { 443d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen if (bufline[j = start % bufsize] != bufline[++start % bufsize]) 444d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen bufline[j] = newLine++; 445d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen else 446d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen bufline[j] = newLine; 447d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 448d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 449d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 450d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen line = bufline[j]; 451d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen column = bufcolumn[j]; 452d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen } 453d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen 454d186a38568ddec7efcba054ccc2fe8ed9b8945fcNancy Chen} 455