All pastes #21740 Raw Edit

Mine

public text v1 · immutable
#21740 ·published 2005-08-31 15:33 UTC
rendered paste body
private void InitializeComponent()
		{
			this.FunctionsTable = new System.Data.DataTable();
			this.colFnAddressID = new System.Data.DataColumn();
			this.colName = new System.Data.DataColumn();
			this.colComment = new System.Data.DataColumn();
			this.colObject = new System.Data.DataColumn();
			this.colFunctionID = new System.Data.DataColumn();
			this.colQuality = new System.Data.DataColumn();
			this.colFunctionAddressTimeShift = new System.Data.DataColumn();
			this.AddressesTable = new System.Data.DataTable();
			this.colAddressID = new System.Data.DataColumn();
			this.colValue = new System.Data.DataColumn();
			this.colTimeShift = new System.Data.DataColumn();
			this.colAddressObject = new System.Data.DataColumn();
			this.colAddressName = new System.Data.DataColumn();
			this.InstructionsTable = new System.Data.DataTable();
			this.colInstructionAddress = new System.Data.DataColumn();
			this.colFnID = new System.Data.DataColumn();
			this.colInstructionObject = new System.Data.DataColumn();
			this.colInstructionComment = new System.Data.DataColumn();
			this.colInstructionID = new System.Data.DataColumn();
			this.colBranchToSub = new System.Data.DataColumn();
			this.colIsBranch = new System.Data.DataColumn();
			this.colAddressTimeShift = new System.Data.DataColumn();
			this.OperandsTable = new System.Data.DataTable();
			this.colOperandID = new System.Data.DataColumn();
			this.colOperandObject = new System.Data.DataColumn();
			this.colOperandOrder = new System.Data.DataColumn();
			this.colOperandInstructionID = new System.Data.DataColumn();
			((System.ComponentModel.ISupportInitialize)(this.FunctionsTable)).BeginInit();
			((System.ComponentModel.ISupportInitialize)(this.AddressesTable)).BeginInit();
			((System.ComponentModel.ISupportInitialize)(this.InstructionsTable)).BeginInit();
			((System.ComponentModel.ISupportInitialize)(this.OperandsTable)).BeginInit();
			((System.ComponentModel.ISupportInitialize)(this)).BeginInit();
			// 
			// FunctionsTable
			// 
			this.FunctionsTable.Columns.AddRange(new System.Data.DataColumn[] {
																				  this.colFnAddressID,
																				  this.colName,
																				  this.colComment,
																				  this.colObject,
																				  this.colFunctionID,
																				  this.colQuality,
																				  this.colFunctionAddressTimeShift});
			this.FunctionsTable.Constraints.AddRange(new System.Data.Constraint[] {
																					  new System.Data.UniqueConstraint("Constraint1", new string[] {
																																					   "FunctionID"}, true),
																					  new System.Data.UniqueConstraint("Constraint3", new string[] {
																																					   "Name"}, false)});
			this.FunctionsTable.Namespace = "KlaunmoetD.Core";
			this.FunctionsTable.PrimaryKey = new System.Data.DataColumn[] {
																			  this.colFunctionID};
			this.FunctionsTable.TableName = "Functions";
			// 
			// colFnAddressID
			// 
			this.colFnAddressID.AllowDBNull = false;
			this.colFnAddressID.ColumnName = "AddressValue";
			this.colFnAddressID.DataType = typeof(long);
			// 
			// colName
			// 
			this.colName.ColumnName = "Name";
			// 
			// colComment
			// 
			this.colComment.Caption = "Comment";
			this.colComment.ColumnName = "Comment";
			// 
			// colObject
			// 
			this.colObject.AllowDBNull = false;
			this.colObject.ColumnName = "Object";
			this.colObject.DataType = typeof(KlaunmoetD.Core.Function);
			// 
			// colFunctionID
			// 
			this.colFunctionID.AllowDBNull = false;
			this.colFunctionID.AutoIncrement = true;
			this.colFunctionID.ColumnName = "FunctionID";
			this.colFunctionID.DataType = typeof(long);
			// 
			// colQuality
			// 
			this.colQuality.AllowDBNull = false;
			this.colQuality.ColumnName = "Quality";
			this.colQuality.DataType = typeof(int);
			// 
			// colFunctionAddressTimeShift
			// 
			this.colFunctionAddressTimeShift.AllowDBNull = false;
			this.colFunctionAddressTimeShift.ColumnName = "AddressTimeShift";
			this.colFunctionAddressTimeShift.DataType = typeof(int);
			// 
			// AddressesTable
			// 
			this.AddressesTable.Columns.AddRange(new System.Data.DataColumn[] {
																				  this.colAddressID,
																				  this.colValue,
																				  this.colTimeShift,
																				  this.colAddressObject,
																				  this.colAddressName});
			this.AddressesTable.Constraints.AddRange(new System.Data.Constraint[] {
																					  new System.Data.UniqueConstraint("UniqueAddressNameConstraint", new string[] {
																																									   "Name"}, false),
																					  new System.Data.UniqueConstraint("Constraint1", new string[] {
																																					   "AddressID"}, true)});
			this.AddressesTable.PrimaryKey = new System.Data.DataColumn[] {
																			  this.colAddressID};
			this.AddressesTable.TableName = "Addresses";
			// 
			// colAddressID
			// 
			this.colAddressID.AllowDBNull = false;
			this.colAddressID.AutoIncrement = true;
			this.colAddressID.ColumnName = "AddressID";
			this.colAddressID.DataType = typeof(long);
			this.colAddressID.ReadOnly = true;
			// 
			// colValue
			// 
			this.colValue.ColumnName = "Value";
			this.colValue.DataType = typeof(long);
			// 
			// colTimeShift
			// 
			this.colTimeShift.ColumnName = "TimeShift";
			this.colTimeShift.DataType = typeof(int);
			// 
			// colAddressObject
			// 
			this.colAddressObject.ColumnName = "Object";
			this.colAddressObject.DataType = typeof(KlaunmoetD.Core.Address);
			// 
			// colAddressName
			// 
			this.colAddressName.ColumnName = "Name";
			// 
			// InstructionsTable
			// 
			this.InstructionsTable.Columns.AddRange(new System.Data.DataColumn[] {
																					 this.colInstructionAddress,
																					 this.colFnID,
																					 this.colInstructionObject,
																					 this.colInstructionComment,
																					 this.colInstructionID,
																					 this.colBranchToSub,
																					 this.colIsBranch,
																					 this.colAddressTimeShift});
			this.InstructionsTable.Constraints.AddRange(new System.Data.Constraint[] {
																						 new System.Data.UniqueConstraint("Constraint1", new string[] {
																																						  "AddressTimeShift",
																																						  "AddressValue",
																																						  "FunctionID"}, true)});
			this.InstructionsTable.PrimaryKey = new System.Data.DataColumn[] {
																				 this.colAddressTimeShift,
																				 this.colInstructionAddress,
																				 this.colFnID};
			this.InstructionsTable.TableName = "Instructions";
			// 
			// colInstructionAddress
			// 
			this.colInstructionAddress.AllowDBNull = false;
			this.colInstructionAddress.ColumnName = "AddressValue";
			this.colInstructionAddress.DataType = typeof(long);
			// 
			// colFnID
			// 
			this.colFnID.AllowDBNull = false;
			this.colFnID.Caption = "FunctionID";
			this.colFnID.ColumnName = "FunctionID";
			this.colFnID.DataType = typeof(long);
			// 
			// colInstructionObject
			// 
			this.colInstructionObject.ColumnName = "Object";
			this.colInstructionObject.DataType = typeof(KlaunmoetD.Core.IInstruction);
			// 
			// colInstructionComment
			// 
			this.colInstructionComment.ColumnName = "Comment";
			// 
			// colInstructionID
			// 
			this.colInstructionID.AllowDBNull = false;
			this.colInstructionID.AutoIncrement = true;
			this.colInstructionID.ColumnName = "InstructionID";
			this.colInstructionID.DataType = typeof(long);
			// 
			// colBranchToSub
			// 
			this.colBranchToSub.AllowDBNull = false;
			this.colBranchToSub.ColumnName = "isBranchToSub";
			this.colBranchToSub.DataType = typeof(bool);
			// 
			// colIsBranch
			// 
			this.colIsBranch.AllowDBNull = false;
			this.colIsBranch.ColumnName = "isBranch";
			this.colIsBranch.DataType = typeof(bool);
			// 
			// colAddressTimeShift
			// 
			this.colAddressTimeShift.AllowDBNull = false;
			this.colAddressTimeShift.ColumnName = "AddressTimeShift";
			this.colAddressTimeShift.DataType = typeof(int);
			// 
			// OperandsTable
			// 
			this.OperandsTable.Columns.AddRange(new System.Data.DataColumn[] {
																				 this.colOperandID,
																				 this.colOperandObject,
																				 this.colOperandOrder,
																				 this.colOperandInstructionID});
			this.OperandsTable.Constraints.AddRange(new System.Data.Constraint[] {
																					 new System.Data.UniqueConstraint("Constraint1", new string[] {
																																					  "OperandID"}, true)});
			this.OperandsTable.PrimaryKey = new System.Data.DataColumn[] {
																			 this.colOperandID};
			this.OperandsTable.TableName = "Operands";
			// 
			// colOperandID
			// 
			this.colOperandID.AllowDBNull = false;
			this.colOperandID.AutoIncrement = true;
			this.colOperandID.ColumnName = "OperandID";
			this.colOperandID.DataType = typeof(int);
			// 
			// colOperandObject
			// 
			this.colOperandObject.ColumnName = "Object";
			this.colOperandObject.DataType = typeof(object);
			// 
			// colOperandOrder
			// 
			this.colOperandOrder.AllowDBNull = false;
			this.colOperandOrder.ColumnName = "OperandOrder";
			this.colOperandOrder.DataType = typeof(short);
			// 
			// colOperandInstructionID
			// 
			this.colOperandInstructionID.AllowDBNull = false;
			this.colOperandInstructionID.ColumnName = "InstructionID";
			// 
			// CodeSet
			// 
			this.Relations.AddRange(new System.Data.DataRelation[] {
																	   new System.Data.DataRelation("Instruction2Function", "Functions", "Instructions", new string[] {
																																										  "FunctionID"}, new string[] {
																																																		  "FunctionID"}, false)});
			this.Tables.AddRange(new System.Data.DataTable[] {
																 this.FunctionsTable,
																 this.AddressesTable,
																 this.InstructionsTable,
																 this.OperandsTable});
			((System.ComponentModel.ISupportInitialize)(this.FunctionsTable)).EndInit();
			((System.ComponentModel.ISupportInitialize)(this.AddressesTable)).EndInit();
			((System.ComponentModel.ISupportInitialize)(this.InstructionsTable)).EndInit();
			((System.ComponentModel.ISupportInitialize)(this.OperandsTable)).EndInit();
			((System.ComponentModel.ISupportInitialize)(this)).EndInit();

		}

