Skip to content

Commit

Permalink
initial commit
Browse files Browse the repository at this point in the history
  • Loading branch information
jbevain committed Nov 10, 2011
0 parents commit 4a27339
Show file tree
Hide file tree
Showing 20 changed files with 3,107 additions and 0 deletions.
164 changes: 164 additions & 0 deletions Mono.Assembler/ILReader.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,164 @@
// ILReader.cs
// Author: Sergey Chaban ([email protected])

using System;
using System.IO;
using System.Text;
using System.Collections;

namespace Mono.Assembler
{
/// <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);
}
}
}
}

Loading

0 comments on commit 4a27339

Please sign in to comment.