2 // Author: Sergey Chaban (serge@wildwestsoftware.com)
\r
7 using System.Collections;
\r
9 namespace Mono.ILASM {
\r
14 public class ILReader {
\r
16 private StreamReader reader;
\r
17 private Stack putback_stack;
\r
18 private Location location;
\r
19 private Location markedLocation;
\r
21 public ILReader (StreamReader reader)
\r
23 this.reader = reader;
\r
24 putback_stack = new Stack ();
\r
26 location = new Location ();
\r
27 markedLocation = Location.Unknown;
\r
34 public Location Location {
\r
42 /// Provides access to underlying StreamReader.
\r
44 public StreamReader BaseReader {
\r
50 private int DoRead ()
\r
52 if (putback_stack.Count > 0)
\r
53 return (char) putback_stack.Pop ();
\r
55 return reader.Read ();
\r
58 private int DoPeek ()
\r
60 if (putback_stack.Count > 0)
\r
61 return (char) putback_stack.Peek ();
\r
63 return reader.Peek ();
\r
68 /// <returns></returns>
\r
71 int read = DoRead ();
\r
73 location.NewLine ();
\r
75 location.NextColumn ();
\r
81 /// <returns></returns>
\r
90 public void Unread (char c)
\r
92 putback_stack.Push (c);
\r
95 location.PreviousLine ();
\r
97 location.PreviousColumn ();
\r
103 /// <param name="chars"></param>
\r
104 public void Unread (char [] chars)
\r
106 for (int i=chars.Length-1; i>=0; i--)
\r
107 Unread (chars[i]);
\r
112 /// <param name="c"></param>
\r
113 public void Unread (int c)
\r
121 public void SkipWhitespace ()
\r
124 for (; ch != -1 && Char.IsWhiteSpace((char) ch); ch = Read ());
\r
125 if (ch != -1) Unread (ch);
\r
131 /// <returns></returns>
\r
132 public string ReadToWhitespace ()
\r
134 StringBuilder sb = new StringBuilder ();
\r
136 for (; ch != -1 && !Char.IsWhiteSpace((char) ch); sb.Append ((char) ch), ch = Read ());
\r
137 if (ch != -1) Unread (ch);
\r
138 return sb.ToString ();
\r
144 public void MarkLocation ()
\r
146 if (markedLocation == Location.Unknown) {
\r
147 markedLocation = new Location (location);
\r
149 markedLocation.CopyFrom (location);
\r
156 public void RestoreLocation ()
\r
158 if (markedLocation != Location.Unknown) {
\r
159 location.CopyFrom (markedLocation);
\r