// -------- Full class for context ---------


//   KlaunmoetD - The 0x90.org disassembler.
//   This software is Copyright (C) 2005  jaynus, 0x90.org
//   $Id: CodeSet.cs,v 1.13 2005/08/15 19:52:11 nummish Exp $
//
//   This program is free software; you can redistribute it and/or modify
//   it under the terms of the GNU General Public License as published by
//   the Free Software Foundation; either version 2 of the License, or
//   (at your option) any later version.
//
//   This program is distributed in the hope that it will be useful,
//   but WITHOUT ANY WARRANTY; without even the implied warranty of
//   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//   GNU General Public License for more details.
//
//   You should have received a copy of the GNU General Public License
//   along with this program; if not, write to the Free Software
//   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

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

/*
Addresses - 
	Id
	Address object
Functions - 
	Address id 
	Name
	Comment
	Function Object
	Instructions Address Id Array
Instructions - 
*/
namespace KlaunmoetD.Core
{
	/// <summary>Implementation of Dataset for storing and accessing disassembly structures.</summary> 
	public class CodeSet : DataSet 
	{
		private System.Data.DataTable FunctionsTable;
		private System.Data.DataColumn colName;
		private System.Data.DataColumn colComment;
		private System.Data.DataColumn colObject;
		private System.Data.DataTable AddressesTable;
		private System.Data.DataColumn colValue;
		private System.Data.DataColumn colTimeShift;
		private System.Data.DataColumn colAddressObject;
		private System.Data.DataTable InstructionsTable;
		private System.Data.DataColumn colInstructionAddress;
		private System.Data.DataColumn colInstructionObject;
		private System.Data.DataColumn colFnAddressID;
		private System.Data.DataColumn colAddressID;
		private System.Data.DataColumn colAddressName;
		private System.Data.DataColumn colFunctionID;
		private System.Data.DataColumn colQuality;
		private System.Data.DataColumn colInstructionComment;
		private System.Data.DataTable OperandsTable;
		private System.Data.DataColumn colOperandID;
		private System.Data.DataColumn colInstructionID;
		private System.Data.DataColumn colOperandObject;
		private System.Data.DataColumn colOperandInstructionID;
		private System.Data.DataColumn colBranchToSub;
		private System.Data.DataColumn colIsBranch;
		private System.Data.DataColumn colOperandOrder;
		private System.Data.DataColumn colAddressTimeShift;
		private System.Data.DataColumn colFunctionAddressTimeShift;
		private System.Data.DataColumn colFnID;
	 
