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