Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'mcs/ilasm/scanner/ILReader.cs')
-rw-r--r--mcs/ilasm/scanner/ILReader.cs166
1 files changed, 166 insertions, 0 deletions
diff --git a/mcs/ilasm/scanner/ILReader.cs b/mcs/ilasm/scanner/ILReader.cs
new file mode 100644
index 00000000000..72de8861b43
--- /dev/null
+++ b/mcs/ilasm/scanner/ILReader.cs
@@ -0,0 +1,166 @@
+// ILReader.cs
+// Author: Sergey Chaban (serge@wildwestsoftware.com)
+
+using System;
+using System.IO;
+using System.Text;
+using System.Collections;
+
+namespace Mono.ILASM {
+
+
+ /// <summary>
+ /// </summary>
+ public class ILReader {
+
+ private StreamReader reader;
+ private Stack putback_stack;
+ private Location location;
+ private Location markedLocation;
+
+ public ILReader (StreamReader reader)
+ {
+ this.reader = reader;
+ putback_stack = new Stack ();
+
+ location = new Location ();
+ markedLocation = Location.Unknown;
+ }
+
+
+
+ /// <summary>
+ /// </summary>
+ public Location Location {
+ get {
+ return location;
+ }
+ }
+
+
+ /// <summary>
+ /// Provides access to underlying StreamReader.
+ /// </summary>
+ public StreamReader BaseReader {
+ get {
+ return reader;
+ }
+ }
+
+ private int DoRead ()
+ {
+ if (putback_stack.Count > 0)
+ return (char) putback_stack.Pop ();
+
+ return reader.Read ();
+ }
+
+ private int DoPeek ()
+ {
+ if (putback_stack.Count > 0)
+ return (char) putback_stack.Peek ();
+
+ return reader.Peek ();
+ }
+
+ /// <summary>
+ /// </summary>
+ /// <returns></returns>
+ public int Read ()
+ {
+ int read = DoRead ();
+ if (read == '\n')
+ location.NewLine ();
+ else
+ location.NextColumn ();
+ return read;
+ }
+
+ /// <summary>
+ /// </summary>
+ /// <returns></returns>
+ public int Peek ()
+ {
+ return DoPeek ();
+ }
+
+
+ /// <summary>
+ /// </summary>
+ public void Unread (char c)
+ {
+ putback_stack.Push (c);
+
+ if ('\n' == c)
+ location.PreviousLine ();
+
+ location.PreviousColumn ();
+ }
+
+
+ /// <summary>
+ /// </summary>
+ /// <param name="chars"></param>
+ public void Unread (char [] chars)
+ {
+ for (int i=chars.Length-1; i>=0; i--)
+ Unread (chars[i]);
+ }
+
+ /// <summary>
+ /// </summary>
+ /// <param name="c"></param>
+ public void Unread (int c)
+ {
+ Unread ((char)c);
+ }
+
+
+ /// <summary>
+ /// </summary>
+ public void SkipWhitespace ()
+ {
+ int ch = Read ();
+ for (; ch != -1 && Char.IsWhiteSpace((char) ch); ch = Read ());
+ if (ch != -1) Unread (ch);
+ }
+
+
+ /// <summary>
+ /// </summary>
+ /// <returns></returns>
+ public string ReadToWhitespace ()
+ {
+ StringBuilder sb = new StringBuilder ();
+ int ch = Read ();
+ for (; ch != -1 && !Char.IsWhiteSpace((char) ch); sb.Append ((char) ch), ch = Read ());
+ if (ch != -1) Unread (ch);
+ return sb.ToString ();
+ }
+
+
+ /// <summary>
+ /// </summary>
+ public void MarkLocation ()
+ {
+ if (markedLocation == Location.Unknown) {
+ markedLocation = new Location (location);
+ } else {
+ markedLocation.CopyFrom (location);
+ }
+ }
+
+
+ /// <summary>
+ /// </summary>
+ public void RestoreLocation ()
+ {
+ if (markedLocation != Location.Unknown) {
+ location.CopyFrom (markedLocation);
+ }
+ }
+
+ }
+
+}
+