		private static CodeSet _SingletonInstance;

		#region Public Properties

		// TODO: We need to make this check referencing and stuff later, because these counts arnt the actual decompiled counts,
		//       They are just table counts, which are *wrong* because we do relational unique references.
		
		/// <value>Returns the current number of addresses within this dissasembly dataset.</value>
		public long AddressCount 
		{ 
			get { return(Tables["Addresses"].Rows.Count); }
		}
		/// <value>Returns the current number of functions within this dissasembly dataset.</value>
		public long FunctionCount 
		{ 
			get { return(Tables["Functions"].Rows.Count); }
		}
		/// <value>Returns the current number of instructions within this dissasembly dataset.</value>
		public long InstructionCount 
		{ 
			get { return(Tables["Instructions"].Rows.Count); }
		}
		/// <value>Returns the current number of operands within this dissasembly dataset.</value>
		public long OperandCount 
		{ 
			get { return(Tables["Operands"].Rows.Count); }
		}


		#endregion

		#region Private Members

		#endregion

		#region Constructor - Disposal

		/// <summary>CodeSet constructor</summary>
		public CodeSet()  
		{
			// This is the autogenerated stuff.. conflicts a bunch, but is easier to trace via the IDE
			InitializeComponent(); 												
		}


		#endregion

		#region Public Methods
	
		#region Add Methods

		public DataRow FindFunction(Address FunctionAddress)
		{		 
			DataRow[] Functions = Tables["Functions"].Select("AddressValue=" + FunctionAddress.Value.ToString() + " AND AddressTimeShift=" + FunctionAddress.TimeShift.ToString());
			
			if (Functions.Length == 0)
				return null;
			else
				return Functions[0];
		}

		/// <summary>Adds a single instance of a Function to this dataset. 
		/// (DOES NOT ADD INSTRUCTIONS YET)</summary>
		/// <remarks>Adds all required address and relational references, as well as duplicate checking and Address 
		/// re-referencing for already existant addresses. Duplicate checking and working (timeshifting) and Address 
		/// referencing needs reworking.</remarks>
		/// <param name="function">The instance of Function from the decompiled code to add to this instance.</param>
		/// <returns>Returns the number of instances successfully added to the dataset, or 0 on error.</returns>
		private int AddFunction(Function function) 
		{ 
			DataRow AddressRow, _functionRow;
			if(function.VirtualAddress == null)
				return(0);
			 
			// Check if it exist in function or address, if its in address, just insert to function, if in function, die.
			if (FindFunction(function.VirtualAddress) != null)
				return(0);
				
			_functionRow = Tables["Functions"].NewRow();
				
			AddressRow = AddAddress(function.VirtualAddress);		
			_functionRow.SetParentRow(AddressRow);
	 
			if (function.Name.Length > 0)
				_functionRow["Name"] = function.Name;
			else
				_functionRow["Name"] = System.DBNull.Value;
				
			_functionRow["Comment"] = function.Comment;
			_functionRow["Quality"] = function.Quality;
			_functionRow["Object"] = function;
			_functionRow["AddressValue"] = function.VirtualAddress.Value;
			_functionRow["AddressTimeShift"] = function.VirtualAddress.TimeShift;

			Tables["Functions"].Rows.Add(_functionRow);
		   
			return(1);
		}

		public int UpdateFunction(Function WorkingFunction)
		{
			DataRow FunctionRow = FindFunction(WorkingFunction.VirtualAddress);

			if (FunctionRow == null)
				return AddFunction(WorkingFunction);
			
			FunctionRow.BeginEdit();
			
			if (WorkingFunction.Name.Length > 0)
				FunctionRow["Name"] = WorkingFunction.Name;
			else
				FunctionRow["Name"] = System.DBNull.Value;
				
			FunctionRow["Comment"] = WorkingFunction.Comment;
			FunctionRow["Quality"] = WorkingFunction.Quality;
			FunctionRow["Object"] = WorkingFunction;

			FunctionRow.EndEdit();

			return 1;
		}

		
		/// <summary>Adds an array of IFunction instances to this dataset. 
		/// (DOES NOT ADD INSTRUCTIONS YET)</summary>
		/// <remarks>Adds all required address and relational references, as well as duplicate checking and Address 
		/// re-referencing for already existant addresses. Duplicate checking and working (timeshifting) and Address 
		/// referencing needs reworking.</remarks>
		/// <param name="functionArray">The array of IFunction instances to add to this dataset.</param>
		/// <returns>Returns the number of instances successfully added to the dataset, or 0 on error.</returns>
		public int AddFunction(Function[] functionArray) 
		{ 
			int x = 1;
			foreach(Function _func in functionArray) 
				if(AddFunction(_func) > 0)
					x++;

			return(x);
		}

