/* Chordata - .NET File Format Parser
 * Copyright (C) 2001-2002  Jay Freeman (saurik)
*/

/*
 *        Redistribution and use in source and binary
 * forms, with or without modification, are permitted
 * provided that the following conditions are met:
 * 
 * 1. Redistributions of source code must retain the
 *    above copyright notice, this list of conditions
 *    and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the
 *    above copyright notice, this list of conditions
 *    and the following disclaimer in the documentation
 *    and/or other materials provided with the
 *    distribution.
 * 3. The name of the author may not be used to endorse
 *    or promote products derived from this software
 *    without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS''
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#include "stdafx.h"
#include "chordata/ParseData.h"

namespace Chordata {
namespace ParseData {

const uint32_t Types[256] = {
	/*0*/ 0, 0, 2, 0, 2, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0,
	/*1*/ 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0,
	/*2*/ 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 2, 0, 2, 0, 0, 0,
	/*3*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	/*4*/ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0,
	/*5*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	/*6*/ 2, 2, 0, 4, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0,
	/*7*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	/*8*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	/*9*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	/*A*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	/*B*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	/*C*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	/*D*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	/*E*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
	/*F*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};

/*uint32_t Mapping[34] = {
	0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
	0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
	0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
	0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x20,
	0x23, 0x2e
};*/

