blob: b1514066904a11c8e69bae2d0cba5769faa4de79 [file] [log] [blame] [raw]
//
// CilWriter.cs
//
// Author:
// Jb Evain (jbevain@gmail.com)
//
// (C) 2005 Jb Evain
//
// Permission is hereby granted, free of charge, to any person obtaining
// a copy of this software and associated documentation files (the
// "Software"), to deal in the Software without restriction, including
// without limitation the rights to use, copy, modify, merge, publish,
// distribute, sublicense, and/or sell copies of the Software, and to
// permit persons to whom the Software is furnished to do so, subject to
// the following conditions:
//
// The above copyright notice and this permission notice shall be
// included in all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
namespace Mono.Disassembler {
using System;
using System.IO;
using System.Text;
using Mono.Cecil;
class CilWriter : TextWriter {
TextWriter m_writer;
int m_indentLevel = 0;
bool new_line = true;
public TextWriter BaseWriter {
get { return m_writer; }
}
public override Encoding Encoding {
get { return m_writer.Encoding; }
}
public CilWriter (TextWriter writer)
{
m_writer = writer;
}
public void Indent ()
{
m_indentLevel++;
}
public void Unindent ()
{
m_indentLevel--;
}
void WriteIndent ()
{
if (!new_line) {
m_writer.Write (" ");
return;
}
for (int i = 0; i < m_indentLevel; i++)
m_writer.Write (" ");
new_line = false;
}
public override void Write (ulong value)
{
WriteIndent ();
m_writer.Write (value);
}
public override void Write (int value)
{
WriteIndent ();
m_writer.Write (value);
}
public override void Write (string value)
{
WriteIndent ();
m_writer.Write (value);
}
public override void Write (string format, object arg0, object arg1, object arg2)
{
WriteIndent ();
m_writer.Write (format, arg0, arg1, arg2);
}
public override void Write (double value)
{
WriteIndent ();
m_writer.Write (value);
}
public override void Write (string format, object arg0, object arg1)
{
WriteIndent ();
m_writer.Write (format, arg0, arg1);
}
public override void Write (object value)
{
WriteIndent ();
m_writer.Write (value);
}
public override void Write (char [] buffer, int index, int count)
{
WriteIndent ();
m_writer.Write (buffer, index, count);
}
public override void Write (char value)
{
WriteIndent ();
m_writer.Write (value);
}
public override void Write (bool value)
{
WriteIndent ();
m_writer.Write (value);
}
public override void Write (long value)
{
WriteIndent ();
m_writer.Write (value);
}
public override void Write (char [] value)
{
WriteIndent ();
m_writer.Write (value);
}
public override void Write (float value)
{
WriteIndent ();
m_writer.Write (value);
}
public override void Write (decimal value)
{
WriteIndent ();
m_writer.Write (value);
}
public override void Write (string format, object [] arg)
{
WriteIndent ();
m_writer.Write (format, arg);
}
public override void Write (uint value)
{
WriteIndent ();
m_writer.Write (value);
}
public override void Write (string format, object arg0)
{
WriteIndent ();
m_writer.Write (format, arg0);
}
public override void WriteLine (object value)
{
WriteIndent ();
m_writer.WriteLine (value);
new_line = true;
}
public override void WriteLine (char [] buffer, int index, int count)
{
WriteIndent ();
m_writer.WriteLine (buffer, index, count);
new_line = true;
}
public override void WriteLine (ulong value)
{
WriteIndent ();
m_writer.WriteLine (value);
new_line = true;
}
public override void WriteLine (char value)
{
WriteIndent ();
m_writer.WriteLine (value);
new_line = true;
}
public override void WriteLine (double value)
{
WriteIndent ();
m_writer.WriteLine (value);
new_line = true;
}
public override void WriteLine (int value)
{
WriteIndent ();
m_writer.WriteLine (value);
new_line = true;
}
public override void WriteLine (float value)
{
WriteIndent ();
m_writer.WriteLine (value);
new_line = true;
}
public override void WriteLine (uint value)
{
WriteIndent ();
m_writer.WriteLine (value);
new_line = true;
}
public override void WriteLine (string format, object arg0, object arg1, object arg2)
{
WriteIndent ();
m_writer.WriteLine (format, arg0, arg1, arg2);
new_line = true;
}
public override void WriteLine (long value)
{
WriteIndent ();
m_writer.WriteLine (value);
new_line = true;
}
public override void WriteLine (string format, object arg0)
{
WriteIndent ();
m_writer.WriteLine (format, arg0);
new_line = true;
}
public override void WriteLine (string format, object [] arg)
{
WriteIndent ();
m_writer.WriteLine (format, arg);
new_line = true;
}
public override void WriteLine (bool value)
{
WriteIndent ();
m_writer.WriteLine (value);
new_line = true;
}
public override void WriteLine (string format, object arg0, object arg1)
{
WriteIndent ();
m_writer.WriteLine (format, arg0, arg1);
new_line = true;
}
public override void WriteLine (decimal value)
{
WriteIndent ();
m_writer.WriteLine (value);
new_line = true;
}
public override void WriteLine (char [] value)
{
WriteIndent ();
m_writer.WriteLine (value);
new_line = true;
}
public override void WriteLine (string value)
{
WriteIndent ();
m_writer.WriteLine (value);
new_line = true;
}
public override void WriteLine ()
{
m_writer.WriteLine ();
new_line = true;
}
public void Write (byte [] ary)
{
m_writer.WriteLine ("(");
new_line = true;
Indent ();
WriteIndent ();
for (int i = 0; i < ary.Length; i++) {
if (i > 0 && i % 16 == 0) {
WriteLine ();
WriteIndent ();
} else
m_writer.Write (" ");
m_writer.Write (ary [i].ToString ("x2"));
}
WriteLine ();
Unindent ();
WriteLine (")");
}
public void OpenBlock ()
{
WriteLine ("{");
Indent ();
}
public void CloseBlock ()
{
Unindent ();
WriteLine ("}");
}
public void WriteFlags (int value, int [] vals, string [] map)
{
for (int i = 0; i < vals.Length; i++)
if ((value & vals [i]) > 0 || (vals [i] == 0 && value == 0)) {
m_writer.Write (map [i]);
m_writer.Write (" ");
}
}
public void WriteFlags (int value, int mask, int [] vals, string [] map)
{
int v = value & mask;
for (int i = 0; i < vals.Length; i++)
if (v == vals [i]) {
m_writer.Write (map [i]);
m_writer.Write (" ");
return;
}
}
public override void Close ()
{
m_writer.Close ();
}
public override string ToString ()
{
return m_writer.ToString ();
}
}
}