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.Analysis.Standard
  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 = input.Read(buffer, newPosition, buffer.Length - newPosition);
  72. if (charsRead <= 0)
  73. throw new System.IO.IOException("read past eof");
  74. else
  75. bufferLength += charsRead;
  76. }
  77. public char BeginToken()
  78. {
  79. tokenStart = bufferPosition;
  80. return ReadChar();
  81. }
  82. public void  Backup(int amount)
  83. {
  84. bufferPosition -= amount;
  85. }
  86. public System.String GetImage()
  87. {
  88. return new System.String(buffer, tokenStart, bufferPosition - tokenStart);
  89. }
  90. public char[] GetSuffix(int len)
  91. {
  92. char[] value_Renamed = new char[len];
  93. Array.Copy(buffer, bufferPosition - len, value_Renamed, 0, len);
  94. return value_Renamed;
  95. }
  96. public void  Done()
  97. {
  98. try
  99. {
  100. input.Close();
  101. }
  102. catch (System.IO.IOException e)
  103. {
  104. System.Console.Error.WriteLine("Caught: " + e + "; ignoring.");
  105. }
  106. }
  107. public int GetColumn()
  108. {
  109. return bufferStart + bufferPosition;
  110. }
  111. public int GetLine()
  112. {
  113. return 1;
  114. }
  115. public int GetEndColumn()
  116. {
  117. return bufferStart + bufferPosition;
  118. }
  119. public int GetEndLine()
  120. {
  121. return 1;
  122. }
  123. public int GetBeginColumn()
  124. {
  125. return bufferStart + tokenStart;
  126. }
  127. public int GetBeginLine()
  128. {
  129. return 1;
  130. }
  131. }
  132. }