		private string InstructionFunctionSelect(Address FunctionAddress)
		{
			StringBuilder sb = new StringBuilder();
			sb.Append("Parent(Instruction2Function).FunctionID=").Append(FindFunction(FunctionAddress)["FunctionID"]);

			return sb.ToString();	
		}

		private string InstructionAddressSelect(Address InstructionAddress)
		{
			StringBuilder sb = new StringBuilder();
			sb.Append("AddressValue=").Append(InstructionAddress.Value.ToString());
			sb.Append(" AND AddressTimeShift=").Append(InstructionAddress.TimeShift.ToString());

			return sb.ToString();	
		}

		private string UniqueInstructionSelect(Address FunctionAddress, Address InstructionAddress)
		{
			StringBuilder sb = new StringBuilder();

			sb.Append(InstructionAddressSelect(InstructionAddress)).Append(" AND "); 
			sb.Append(InstructionFunctionSelect(FunctionAddress));

			return sb.ToString();
		}

		/// <summary>
		/// This will add an address to the address table
		/// </summary>
		/// <param name="NewAddress">The address to add</param>
		/// <returns>The datarow of the Address in the Address table</returns>
		private DataRow AddAddress(Address NewAddress)
		{
			DataRow AddressRow;

			StringBuilder sb = new StringBuilder();
			sb.Append("Value=").Append(NewAddress.Value.ToString());
			sb.Append(" AND TimeShift=").Append(NewAddress.TimeShift.ToString());

			DataRow[] Addresses = Tables["Addresses"].Select(sb.ToString());

			if(Addresses.Length == 0) 
			{ 
				AddressRow = Tables["Addresses"].NewRow();
					
				AddressRow["Object"] = NewAddress;
				AddressRow["Value"] = NewAddress.Value;
				AddressRow["TimeShift"] = NewAddress.TimeShift;
				AddressRow["Name"] = NewAddress.Name;
				//AddressRow["Comment"] = NewAddress.Name;

				Tables["Addresses"].Rows.Add(AddressRow);				
			}
			else
			{
				AddressRow = Addresses[0];
			}

			return AddressRow;
		}

		public int UpdateInstruction(IInstruction instruction) 
		{
			return UpdateInstruction(-1, instruction);
		}

		public int UpdateInstruction(Int64 FunctionID, IInstruction instruction)
		{ 
			DataRow AddressRow, FunctionRow, InstructionRow;

			DataRow[] Instructions = Tables["Instructions"].Select(InstructionAddressSelect(instruction.VirtualAddress));
            //AddressRow = AddAddress(instruction.VirtualAddress);
		 
			if (FunctionID == -1)
			{
				FunctionRow = FindFunction(instruction.Function);
			
				if (FunctionRow == null)
					throw new ApplicationException("Missing a function while updating an instruction.. didn't think this was possible.");

				FunctionID = (Int64) FunctionRow["FunctionID"];
			}
			if (Instructions.Length == 0 || FunctionID != (Int64) Instructions[0]["FunctionID"])
			{
				//add				

				InstructionRow = Tables["Instructions"].NewRow();				 
				//InstructionRow.SetParentRow(AddressRow);	

				InstructionRow["FunctionID"] = FunctionID;
				InstructionRow["Comment"] = instruction.Comment;
				InstructionRow["Object"] = instruction;
				InstructionRow["isBranchToSub"] = instruction.IsBranchToSub;
				InstructionRow["isBranch"] = instruction.IsBranch;
				InstructionRow["AddressValue"] = instruction.VirtualAddress.Value;
				InstructionRow["AddressTimeShift"] = instruction.VirtualAddress.TimeShift;

				try
				{
					Tables["Instructions"].Rows.Add(InstructionRow);
				}
				catch (System.Data.ConstraintException ce)
				{
					//TODO: Find out why this contraint keeps getting violated.
					int x = 1;
				}
			}
			else
			{				
				// update
				InstructionRow = Instructions[0];

				if ((Int64) InstructionRow["FunctionID"] != FunctionID)
					throw new ApplicationException("Didn't think this was possible");
				else
					return 0;

				InstructionRow.BeginEdit();
	
				InstructionRow["FunctionID"] = FunctionID;		 
				InstructionRow["Comment"] = instruction.Comment;
				InstructionRow["isBranchToSub"] = instruction.IsBranchToSub;
				InstructionRow["Object"] = instruction;

				InstructionRow.EndEdit();
			}
			// We add the operands first so we can null them out before instruction addition.
			// We also propigate the Operand lists.
			// TODO: update operands
						 
			

			return(1);
		}

		/// <summary>Adds a single instance of IInstruction to this dataset. 
		/// (DOES NOT ADD OPERANDS YET)</summary>
		/// <remarks>Adds all required address and relational references, as well as duplicate checking and Address 
		/// re-referencing for already existant addresses. Duplicate checking and working (timeshifting) and Address 
		/// referencing needs reworking.</remarks>
		/// <param name="instruction">The instance of IInstruction from the decompiled code to add to this instance.</param>
		/// <returns>Returns the number of instances successfully added to the dataset, or 0 on error.</returns>
		public int AddInstruction(IInstruction instruction) 
		{ 
			DataRow _addressRow, _instRow;
			  
			_instRow = Tables["Instructions"].NewRow();
 
			_addressRow = AddAddress(instruction.VirtualAddress);	
 
			_instRow.SetParentRow(_addressRow);
 
			_instRow["FunctionAddress"] = instruction.Function;
			_instRow["Name"] = instruction.Name;
			_instRow["Comment"] = instruction.Comment;
			_instRow["Object"] = instruction;
				
			Tables["Functions"].Rows.Add(_instRow);
			 
			return(1);
		}

