2010-05-19 Jb Evain <jbevain@novell.com>
[mcs.git] / ilasm / scanner / ILReader.cs
blob72de8861b43b60d94885fb030409528ebda02350
1 // ILReader.cs
2 // Author: Sergey Chaban (serge@wildwestsoftware.com)
4 using System;
5 using System.IO;
6 using System.Text;
7 using System.Collections;
9 namespace Mono.ILASM {
12 /// <summary>
13 /// </summary>
14 public class ILReader {
16 private StreamReader reader;
17 private Stack putback_stack;
18 private Location location;
19 private Location markedLocation;
21 public ILReader (StreamReader reader)
23 this.reader = reader;
24 putback_stack = new Stack ();
26 location = new Location ();
27 markedLocation = Location.Unknown;
32 /// <summary>
33 /// </summary>
34 public Location Location {
35 get {
36 return location;
41 /// <summary>
42 /// Provides access to underlying StreamReader.
43 /// </summary>
44 public StreamReader BaseReader {
45 get {
46 return reader;
50 private int DoRead ()
52 if (putback_stack.Count > 0)
53 return (char) putback_stack.Pop ();
55 return reader.Read ();
58 private int DoPeek ()
60 if (putback_stack.Count > 0)
61 return (char) putback_stack.Peek ();
63 return reader.Peek ();
66 /// <summary>
67 /// </summary>
68 /// <returns></returns>
69 public int Read ()
71 int read = DoRead ();
72 if (read == '\n')
73 location.NewLine ();
74 else
75 location.NextColumn ();
76 return read;
79 /// <summary>
80 /// </summary>
81 /// <returns></returns>
82 public int Peek ()
84 return DoPeek ();
88 /// <summary>
89 /// </summary>
90 public void Unread (char c)
92 putback_stack.Push (c);
94 if ('\n' == c)
95 location.PreviousLine ();
97 location.PreviousColumn ();
101 /// <summary>
102 /// </summary>
103 /// <param name="chars"></param>
104 public void Unread (char [] chars)
106 for (int i=chars.Length-1; i>=0; i--)
107 Unread (chars[i]);
110 /// <summary>
111 /// </summary>
112 /// <param name="c"></param>
113 public void Unread (int c)
115 Unread ((char)c);
119 /// <summary>
120 /// </summary>
121 public void SkipWhitespace ()
123 int ch = Read ();
124 for (; ch != -1 && Char.IsWhiteSpace((char) ch); ch = Read ());
125 if (ch != -1) Unread (ch);
129 /// <summary>
130 /// </summary>
131 /// <returns></returns>
132 public string ReadToWhitespace ()
134 StringBuilder sb = new StringBuilder ();
135 int ch = Read ();
136 for (; ch != -1 && !Char.IsWhiteSpace((char) ch); sb.Append ((char) ch), ch = Read ());
137 if (ch != -1) Unread (ch);
138 return sb.ToString ();
142 /// <summary>
143 /// </summary>
144 public void MarkLocation ()
146 if (markedLocation == Location.Unknown) {
147 markedLocation = new Location (location);
148 } else {
149 markedLocation.CopyFrom (location);
154 /// <summary>
155 /// </summary>
156 public void RestoreLocation ()
158 if (markedLocation != Location.Unknown) {
159 location.CopyFrom (markedLocation);