namespace TableDefs {

namespace Columns {

/* 0x00 */ Column Module[] = {
	{0x65,	"Name"},
	{0x66,	"Guid"},
	{0x66,	"Mvid"}
};

/* 0x01 */ Column TypeRef[] = {
	{0x4b,	"ResolutionScope"},
	{0x65,	"Name"},
	{0x65,	"Namespace"}
};

/* 0x02 */ Column TypeDef[] = {
	{0x63,	"Flags"},
	{0x63,	"VersionMS"},
	{0x63,	"VersionLS"},
	{0x65,	"Name"},
	{0x65,	"Namespace"},
	{0x66,	"Guid"},
	{0x40,	"Extends"},
	{0x04,	"FieldList"},
	{0x06,	"MethodList"}
};

/* 0x03 */ Column FieldPtr[] = {
	{0x04,	"Field"}
};

/* 0x04 */ Column Field[] = {
	{0x61,	"Flags"},
	{0x65,	"Name"},
	{0x67,	"Signature"}
};

/* 0x05 */ Column MethodPtr[] = {
	{0x06,	"Method"}
};

/* 0x06 */ Column Method[] = {
	{0x63,	"RVA"},
	{0x61,	"ImplFlags"},
	{0x61,	"Flags"},
	{0x65,	"Name"},
	{0x67,	"Signature"},
	{0x08,	"ParamList"}
};

/* 0x07 */ Column ParamPtr[] = {
	{0x08,	"Param"}
};

/* 0x08 */ Column Param[] = {
	{0x61,	"Flags"},
	{0x61,	"Sequence"},
	{0x65,	"Name"}
};

/* 0x09 */ Column InterfaceImpl[] = {
	{0x02,	"Class"},
	{0x40,	"Interface"}
};

/* 0x0a */ Column MemberRef[] = {
	{0x45,	"Class"},
	{0x65,	"Name"},
	{0x67,	"Signature"}
};

/* 0x0b */ Column Constant[] = {
	{0x64,	"Type"},
	{0x41,	"Parent"},
	{0x67,	"Value"}
};

/* 0x0c */ Column CustomValue[] = {
	{0x42,	"Parent"},
	{0x4a,	"Type"},
	{0x67,	"Value"}
};

/* 0x0d */ Column FieldMarshal[] = {
	{0x43,	"Parent"},
	{0x67,	"NativeType"}
};

/* 0x0e */ Column DeclSecurity[] = {
	{0x60,	"Action"},
	{0x44,	"Parent"},
	{0x67,	"PermissionSet"}
};

/* 0x0f */ Column ClassLayout[] = {
	{0x61,	"PackingSize"},
	{0x63,	"ClassSize"},
	{0x2,	"Parent"},
	{0x4,	"FieldLayout"}
};

/* 0x10 */ Column FieldLayout2[] = {
	{0x63,	"OffSet"},
	{0x4,	"Field"}
};

/* 0x11 */ Column StandAloneSig[] = {
	{0x67,	"Signature"}
};

/* 0x12 */ Column EventMap[] = {
	{0x02,	"Parent"},
	{0x14,	"EventList"}
};

/* 0x13 */ Column EventPtr[] = {
	{0x14,	"Event"}
};

/* 0x14 */ Column Event[] = {
	{0x61,	"EventFlags"},
	{0x65,	"Name"},
	{0x40,	"EventType"}
};

/* 0x15 */ Column PropertyMap[] = {
	{0x02,	"Parent"},
	{0x17,	"PropertyList"}
};

/* 0x16 */ Column PropertyPtr[] = {
	{0x17,	"Property"}
};

/* 0x17 */ Column Property[] = {
	{0x61,	"PropFlags"},
	{0x65,	"Name"},
	{0x67,	"Type"},
	{0x04,	"BackingField"}
};

/* 0x18 */ Column MethodSemantics[] = {
	{0x61,	"Semantic"},
	{0x6,	"Method"},
	{0x46,	"Association"}
};

/* 0x19 */ Column MethodImpl[] = {
	{0x2,	"Class"},
	{0x47,	"MethodBody"},
	{0x47,	"MethodDeclaration"}
};

/* 0x1a */ Column ModuleRef[] = {
	{0x65,	"Name"}
};

/* 0x1b */ Column TypeSpec[] = {
	{0x67,	"Signature"}
};

/* 0x1c */ Column ImplMap[] = {
	{0x61,	"MappingFlags"},
	{0x48,	"MemberForwarded"},
	{0x65,	"ImportName"},
	{0x1a,	"ImportScope"}
};

/* 0x1d */ Column FieldRVA[] = {
	{0x63,	"RVA"},
	{0x04,	"Field"}
};

/* 0x1e */ Column ENCLog[] = {
	{0x63,	"Token"},
	{0x63,	"FuncCode"}
};

/* 0x1f */ Column ENCMap[] = {
	{0x63,	"Token"}
};

/* 0x20 */ Column Assembly[] = {
	{0x63,	"HashAlgId"},
	{0x61,	"MajorVersion"},
	{0x61,	"MinorVersion"},
	{0x61,	"RevisionNumber"},
	{0x61,	"BuildNumber"},
	{0x63,	"Flags"},
	{0x67,	"Originator"},
	{0x65,	"Name"},
	{0x65,	"Locale"},
	{0x65,	"Configuration"},
	{0x65,	"Title"},
	{0x65,	"Description"},
	{0x65,	"DefaultAlias"}
};

/* 0x21 */ Column AssemblyProcessor[] = {
	{0x63,	"Processor"}
};

/* 0x22 */ Column AssemblyOS[] = {
	{0x63,	"OSPlatformId"},
	{0x63,	"OSMajorVersion"},
	{0x63,	"OSMinorVersion"}
};

/* 0x23 */ Column AssemblyRef[] = {
	{0x61,	"MajorVersion"},
	{0x61,	"MinorVersion"},
	{0x61,	"RevisionNumber"},
	{0x61,	"BuildNumber"},
	{0x63,	"Flags"},
	{0x67,	"Originator"},
	{0x65,	"Name"},
	{0x65,	"Locale"},
	{0x65,	"Configuration"},
	{0x67,	"HashValue"},
	{0x29,	"ExecutionLocation"}
};

/* 0x24 */ Column AssemblyRefProcessor[] = {
	{0x63,	"Processor"},
	{0x23,	"AssemblyRef"}
};

/* 0x25 */ Column AssemblyRefOS[] = {
	{0x63,	"OSPlatformId"},
	{0x63,	"OSMajorVersion"},
	{0x63,	"OSMinorVersion"},
	{0x23,	"AssemblyRef"}
};

/* 0x26 */ Column File[] = {
	{0x63,	"Flags"},
	{0x65,	"Name"},
	{0x67,	"HashValue"}
};

/* 0x27 */ Column ComType[] = {
	{0x63,	"Flags"},
	{0x63,	"TypeDefId"},
	{0x65,	"TypeName"},
	{0x65,	"TypeNamespace"},
	{0x65,	"Description"},
	{0x49,	"Implementation"},
	{0x29,	"ExecutionLocation"}
};

/* 0x28 */ Column ManifestResource[] = {
	{0x63,	"Offset"},
	{0x63,	"Flags"},
	{0x65,	"Locale"},
	{0x65,	"Name"},
	{0x65,	"Description"},
	{0x49,	"Implementation"},
	{0x65,	"MIMEType"}
};

/* 0x29 */ Column ExecutionLocation[] = {
	{0x63,	"Flags"},
	{0x65,	"Name"},
	{0x65,	"Description"},
	{0x65,	"Location"}
};

/* 0x2a */ Column SourceFile[] = {
	{0x65,	"FileName"}
};

/* 0x2b */ Column Block[] = {
	{0x06,	"MethodDef"},
	{0x2a,	"SourceFile"},
	{0x67,	"LineNumber"}
};

/* 0x2c */ Column Scope[] = {
	{0x63,	"StartLine"},
	{0x63,	"EndLine"},
	{0x2c,	"Parent"},
	{0x06,	"Method"}
};

/* 0x2d */ Column LocalVariable[] = {
	{0x63,	"Slot"},
	{0x2c,	"Scope"},
	{0x65,	"Name"},
	{0x65,	"Signature"},
	{0x67,	"SignatureBlob"}
};

/* 0x2e */ Column NestedClass[] = {
	{0x02,	"NestedClass"},
	{0x02,	"EnclosingClass"}
};

}

/* 0x00 */ TableDef Module = {"Module", 0xff, 3, Columns::Module};
/* 0x01 */ TableDef TypeRef = {"TypeRef", 0xff, 3, Columns::TypeRef};
/* 0x02 */ TableDef TypeDef = {"TypeDef", 0xff, 9, Columns::TypeDef};
/* 0x03 */ TableDef FieldPtr = {"FieldPtr", 0xff, 1, Columns::FieldPtr};
/* 0x04 */ TableDef Field = {"Field", 0xff, 3, Columns::Field};
/* 0x05 */ TableDef MethodPtr = {"MethodPtr", 0xff, 1, Columns::MethodPtr};
/* 0x06 */ TableDef Method = {"Method", 0xff, 6, Columns::Method};
/* 0x07 */ TableDef ParamPtr = {"ParamPtr", 0xff, 1, Columns::ParamPtr};
/* 0x08 */ TableDef Param = {"Param", 0xff, 3, Columns::Param};
/* 0x09 */ TableDef InterfaceImpl = {"InterfaceImpl", 0x00, 2, Columns::InterfaceImpl};
/* 0x0a */ TableDef MemberRef = {"MemberRef", 0xff, 3, Columns::MemberRef};
/* 0x0b */ TableDef Constant = {"Constant", 0x01, 3, Columns::Constant};
/* 0x0c */ TableDef CustomValue = {"CustomValue", 0x00, 3, Columns::CustomValue};
/* 0x0d */ TableDef FieldMarshal = {"FieldMarshal", 0x00, 2, Columns::FieldMarshal};
/* 0x0e */ TableDef DeclSecurity = {"DeclSecurity", 0x01, 3, Columns::DeclSecurity};
/* 0x0f */ TableDef ClassLayout = {"ClassLayout", 0x02, 4, Columns::ClassLayout};
/* 0x10 */ TableDef FieldLayout2 = {"FieldLayout2", 0x01, 2, Columns::FieldLayout2};
/* 0x11 */ TableDef StandAloneSig = {"StandAloneSig", 0xff, 1, Columns::StandAloneSig};
/* 0x12 */ TableDef EventMap = {"EventMap", 0xff, 2, Columns::EventMap};
/* 0x13 */ TableDef EventPtr = {"EventPtr", 0xff, 1, Columns::EventPtr};
/* 0x14 */ TableDef Event = {"Event", 0xff, 3, Columns::Event};
/* 0x15 */ TableDef PropertyMap = {"PropertyMap", 0xff, 2, Columns::PropertyMap};
/* 0x16 */ TableDef PropertyPtr = {"PropertyPtr", 0xff, 1, Columns::PropertyPtr};
/* 0x17 */ TableDef Property = {"Property", 0xff, 4, Columns::Property};
/* 0x18 */ TableDef MethodSemantics = {"MethodSemantics", 0x01, 3, Columns::MethodSemantics};
/* 0x19 */ TableDef MethodImpl = {"MethodImpl", 0x00, 3, Columns::MethodImpl};
/* 0x1a */ TableDef ModuleRef = {"ModuleRef", 0xff, 1, Columns::ModuleRef};
/* 0x1b */ TableDef TypeSpec = {"TypeSpec", 0xff, 1, Columns::TypeSpec};
/* 0x1c */ TableDef ImplMap = {"ImplMap", 0x01, 4, Columns::ImplMap};
/* 0x1d */ TableDef FieldRVA = {"FieldRVA", 0x01, 2, Columns::FieldRVA};
/* 0x1e */ TableDef ENCLog = {"ENCLog", 0xff, 2, Columns::ENCLog};
/* 0x1f */ TableDef ENCMap = {"ENCMap", 0xff, 1, Columns::ENCMap};
/* 0x20 */ TableDef Assembly = {"Assembly", 0xff, 13, Columns::Assembly};
/* 0x21 */ TableDef AssemblyProcessor = {"AssemblyProcessor", 0xff, 1, Columns::AssemblyProcessor};
/* 0x22 */ TableDef AssemblyOS = {"AssemblyOS", 0xff, 3, Columns::AssemblyOS};
/* 0x23 */ TableDef AssemblyRef = {"AssemblyRef", 0xff, 11, Columns::AssemblyRef};
/* 0x24 */ TableDef AssemblyRefProcessor = {"AssemblyRefProcessor", 0xff, 2, Columns::AssemblyRefProcessor};
/* 0x25 */ TableDef AssemblyRefOS = {"AssemblyRefOS", 0xff, 4, Columns::AssemblyRefOS};
/* 0x26 */ TableDef File = {"File", 0xff, 3, Columns::File};
/* 0x27 */ TableDef ComType = {"ComType", 0xff, 7, Columns::ComType};
/* 0x28 */ TableDef ManifestResource = {"ManifestResource", 0xff, 7, Columns::ManifestResource};

/* 0x29 */ TableDef ExecutionLocation = {"ExecutionLocation", 0xff, 4, Columns::ExecutionLocation};
/* 0x2a */ TableDef SourceFile = {"SourceFile", 0xff, 1, Columns::SourceFile};
/* 0x2b */ TableDef Block = {"Block", 0xff, 3, Columns::Block};
/* 0x2c */ TableDef Scope = {"Scope", 0xff, 4, Columns::Scope};
/* 0x2d */ TableDef LocalVariable = {"LocalVariable", 0xff, 5, Columns::LocalVariable};
/* 0x2e */ TableDef NestedClass = {"NestedClass", 0x00, 2, Columns::NestedClass};

}