		/// <summary>Adds an array of IInstruction instances to this dataset. 
		/// (DOES NOT ADD OPERANDS YET)</summary>
		/// <remarks>Adds all required address and relational references, as well as duplicate checking and Address 
		/// re-referencing for already existant addresses. Duplicate checking and working(timeshifting) and Address 
		/// referencing needs reworking.</remarks>
		/// <param name="instructionArray">The array of IInstruction instances to add to this dataset.</param>
		/// <returns>Returns the number of instances successfully added to the dataset, or 0 on error.</returns>
		public int AddInstruction(IInstruction[] instructionArray) 
		{ 
			int x = 1;
			foreach(IInstruction _inst in instructionArray) 
				if(AddInstruction(_inst) > 0)
					x++;

			return(x);
		}

		public int AddInstruction(Function parent, IInstruction[] instructionArray) 
		{ 
			int x = 1;
			foreach(IInstruction _inst in instructionArray) 
			{
				_inst.Function = parent.VirtualAddress;
				if(AddInstruction(_inst) > 0)
					x++;
			}

			return(x);
		}

		public int UpdateInstructions(Function parent, IInstruction[] instructionArray) 
		{ 
			int x = 0;
			Int64 FunctionID = parent.FunctionID;

			foreach(IInstruction _inst in instructionArray) 
			{
				_inst.Function = parent.VirtualAddress;
				if(UpdateInstruction(FunctionID, _inst) > 0)
					x++;
			}
			
			this.AcceptChanges();
			
			return(x);
		}

		/// <summary>Adds a single instance of Operand to this dataset. 
		/// (NOT IMPELEMENTED)</summary>
		/// <remarks></remarks>
		/// <param name="operand">The instance of Operand from the decompiled code to add to this instance.</param>
		/// <returns>Returns the number of instances successfully added to the dataset, or 0 on error.</returns>
		public int AddOperand(Operand operand) 
		{ 
			throw new InvalidOperationException("Method not implemented");
		}

		/// <summary>Adds an array of Operand instances to this dataset. 
		/// (NOT IMPELEMENTED)</summary>
		/// <remarks></remarks>
		/// <param name="operandArray">The array of Operand instances to add to this dataset.</param>
		/// <returns>Returns the number of instances successfully added to the dataset, or 0 on error.</returns>
		public int AddOperand(Operand[] operandArray) 
		{ 
			throw new InvalidOperationException("Method not implemented");
		}


		#endregion

		#region Search Methods

		/// <summary>Searches for Address objects containing the provided absolute address.
		/// (Not Timeshift friendly)</summary>
		/// <param name="address">the absolute address to search for.</param>
		/// <returns>Returns an array of type Address[] with all the Addresses containing the provided absolute address.</returns>
		public Address GetAddress(long address) 
		{ 
			DataRow _Row;

			// Find it.
			if((_Row = Tables["Addresses"].Rows.Find(address)) == null)
				return(null);
			
			return((Address)_Row["Object"]);
		}


		/// <summary>Searches and gets an array of all objects referencing the provided Address object.
		/// (Timeshift friendly)</summary>
		/// <param name="address">The instance of Address to search for.</param>
		/// <returns>Returns an object[] array of all objects referencing provided Address.</returns>
		public object[] GetAtAddress(Address address) 
		{ 
			DataRow _Row;
			ArrayList _ChildRows, _RetList;
			
			// Find it.
			if((_Row = Tables["Addresses"].Rows.Find(address)) == null)
				return(null);
		
			_ChildRows = new ArrayList();
			foreach(DataRelation _Relation in Tables["Addresses"].ChildRelations) 
				_ChildRows.AddRange(_Row.GetChildRows(_Relation));
			
			_RetList = new ArrayList();
			foreach(DataRow _childRow in _ChildRows) 
			{
				if(!_childRow.IsNull("Object"))
					if(_childRow["Object"].GetType() == typeof(Function))
						_RetList.Add((object) GetFunction((Address)_childRow["VirtualAddress"]));
				if(_childRow["Object"].GetType() == typeof(IInstruction))
					_RetList.Add((object) GetInstruction((Address)_childRow["VirtualAddress"]));
				else 
					_RetList.Add((object)_childRow["Object"]);
			}

			_ChildRows = null;
			return((object[])_RetList.ToArray(typeof(object)));
		}

		/// <summary>Searches and gets an array of all objects referencing the provided absolute address. 
		/// (Not Timeshift friendly)</summary>
		/// <param name="address">the type absolute address to search for.</param>
		/// <returns>Returns an object[] array of all objects referencing provided Address.</returns>
		public object[] GetAtAddress(long address) 
		{ 
			DataRow _Row;
			ArrayList _ChildRows, _RetList;
			
			// Find it.
			if((_Row = Tables["Addresses"].Rows.Find(address)) == null)
				return(null);
		
			_ChildRows = new ArrayList();
			foreach(DataRelation _Relation in Tables["Addresses"].ChildRelations) 
				_ChildRows.AddRange(_Row.GetChildRows(_Relation));
			
			_RetList = new ArrayList();
			foreach(DataRow _childRow in _ChildRows) 
			{
				if(!_childRow.IsNull("Object"))
					if(_childRow["Object"].GetType() == typeof(Function))
						_RetList.Add((object) GetFunction((Address)_childRow["VirtualAddress"]));
				if(_childRow["Object"].GetType() == typeof(IInstruction))
					_RetList.Add((object) GetInstruction((Address)_childRow["VirtualAddress"]));
				else 
					_RetList.Add((object)_childRow["Object"]);
			}

