C++: Add boilerplate for type parsing
This commit is contained in:
73
Il2CppInspector.Common/Cpp/CppType.cs
Normal file
73
Il2CppInspector.Common/Cpp/CppType.cs
Normal file
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
Copyright 2020 Katy Coe - http://www.hearthcode.org - http://www.djkaty.com
|
||||
|
||||
All rights reserved.
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Text;
|
||||
|
||||
namespace Il2CppInspector.Cpp
|
||||
{
|
||||
public abstract class CppType
|
||||
{
|
||||
// Calculate the size of the C++ type in bytes
|
||||
public abstract int GetSize();
|
||||
}
|
||||
|
||||
// A non-struct non-class type
|
||||
public class CppPrimitiveType : CppType
|
||||
{
|
||||
private readonly int size;
|
||||
|
||||
public override int GetSize() => size;
|
||||
|
||||
public CppPrimitiveType(int size) => this.size = size;
|
||||
}
|
||||
|
||||
// A struct or class type
|
||||
public class CppComplexType : CppType
|
||||
{
|
||||
// Dictionary of byte offset in the type to each field
|
||||
public Dictionary<int, CppField> Fields { get; } = new Dictionary<int, CppField>();
|
||||
|
||||
// Calculate the size by summing the size of each field's type
|
||||
public override int GetSize() => Fields.Values.Select(f => f.Type.GetSize()).Sum();
|
||||
}
|
||||
|
||||
// A field in a C++ type
|
||||
public struct CppField
|
||||
{
|
||||
// The name of the field
|
||||
public string Name { get; }
|
||||
|
||||
// The type of the field
|
||||
public CppType Type { get; }
|
||||
}
|
||||
|
||||
// A collection of C++ types
|
||||
public class CppTypes
|
||||
{
|
||||
private Dictionary<string, CppType> types { get; }
|
||||
|
||||
public CppType this[string s] => types[s];
|
||||
|
||||
public CppTypes() {
|
||||
types = new Dictionary<string, CppType> {
|
||||
["uint8_t"] = new CppPrimitiveType(1),
|
||||
["uint16_t"] = new CppPrimitiveType(2),
|
||||
["uint32_t"] = new CppPrimitiveType(4),
|
||||
["uint64_t"] = new CppPrimitiveType(8),
|
||||
["int8_t"] = new CppPrimitiveType(1),
|
||||
["int16_t"] = new CppPrimitiveType(2),
|
||||
["int32_t"] = new CppPrimitiveType(4),
|
||||
["int64_t"] = new CppPrimitiveType(8),
|
||||
["char"] = new CppPrimitiveType(1),
|
||||
["void"] = new CppPrimitiveType(4), // or 8; pointer
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user