const TableDef *Tables[47] = {
	&TableDefs::Module,
	&TableDefs::TypeRef,
	&TableDefs::TypeDef,
	&TableDefs::FieldPtr,
	&TableDefs::Field,
	&TableDefs::MethodPtr,
	&TableDefs::Method,
	&TableDefs::ParamPtr,
	&TableDefs::Param,
	&TableDefs::InterfaceImpl,
	&TableDefs::MemberRef,
	&TableDefs::Constant,
	&TableDefs::CustomValue,
	&TableDefs::FieldMarshal,
	&TableDefs::DeclSecurity,
	&TableDefs::ClassLayout,
	&TableDefs::FieldLayout2,
	&TableDefs::StandAloneSig,
	&TableDefs::EventMap,
	&TableDefs::EventPtr,
	&TableDefs::Event,
	&TableDefs::PropertyMap,
	&TableDefs::PropertyPtr,
	&TableDefs::Property,
	&TableDefs::MethodSemantics,
	&TableDefs::MethodImpl,
	&TableDefs::ModuleRef,
	&TableDefs::TypeSpec,
	&TableDefs::ImplMap,
	&TableDefs::FieldRVA,
	&TableDefs::ENCLog,
	&TableDefs::ENCMap,
	&TableDefs::Assembly,
	&TableDefs::AssemblyProcessor,
	&TableDefs::AssemblyOS,
	&TableDefs::AssemblyRef,
	&TableDefs::AssemblyRefProcessor,
	&TableDefs::AssemblyRefOS,
	&TableDefs::File,
	&TableDefs::ComType,
	&TableDefs::ManifestResource,
	&TableDefs::ExecutionLocation,
	&TableDefs::SourceFile,
	&TableDefs::Block,
	&TableDefs::Scope,
	&TableDefs::LocalVariable,
	&TableDefs::NestedClass
};

} }