			_ChildRows = null;
			return((object[])_RetList.ToArray(typeof(object)));
		}

		
		/// <summary>Searchs for the functions located at the provided address location.</summary>
		/// <param name="address">The instance of Address to search under.</param>
		/// <returns>An Array of type IFunction[] with all the IFunctions at the specified Address, 
		/// or null if none.</returns>
		public Function[] GetFunction(Address address) 
		{ 
//			DataRow _Row;
//			ArrayList _ChildRows, _RetList;
//			
//			// Find it.
//			if((_Row = Tables["Addresses"].Rows.Find(address)) == null)
//				return(null);
//		
//			_ChildRows = new ArrayList();
//			_ChildRows.AddRange(_Row.GetChildRows(GetRelation("Addresses", "Functions")));
//			
//			_RetList = new ArrayList();
//			foreach(DataRow _childRow in _ChildRows)
//				if(!_childRow.IsNull("Object"))
//					_RetList.Add((Function)RebuildFunction(_childRow));
//
//			_ChildRows = null;
//			return((Function[])_RetList.ToArray(typeof(Function[])));
			throw new NotImplementedException("Not really sure I agree with this");
		}

		/// <summary>Searchs for the functions located at the provided address location.</summary>
		/// <param name="address">The absolute address to search under.</param>
		/// <returns>An Array of type IFunction[] with all the IFunctions at the specified address, 
		/// or null if none.</returns>
		public Function[] GetFunction(long address) 
		{ 
//			DataRow _Row;
//			ArrayList _ChildRows, _RetList;
//			
//			// Find it.
//			if((_Row = Tables["Addresses"].Rows.Find(address)) == null)
//				return(null);
//		
//			_ChildRows = new ArrayList();
//			_ChildRows.AddRange(_Row.GetChildRows(GetRelation("Addresses", "Functions")));
//			
//			_RetList = new ArrayList();
//			foreach(DataRow _childRow in _ChildRows)
//				if(!_childRow.IsNull("Object"))
//					_RetList.Add((Function)RebuildFunction(_childRow));
//
//			_ChildRows = null;
//			return((Function[])_RetList.ToArray(typeof(Function[])));
			throw new NotImplementedException("Not really sure I agree with this");
		}

		/// <summary>Searchs for the functions given the specified name</summary>
		/// <param name="name">The name of the custom-named function to search for.</param>
		/// <returns>An Array of type IFunction[] with all the IFunctions at the specified Address, 
		/// or null if none.</returns>
		public Function[] GetFunction(string name) 
		{ 
//			DataRow _Row;
//			ArrayList _ChildRows, _RetList;
//			
//			// Find it.
//			if((_Row = Tables["Addresses"].Rows.Find(name)) == null)
//				return(null);
//		
//			_ChildRows = new ArrayList();
//			_ChildRows.AddRange(_Row.GetChildRows(GetRelation("Addresses", "Functions")));
//			
//			_RetList = new ArrayList();
//			foreach(DataRow _childRow in _ChildRows)
//				if(!_childRow.IsNull("Object"))
//					_RetList.Add((Function)RebuildFunction(_childRow));
//
//			_ChildRows = null;
//			return((Function[])_RetList.ToArray(typeof(Function[])));

			throw new NotImplementedException("Not really sure I agree with this");
		}

		public Queue GetFullCallList()
		{
			
			DataRow[] CallRows = Tables["Instructions"].Select("isBranchToSub=1");
			CallInfo[] RetVal = new CallInfo[CallRows.Length];

			int Counter = 0;
			foreach (DataRow dr in CallRows)
			{
				RetVal[Counter] = new CallInfo((IInstruction) dr["Object"]);
				Counter++;
			}
			
			return new Queue(RetVal);
		}

		public Function[] GetFunctions()
		{
			Function[] RetVal = new Function[Tables["Functions"].Rows.Count];
			int Counter = 0;

			foreach (DataRow Functions in Tables["Functions"].Select("", "AddressTimeShift,AddressValue"))
			{
				RetVal[Counter] = (Function) Functions["Object"];
				Counter++;
			}

			return RetVal;
		}
		
		public IInstruction[] GetInstruction(Address address) 
		{ 
			throw new InvalidOperationException("Method not implemented");
		}
		public IInstruction[] GetInstruction(long address) 
		{ 
			throw new InvalidOperationException("Method not implemented");
		}
		public IInstruction[] GetInstruction(string name) 
		{ 
			throw new InvalidOperationException("Method not implemented");
		}
		public IInstruction[] GetInstruction(Function function) 
		{ 
			throw new InvalidOperationException("Method not implemented");
		}


		#endregion
 
		#region Other

		/// <summary>Generates a templated generic table for this dataset with the provided parameters.</summary>
		/// <param name="tableName">The name of the DataTable to create.</param>
		/// <param name="objectType">The object type that this DataTable will contain in the "Object" column.</param>
		/// <returns>An initialized and constructed generic table for usage.</returns>
		public DataTable GetTemplateTable(string tableName, System.Type objectType) 
		{ 
			DataTable _retTable = new DataTable(tableName);

			// We only add a virtual address if the Object isnt a virtual address.
			if(!objectType.Equals(typeof(Address))) 
				_retTable.Columns.Add(new DataColumn("VirtualAddress", typeof(Address)));
			else 
				_retTable.Columns.Add(new DataColumn("Address", typeof(long)));

			if(objectType.Equals(typeof(IInstruction))) 
				_retTable.Columns.Add(new DataColumn("FunctionAddress", typeof(Address)));
			if(objectType.Equals(typeof(Operand))) 
				_retTable.Columns.Add(new DataColumn("InstructionAddress", typeof(Address)));

			_retTable.Columns.Add(new DataColumn("Name", typeof(string)));
			_retTable.Columns.Add(new DataColumn("Comment", typeof(string)));
			_retTable.Columns.Add(new DataColumn("Object", objectType));

			return(_retTable);
		}


