View Javadoc

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