Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

167 lines
2.9 KiB
C#

// 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);
}
}
}
}