		/// <summary>Gets the relationship object between the specified child and parent tables.</summary>
		/// <param name="parentTableName">The string name of the parent table to use.</param>
		/// <param name="childTableName">The string name of the child table to use.</param>
		/// <returns>Returns the DataRelation specified, otherwise null or exception.</returns>
		public DataRelation GetRelation(string parentTableName, string childTableName) 
		{
			if(!Tables.Contains(parentTableName) || !Tables.Contains(childTableName))
				throw new InvalidOperationException("Invalid table name provided");

			foreach(DataRelation _Relation in Tables[parentTableName].ChildRelations) 
				if(_Relation.ChildTable.TableName.Equals(childTableName)) 
					return(_Relation);	
			
			return(null);
		}

		private void InitializeComponent()
		{
			this.FunctionsTable = new System.Data.DataTable();
			this.colFnAddressID = new System.Data.DataColumn();
			this.colName = new System.Data.DataColumn();
			this.colComment = new System.Data.DataColumn();
			this.colObject = new System.Data.DataColumn();
			this.colFunctionID = new System.Data.DataColumn();
			this.colQuality = new System.Data.DataColumn();
			this.colFunctionAddressTimeShift = new System.Data.DataColumn();
			this.AddressesTable = new System.Data.DataTable();
			this.colAddressID = new System.Data.DataColumn();
			this.colValue = new System.Data.DataColumn();
			this.colTimeShift = new System.Data.DataColumn();
			this.colAddressObject = new System.Data.DataColumn();
			this.colAddressName = new System.Data.DataColumn();
			this.InstructionsTable = new System.Data.DataTable();
			this.colInstructionAddress = new System.Data.DataColumn();
			this.colFnID = new System.Data.DataColumn();
			this.colInstructionObject = new System.Data.DataColumn();
			this.colInstructionComment = new System.Data.DataColumn();
			this.colInstructionID = new System.Data.DataColumn();
			this.colBranchToSub = new System.Data.DataColumn();
			this.colIsBranch = new System.Data.DataColumn();
			this.colAddressTimeShift = new System.Data.DataColumn();
			this.OperandsTable = new System.Data.DataTable();
			this.colOperandID = new System.Data.DataColumn();
			this.colOperandObject = new System.Data.DataColumn();
			this.colOperandOrder = new System.Data.DataColumn();
			this.colOperandInstructionID = new System.Data.DataColumn();
			((System.ComponentModel.ISupportInitialize)(this.FunctionsTable)).BeginInit();
			((System.ComponentModel.ISupportInitialize)(this.AddressesTable)).BeginInit();
			((System.ComponentModel.ISupportInitialize)(this.InstructionsTable)).BeginInit();
			((System.ComponentModel.ISupportInitialize)(this.OperandsTable)).BeginInit();
			((System.ComponentModel.ISupportInitialize)(this)).BeginInit();
			// 
			// FunctionsTable
			// 
			this.FunctionsTable.Columns.AddRange(new System.Data.DataColumn[] {
																				  this.colFnAddressID,
																				  this.colName,
																				  this.colComment,
																				  this.colObject,
																				  this.colFunctionID,
																				  this.colQuality,
																				  this.colFunctionAddressTimeShift});
			this.FunctionsTable.Constraints.AddRange(new System.Data.Constraint[] {
																					  new System.Data.UniqueConstraint("Constraint1", new string[] {
																																					   "FunctionID"}, true),
																					  new System.Data.UniqueConstraint("Constraint3", new string[] {
																																					   "Name"}, false)});
			this.FunctionsTable.Namespace = "KlaunmoetD.Core";
			this.FunctionsTable.PrimaryKey = new System.Data.DataColumn[] {
																			  this.colFunctionID};
			this.FunctionsTable.TableName = "Functions";
			// 
			// colFnAddressID
			// 
			this.colFnAddressID.AllowDBNull = false;
			this.colFnAddressID.ColumnName = "AddressValue";
			this.colFnAddressID.DataType = typeof(long);
			// 
			// colName
			// 
			this.colName.ColumnName = "Name";
			// 
			// colComment
			// 
			this.colComment.Caption = "Comment";
			this.colComment.ColumnName = "Comment";
			// 
			// colObject
			// 
			this.colObject.AllowDBNull = false;
			this.colObject.ColumnName = "Object";
			this.colObject.DataType = typeof(KlaunmoetD.Core.Function);
			// 
			// colFunctionID
			// 
			this.colFunctionID.AllowDBNull = false;
			this.colFunctionID.AutoIncrement = true;
			this.colFunctionID.ColumnName = "FunctionID";
			this.colFunctionID.DataType = typeof(long);
			// 
			// colQuality
			// 
			this.colQuality.AllowDBNull = false;
			this.colQuality.ColumnName = "Quality";
			this.colQuality.DataType = typeof(int);
			// 
			// colFunctionAddressTimeShift
			// 
			this.colFunctionAddressTimeShift.AllowDBNull = false;
			this.colFunctionAddressTimeShift.ColumnName = "AddressTimeShift";
			this.colFunctionAddressTimeShift.DataType = typeof(int);
			// 
			// AddressesTable
			// 
			this.AddressesTable.Columns.AddRange(new System.Data.DataColumn[] {
																				  this.colAddressID,
																				  this.colValue,
																				  this.colTimeShift,
																				  this.colAddressObject,
																				  this.colAddressName});
			this.AddressesTable.Constraints.AddRange(new System.Data.Constraint[] {
																					  new System.Data.UniqueConstraint("UniqueAddressNameConstraint", new string[] {
																																									   "Name"}, false),
																					  new System.Data.UniqueConstraint("Constraint1", new string[] {
																																					   "AddressID"}, true)});
			this.AddressesTable.PrimaryKey = new System.Data.DataColumn[] {
																			  this.colAddressID};
			this.AddressesTable.TableName = "Addresses";
			// 
			// colAddressID
			// 
			this.colAddressID.AllowDBNull = false;
			this.colAddressID.AutoIncrement = true;
			this.colAddressID.ColumnName = "AddressID";
			this.colAddressID.DataType = typeof(long);
			this.colAddressID.ReadOnly = true;
			// 
			// colValue
			// 
			this.colValue.ColumnName = "Value";
			this.colValue.DataType = typeof(long);
			// 
			// colTimeShift
			// 
			this.colTimeShift.ColumnName = "TimeShift";
			this.colTimeShift.DataType = typeof(int);
			// 
			// colAddressObject
			// 
			this.colAddressObject.ColumnName = "Object";
			this.colAddressObject.DataType = typeof(KlaunmoetD.Core.Address);
			// 
			// colAddressName
			// 
			this.colAddressName.ColumnName = "Name";
			// 
			// InstructionsTable
			// 
			this.InstructionsTable.Columns.AddRange(new System.Data.DataColumn[] {
																					 this.colInstructionAddress,
																					 this.colFnID,
																					 this.colInstructionObject,
																					 this.colInstructionComment,
																					 this.colInstructionID,
																					 this.colBranchToSub,
																					 this.colIsBranch,
																					 this.colAddressTimeShift});
			this.InstructionsTable.Constraints.AddRange(new System.Data.Constraint[] {
																						 new System.Data.UniqueConstraint("Constraint1", new string[] {
																																						  "AddressTimeShift",
																																						  "AddressValue",
																																						  "FunctionID"}, true)});
			this.InstructionsTable.PrimaryKey = new System.Data.DataColumn[] {
																				 this.colAddressTimeShift,
																				 this.colInstructionAddress,
																				 this.colFnID};
			this.InstructionsTable.TableName = "Instructions";
			// 
			// colInstructionAddress
			// 
			this.colInstructionAddress.AllowDBNull = false;
			this.colInstructionAddress.ColumnName = "AddressValue";
			this.colInstructionAddress.DataType = typeof(long);
			// 
			// colFnID
			// 
			this.colFnID.AllowDBNull = false;
			this.colFnID.Caption = "FunctionID";
			this.colFnID.ColumnName = "FunctionID";
			this.colFnID.DataType = typeof(long);
			// 
			// colInstructionObject
			// 
			this.colInstructionObject.ColumnName = "Object";
			this.colInstructionObject.DataType = typeof(KlaunmoetD.Core.IInstruction);
			// 
			// colInstructionComment
			// 
			this.colInstructionComment.ColumnName = "Comment";
			// 
			// colInstructionID
			// 
			this.colInstructionID.AllowDBNull = false;
			this.colInstructionID.AutoIncrement = true;
			this.colInstructionID.ColumnName = "InstructionID";
			this.colInstructionID.DataType = typeof(long);
			// 
			// colBranchToSub
			// 
			this.colBranchToSub.AllowDBNull = false;
			this.colBranchToSub.ColumnName = "isBranchToSub";
			this.colBranchToSub.DataType = typeof(bool);
			// 
			// colIsBranch
			// 
			this.colIsBranch.AllowDBNull = false;
			this.colIsBranch.ColumnName = "isBranch";
			this.colIsBranch.DataType = typeof(bool);
			// 
			// colAddressTimeShift
			// 
			this.colAddressTimeShift.AllowDBNull = false;
			this.colAddressTimeShift.ColumnName = "AddressTimeShift";
			this.colAddressTimeShift.DataType = typeof(int);
			// 
			// OperandsTable
			// 
			this.OperandsTable.Columns.AddRange(new System.Data.DataColumn[] {
																				 this.colOperandID,
																				 this.colOperandObject,
																				 this.colOperandOrder,
																				 this.colOperandInstructionID});
			this.OperandsTable.Constraints.AddRange(new System.Data.Constraint[] {
																					 new System.Data.UniqueConstraint("Constraint1", new string[] {
																																					  "OperandID"}, true)});
			this.OperandsTable.PrimaryKey = new System.Data.DataColumn[] {
																			 this.colOperandID};
			this.OperandsTable.TableName = "Operands";
			// 
			// colOperandID
			// 
			this.colOperandID.AllowDBNull = false;
			this.colOperandID.AutoIncrement = true;
			this.colOperandID.ColumnName = "OperandID";
			this.colOperandID.DataType = typeof(int);
			// 
			// colOperandObject
			// 
			this.colOperandObject.ColumnName = "Object";
			this.colOperandObject.DataType = typeof(object);
			// 
			// colOperandOrder
			// 
			this.colOperandOrder.AllowDBNull = false;
			this.colOperandOrder.ColumnName = "OperandOrder";
			this.colOperandOrder.DataType = typeof(short);
			// 
			// colOperandInstructionID
			// 
			this.colOperandInstructionID.AllowDBNull = false;
			this.colOperandInstructionID.ColumnName = "InstructionID";
			// 
			// CodeSet
			// 
			this.Relations.AddRange(new System.Data.DataRelation[] {
																	   new System.Data.DataRelation("Instruction2Function", "Functions", "Instructions", new string[] {
																																										  "FunctionID"}, new string[] {
																																																		  "FunctionID"}, false)});
			this.Tables.AddRange(new System.Data.DataTable[] {
																 this.FunctionsTable,
																 this.AddressesTable,
																 this.InstructionsTable,
																 this.OperandsTable});
			((System.ComponentModel.ISupportInitialize)(this.FunctionsTable)).EndInit();
			((System.ComponentModel.ISupportInitialize)(this.AddressesTable)).EndInit();
			((System.ComponentModel.ISupportInitialize)(this.InstructionsTable)).EndInit();
			((System.ComponentModel.ISupportInitialize)(this.OperandsTable)).EndInit();
			((System.ComponentModel.ISupportInitialize)(this)).EndInit();

		}


		/// <summary>Instantiates or returns a singleton global instance of this object.</summary>
		/// <returns>The current singleton instance (or new instance) of the codeset class.</returns>
		public static CodeSet Instance() 
		{ 
			if(_SingletonInstance == null)
				_SingletonInstance = new CodeSet();

			return(_SingletonInstance);
		}


		#endregion

		#endregion
	 
	}
}