FastCharStream.cs
上传用户:zhangkuixh
上传日期:2013-09-30
资源大小:5473k
文件大小:4k
源码类别:

搜索引擎

开发平台:

C#

  1. /*
  2.  * Copyright 2004 The Apache Software Foundation
  3.  * 
  4.  * Licensed under the Apache License, Version 2.0 (the "License");
  5.  * you may not use this file except in compliance with the License.
  6.  * You may obtain a copy of the License at
  7.  * 
  8.  * http://www.apache.org/licenses/LICENSE-2.0
  9.  * 
  10.  * Unless required by applicable law or agreed to in writing, software
  11.  * distributed under the License is distributed on an "AS IS" BASIS,
  12.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13.  * See the License for the specific language governing permissions and
  14.  * limitations under the License.
  15.  */
  16. using System;
  17. namespace Lucene.Net.QueryParsers
  18. {
  19. /// <summary>An efficient implementation of JavaCC's CharStream interface.  <p>Note that
  20. /// this does not do line-number counting, but instead keeps track of the
  21. /// character position of the token in the input, as required by Lucene's {@link
  22. /// Lucene.Net.analysis.Token} API. 
  23. /// </summary>
  24. public sealed class FastCharStream : CharStream
  25. {
  26. internal char[] buffer = null;
  27. internal int bufferLength = 0; // end of valid chars
  28. internal int bufferPosition = 0; // next char to read
  29. internal int tokenStart = 0; // offset in buffer
  30. internal int bufferStart = 0; // position in file of buffer
  31. internal System.IO.TextReader input; // source of chars
  32. /// <summary>Constructs from a Reader. </summary>
  33. public FastCharStream(System.IO.TextReader r)
  34. {
  35. input = r;
  36. }
  37. public char ReadChar()
  38. {
  39. if (bufferPosition >= bufferLength)
  40. Refill();
  41. return buffer[bufferPosition++];
  42. }
  43. private void  Refill()
  44. {
  45. int newPosition = bufferLength - tokenStart;
  46. if (tokenStart == 0)
  47. {
  48. // token won't fit in buffer
  49. if (buffer == null)
  50. {
  51. // first time: alloc buffer
  52. buffer = new char[2048];
  53. }
  54. else if (bufferLength == buffer.Length)
  55. {
  56. // grow buffer
  57. char[] newBuffer = new char[buffer.Length * 2];
  58. Array.Copy(buffer, 0, newBuffer, 0, bufferLength);
  59. buffer = newBuffer;
  60. }
  61. }
  62. else
  63. {
  64. // shift token to front
  65. Array.Copy(buffer, tokenStart, buffer, 0, newPosition);
  66. }
  67. bufferLength = newPosition; // update state
  68. bufferPosition = newPosition;
  69. bufferStart += tokenStart;
  70. tokenStart = 0;
  71. int charsRead = 0;
  72.             
  73.             try
  74.             {
  75.                 charsRead = input.Read(buffer, newPosition, buffer.Length - newPosition);
  76.             }
  77.             catch
  78.             {
  79.             }
  80. if (charsRead <= 0)
  81. throw new System.IO.IOException("read past eof");
  82. else
  83. bufferLength += charsRead;
  84. }
  85. public char BeginToken()
  86. {
  87. tokenStart = bufferPosition;
  88. return ReadChar();
  89. }
  90. public void  Backup(int amount)
  91. {
  92. bufferPosition -= amount;
  93. }
  94. public System.String GetImage()
  95. {
  96. return new System.String(buffer, tokenStart, bufferPosition - tokenStart);
  97. }
  98. public char[] GetSuffix(int len)
  99. {
  100. char[] value_Renamed = new char[len];
  101. Array.Copy(buffer, bufferPosition - len, value_Renamed, 0, len);
  102. return value_Renamed;
  103. }
  104. public void  Done()
  105. {
  106. try
  107. {
  108. input.Close();
  109. }
  110. catch (System.IO.IOException e)
  111. {
  112. System.Console.Error.WriteLine("Caught: " + e + "; ignoring.");
  113. }
  114. }
  115. public int GetColumn()
  116. {
  117. return bufferStart + bufferPosition;
  118. }
  119. public int GetLine()
  120. {
  121. return 1;
  122. }
  123. public int GetEndColumn()
  124. {
  125. return bufferStart + bufferPosition;
  126. }
  127. public int GetEndLine()
  128. {
  129. return 1;
  130. }
  131. public int GetBeginColumn()
  132. {
  133. return bufferStart + tokenStart;
  134. }
  135. public int GetBeginLine()
  136. {
  137. return 1;
  138. }
  139. }
  140. }