add --shared
[pylucene.git] / lucene-java-3.4.0 / lucene / contrib / queryparser / src / java / org / apache / lucene / queryParser / surround / parser / FastCharStream.java
1 // FastCharStream.java
2 package org.apache.lucene.queryParser.surround.parser;
3 /**
4  * Licensed to the Apache Software Foundation (ASF) under one or more
5  * contributor license agreements.  See the NOTICE file distributed with
6  * this work for additional information regarding copyright ownership.
7  * The ASF licenses this file to You under the Apache License, Version 2.0
8  * (the "License"); you may not use this file except in compliance with
9  * the License.  You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19
20 import java.io.*;
21
22 /** An efficient implementation of JavaCC's CharStream interface.  <p>Note that
23  * this does not do line-number counting, but instead keeps track of the
24  * character position of the token in the input, as required by Lucene's {@link
25  * org.apache.lucene.analysis.Token} API. */
26 public final class FastCharStream implements CharStream {
27   char[] buffer = null;
28
29   int bufferLength = 0;                           // end of valid chars
30   int bufferPosition = 0;                         // next char to read
31
32   int tokenStart = 0;                             // offset in buffer
33   int bufferStart = 0;                            // position in file of buffer
34
35   Reader input;                                   // source of chars
36
37   /** Constructs from a Reader. */
38   public FastCharStream(Reader r) {
39     input = r;
40   }
41
42   public final char readChar() throws IOException {
43     if (bufferPosition >= bufferLength)
44       refill();
45     return buffer[bufferPosition++];
46   }
47
48   private final void refill() throws IOException {
49     int newPosition = bufferLength - tokenStart;
50
51     if (tokenStart == 0) {                        // token won't fit in buffer
52       if (buffer == null) {                       // first time: alloc buffer
53         buffer = new char[2048];
54       } else if (bufferLength == buffer.length) { // grow buffer
55         char[] newBuffer = new char[buffer.length*2];
56         System.arraycopy(buffer, 0, newBuffer, 0, bufferLength);
57         buffer = newBuffer;
58       }
59     } else {                                      // shift token to front
60       System.arraycopy(buffer, tokenStart, buffer, 0, newPosition);
61     }
62
63     bufferLength = newPosition;                   // update state
64     bufferPosition = newPosition;
65     bufferStart += tokenStart;
66     tokenStart = 0;
67
68     int charsRead =                               // fill space in buffer
69       input.read(buffer, newPosition, buffer.length-newPosition);
70     if (charsRead == -1)
71       throw new IOException("read past eof");
72     else
73       bufferLength += charsRead;
74   }
75
76   public final char BeginToken() throws IOException {
77     tokenStart = bufferPosition;
78     return readChar();
79   }
80
81   public final void backup(int amount) {
82     bufferPosition -= amount;
83   }
84
85   public final String GetImage() {
86     return new String(buffer, tokenStart, bufferPosition - tokenStart);
87   }
88
89   public final char[] GetSuffix(int len) {
90     char[] value = new char[len];
91     System.arraycopy(buffer, bufferPosition - len, value, 0, len);
92     return value;
93   }
94
95   public final void Done() {
96     try {
97       input.close();
98     } catch (IOException e) {
99       System.err.println("Caught: " + e + "; ignoring.");
100     }
101   }
102
103   public final int getColumn() {
104     return bufferStart + bufferPosition;
105   }
106   public final int getLine() {
107     return 1;
108   }
109   public final int getEndColumn() {
110     return bufferStart + bufferPosition;
111   }
112   public final int getEndLine() {
113     return 1;
114   }
115   public final int getBeginColumn() {
116     return bufferStart + tokenStart;
117   }
118   public final int getBeginLine() {
119     return 1;
120   }
121 }