1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * [The "BSD licence"] 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2005-2008 Terence Parr 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * All rights reserved. 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Conversion to C#: 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Copyright (c) 2008-2009 Sam Harwell, Pixel Mine, Inc. 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * All rights reserved. 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Redistribution and use in source and binary forms, with or without 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * modification, are permitted provided that the following conditions 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * are met: 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 1. Redistributions of source code must retain the above copyright 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * notice, this list of conditions and the following disclaimer. 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 2. Redistributions in binary form must reproduce the above copyright 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * notice, this list of conditions and the following disclaimer in the 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * documentation and/or other materials provided with the distribution. 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 3. The name of the author may not be used to endorse or promote products 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * derived from this software without specific prior written permission. 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvernamespace Antlr.Runtime { 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using System.Collections.Generic; 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using ArgumentException = System.ArgumentException; 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using ArgumentOutOfRangeException = System.ArgumentOutOfRangeException; 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver using ArgumentNullException = System.ArgumentNullException; 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * A pretty quick CharStream that pulls all data from an array 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * directly. Every method call counts in the lexer. Java's 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * strings aren't very good so I'm avoiding. 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver [System.Serializable] 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public class ANTLRStringStream : ICharStream { 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>The data being scanned</summary> */ 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected char[] data; 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>How many characters are actually in the buffer</summary> */ 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected int n; 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>0..n-1 index into string of next char</summary> */ 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected int p = 0; 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>line number 1..n within the input</summary> */ 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int line = 1; 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>The index of the character relative to the beginning of the line 0..n-1</summary> */ 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver int charPositionInLine = 0; 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>tracks how deep mark() calls are nested</summary> */ 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected int markDepth = 0; 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * A list of CharStreamState objects that tracks the stream state 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * values line, charPositionInLine, and p that can change as you 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * move through the input stream. Indexed from 1..markDepth. 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * A null is kept @ index 0. Create upon first call to mark(). 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected IList<CharStreamState> markers; 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Track the last mark() call result value for use in rewind().</summary> */ 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected int lastMarker; 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>What is name or source of this char stream?</summary> */ 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public string name; 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>Copy data in string to a local char array</summary> */ 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public ANTLRStringStream(string input) 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : this(input, null) { 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public ANTLRStringStream(string input, string sourceName) 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : this(input.ToCharArray(), input.Length, sourceName) { 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary>This is the preferred constructor as no data is copied</summary> */ 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public ANTLRStringStream(char[] data, int numberOfActualCharsInArray) 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver : this(data, numberOfActualCharsInArray, null) { 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public ANTLRStringStream(char[] data, int numberOfActualCharsInArray, string sourceName) { 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (data == null) 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new ArgumentNullException("data"); 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (numberOfActualCharsInArray < 0) 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new ArgumentOutOfRangeException(); 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (numberOfActualCharsInArray > data.Length) 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new ArgumentException(); 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.data = data; 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.n = numberOfActualCharsInArray; 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.name = sourceName; 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver protected ANTLRStringStream() { 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver this.data = new char[0]; 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Return the current input symbol index 0..n where n indicates the 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * last symbol has been read. The index is the index of char to 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * be returned from LA(1). 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual int Index { 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get { 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return p; 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual int Line { 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get { 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return line; 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver set { 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver line = value; 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual int CharPositionInLine { 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get { 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return charPositionInLine; 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver set { 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver charPositionInLine = value; 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Reset the stream so that it's in the same state it was 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * when the object was created *except* the data array is not 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * touched. 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual void Reset() { 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver p = 0; 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver line = 1; 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver charPositionInLine = 0; 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver markDepth = 0; 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual void Consume() { 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver //System.out.println("prev p="+p+", c="+(char)data[p]); 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (p < n) { 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver charPositionInLine++; 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (data[p] == '\n') { 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver System.out.println("newline char found on line: "+line+ 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver "@ pos="+charPositionInLine); 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver line++; 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver charPositionInLine = 0; 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver p++; 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver //System.out.println("p moves to "+p+" (c='"+(char)data[p]+"')"); 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual int LA(int i) { 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (i == 0) { 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return 0; // undefined 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (i < 0) { 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver i++; // e.g., translate LA(-1) to use offset i=0; then data[p+0-1] 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ((p + i - 1) < 0) { 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return CharStreamConstants.EndOfFile; // invalid; no char before first char 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ((p + i - 1) >= n) { 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver //System.out.println("char LA("+i+")=EOF; p="+p); 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return CharStreamConstants.EndOfFile; 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver //System.out.println("char LA("+i+")="+(char)data[p+i-1]+"; p="+p); 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver //System.out.println("LA("+i+"); p="+p+" n="+n+" data.length="+data.length); 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return data[p + i - 1]; 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual int LT(int i) { 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return LA(i); 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual int Count { 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get { 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return n; 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual int Mark() { 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (markers == null) { 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver markers = new List<CharStreamState>(); 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver markers.Add(null); // depth 0 means no backtracking, leave blank 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver markDepth++; 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CharStreamState state = null; 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (markDepth >= markers.Count) { 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver state = new CharStreamState(); 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver markers.Add(state); 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } else { 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver state = markers[markDepth]; 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver state.p = p; 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver state.line = line; 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver state.charPositionInLine = charPositionInLine; 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver lastMarker = markDepth; 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return markDepth; 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual void Rewind(int m) { 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (m < 0) 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new ArgumentOutOfRangeException(); 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver //if (m > markDepth) 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // throw new ArgumentException(); 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver CharStreamState state = markers[m]; 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // restore stream state 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Seek(state.p); 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver line = state.line; 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver charPositionInLine = state.charPositionInLine; 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Release(m); 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual void Rewind() { 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Rewind(lastMarker); 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual void Release(int marker) { 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // unwind any other markers made after m and release m 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver markDepth = marker; 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // release this marker 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver markDepth--; 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** <summary> 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * consume() ahead until p==index; can't just set p=index as we must 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * update line and charPositionInLine. 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * </summary> 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual void Seek(int index) { 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (index <= p) { 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver p = index; // just jump; don't update stream state (line, ...) 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // seek forward, consume until p hits index 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while (p < index) { 257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver Consume(); 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual string Substring(int start, int length) { 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (start < 0) 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new ArgumentOutOfRangeException(); 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (length < 0) 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new ArgumentOutOfRangeException(); 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (start + length > data.Length) 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver throw new ArgumentException(); 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (length == 0) 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return string.Empty; 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return new string(data, start, length); 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public virtual string SourceName { 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver get { 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return name; 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver public override string ToString() { 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return new string(data); 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 286