Skip to content

Commit c61566d

Browse files
committed
Added BoolNode.
1 parent da815ec commit c61566d

12 files changed

+6572
-6438
lines changed

CodeGenerator/CSharpCodeGenerator.cs

Lines changed: 148 additions & 147 deletions
Original file line numberDiff line numberDiff line change
@@ -1,147 +1,148 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Diagnostics.Contracts;
4-
using System.Linq;
5-
using System.Text;
6-
using ReClassNET.Logger;
7-
using ReClassNET.Nodes;
8-
9-
namespace ReClassNET.CodeGenerator
10-
{
11-
class CSharpCodeGenerator : ICodeGenerator
12-
{
13-
private readonly Dictionary<Type, string> typeToTypedefMap = new Dictionary<Type, string>
14-
{
15-
[typeof(DoubleNode)] = "double",
16-
[typeof(FloatNode)] = "float",
17-
[typeof(Int8Node)] = "sbyte",
18-
[typeof(Int16Node)] = "short",
19-
[typeof(Int32Node)] = "int",
20-
[typeof(Int64Node)] = "long",
21-
[typeof(UInt8Node)] = "byte",
22-
[typeof(UInt16Node)] = "ushort",
23-
[typeof(UInt32Node)] = "uint",
24-
[typeof(UInt64Node)] = "ulong",
25-
26-
[typeof(FunctionPtrNode)] = "IntPtr",
27-
[typeof(UTF8TextPtrNode)] = "IntPtr",
28-
[typeof(UTF16TextPtrNode)] = "IntPtr",
29-
[typeof(UTF32TextPtrNode)] = "IntPtr",
30-
[typeof(ClassPtrNode)] = "IntPtr",
31-
[typeof(VTableNode)] = "IntPtr"
32-
};
33-
34-
public Language Language => Language.CSharp;
35-
36-
public string GenerateCode(IEnumerable<ClassNode> classes, ILogger logger)
37-
{
38-
var sb = new StringBuilder();
39-
sb.AppendLine($"// Created with {Constants.ApplicationName} by {Constants.Author}");
40-
sb.AppendLine();
41-
sb.AppendLine("// Warning: The code doesn't contain arrays and instances!");
42-
sb.AppendLine();
43-
sb.AppendLine("using System.Runtime.InteropServices;");
44-
sb.AppendLine();
45-
46-
sb.Append(
47-
string.Join(
48-
"\n\n",
49-
classes.Select(c =>
50-
{
51-
var csb = new StringBuilder();
52-
53-
csb.AppendLine("[StructLayout(LayoutKind.Explicit)]");
54-
csb.Append($"struct {c.Name}");
55-
if (!string.IsNullOrEmpty(c.Comment))
56-
{
57-
csb.Append($" // {c.Comment}");
58-
}
59-
csb.AppendLine();
60-
61-
csb.AppendLine("{");
62-
63-
csb.AppendLine(
64-
string.Join(
65-
"\n\n",
66-
YieldMemberDefinitions(c.Nodes, logger)
67-
.Select(m => $"\t{GetFieldDecorator(m)}\n\t{GetFieldDefinition(m)}")
68-
)
69-
);
70-
csb.Append("}");
71-
return csb.ToString();
72-
})
73-
)
74-
);
75-
76-
return sb.ToString();
77-
}
78-
79-
private IEnumerable<MemberDefinition> YieldMemberDefinitions(IEnumerable<BaseNode> members, ILogger logger)
80-
{
81-
Contract.Requires(members != null);
82-
Contract.Requires(Contract.ForAll(members, m => m != null));
83-
Contract.Ensures(Contract.Result<IEnumerable<MemberDefinition>>() != null);
84-
Contract.Ensures(Contract.ForAll(Contract.Result<IEnumerable<MemberDefinition>>(), d => d != null));
85-
86-
foreach (var member in members.Where(n => !(n is BaseHexNode)))
87-
{
88-
if (member is BitFieldNode)
89-
{
90-
string type;
91-
switch (((BitFieldNode)member).Bits)
92-
{
93-
default:
94-
case 8:
95-
type = typeToTypedefMap[typeof(UInt8Node)];
96-
break;
97-
case 16:
98-
type = typeToTypedefMap[typeof(UInt16Node)];
99-
break;
100-
case 32:
101-
type = typeToTypedefMap[typeof(UInt32Node)];
102-
break;
103-
case 64:
104-
type = typeToTypedefMap[typeof(UInt64Node)];
105-
break;
106-
}
107-
108-
yield return new MemberDefinition(member, type);
109-
}
110-
else
111-
{
112-
string type;
113-
if (typeToTypedefMap.TryGetValue(member.GetType(), out type))
114-
{
115-
yield return new MemberDefinition(member, type);
116-
}
117-
else
118-
{
119-
var generator = CustomCodeGenerator.GetGenerator(member, Language);
120-
if (generator != null)
121-
{
122-
yield return generator.GetMemberDefinition(member, Language, logger);
123-
124-
continue;
125-
}
126-
127-
logger.Log(LogLevel.Error, $"Skipping node with unhandled type: {member.GetType()}");
128-
}
129-
}
130-
}
131-
}
132-
133-
private string GetFieldDecorator(MemberDefinition member)
134-
{
135-
Contract.Requires(member != null);
136-
137-
return $"[FieldOffset({member.Offset})]";
138-
}
139-
140-
private string GetFieldDefinition(MemberDefinition member)
141-
{
142-
Contract.Requires(member != null);
143-
144-
return $"public {member.Type} {member.Name}; //0x{member.Offset:X04} {member.Comment}".Trim();
145-
}
146-
}
147-
}
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Diagnostics.Contracts;
4+
using System.Linq;
5+
using System.Text;
6+
using ReClassNET.Logger;
7+
using ReClassNET.Nodes;
8+
9+
namespace ReClassNET.CodeGenerator
10+
{
11+
class CSharpCodeGenerator : ICodeGenerator
12+
{
13+
private readonly Dictionary<Type, string> typeToTypedefMap = new Dictionary<Type, string>
14+
{
15+
[typeof(DoubleNode)] = "double",
16+
[typeof(FloatNode)] = "float",
17+
[typeof(BoolNode)] = "bool",
18+
[typeof(Int8Node)] = "sbyte",
19+
[typeof(Int16Node)] = "short",
20+
[typeof(Int32Node)] = "int",
21+
[typeof(Int64Node)] = "long",
22+
[typeof(UInt8Node)] = "byte",
23+
[typeof(UInt16Node)] = "ushort",
24+
[typeof(UInt32Node)] = "uint",
25+
[typeof(UInt64Node)] = "ulong",
26+
27+
[typeof(FunctionPtrNode)] = "IntPtr",
28+
[typeof(UTF8TextPtrNode)] = "IntPtr",
29+
[typeof(UTF16TextPtrNode)] = "IntPtr",
30+
[typeof(UTF32TextPtrNode)] = "IntPtr",
31+
[typeof(ClassPtrNode)] = "IntPtr",
32+
[typeof(VTableNode)] = "IntPtr"
33+
};
34+
35+
public Language Language => Language.CSharp;
36+
37+
public string GenerateCode(IEnumerable<ClassNode> classes, ILogger logger)
38+
{
39+
var sb = new StringBuilder();
40+
sb.AppendLine($"// Created with {Constants.ApplicationName} by {Constants.Author}");
41+
sb.AppendLine();
42+
sb.AppendLine("// Warning: The code doesn't contain arrays and instances!");
43+
sb.AppendLine();
44+
sb.AppendLine("using System.Runtime.InteropServices;");
45+
sb.AppendLine();
46+
47+
sb.Append(
48+
string.Join(
49+
"\n\n",
50+
classes.Select(c =>
51+
{
52+
var csb = new StringBuilder();
53+
54+
csb.AppendLine("[StructLayout(LayoutKind.Explicit)]");
55+
csb.Append($"struct {c.Name}");
56+
if (!string.IsNullOrEmpty(c.Comment))
57+
{
58+
csb.Append($" // {c.Comment}");
59+
}
60+
csb.AppendLine();
61+
62+
csb.AppendLine("{");
63+
64+
csb.AppendLine(
65+
string.Join(
66+
"\n\n",
67+
YieldMemberDefinitions(c.Nodes, logger)
68+
.Select(m => $"\t{GetFieldDecorator(m)}\n\t{GetFieldDefinition(m)}")
69+
)
70+
);
71+
csb.Append("}");
72+
return csb.ToString();
73+
})
74+
)
75+
);
76+
77+
return sb.ToString();
78+
}
79+
80+
private IEnumerable<MemberDefinition> YieldMemberDefinitions(IEnumerable<BaseNode> members, ILogger logger)
81+
{
82+
Contract.Requires(members != null);
83+
Contract.Requires(Contract.ForAll(members, m => m != null));
84+
Contract.Ensures(Contract.Result<IEnumerable<MemberDefinition>>() != null);
85+
Contract.Ensures(Contract.ForAll(Contract.Result<IEnumerable<MemberDefinition>>(), d => d != null));
86+
87+
foreach (var member in members.Where(n => !(n is BaseHexNode)))
88+
{
89+
if (member is BitFieldNode)
90+
{
91+
string type;
92+
switch (((BitFieldNode)member).Bits)
93+
{
94+
default:
95+
case 8:
96+
type = typeToTypedefMap[typeof(UInt8Node)];
97+
break;
98+
case 16:
99+
type = typeToTypedefMap[typeof(UInt16Node)];
100+
break;
101+
case 32:
102+
type = typeToTypedefMap[typeof(UInt32Node)];
103+
break;
104+
case 64:
105+
type = typeToTypedefMap[typeof(UInt64Node)];
106+
break;
107+
}
108+
109+
yield return new MemberDefinition(member, type);
110+
}
111+
else
112+
{
113+
string type;
114+
if (typeToTypedefMap.TryGetValue(member.GetType(), out type))
115+
{
116+
yield return new MemberDefinition(member, type);
117+
}
118+
else
119+
{
120+
var generator = CustomCodeGenerator.GetGenerator(member, Language);
121+
if (generator != null)
122+
{
123+
yield return generator.GetMemberDefinition(member, Language, logger);
124+
125+
continue;
126+
}
127+
128+
logger.Log(LogLevel.Error, $"Skipping node with unhandled type: {member.GetType()}");
129+
}
130+
}
131+
}
132+
}
133+
134+
private string GetFieldDecorator(MemberDefinition member)
135+
{
136+
Contract.Requires(member != null);
137+
138+
return $"[FieldOffset({member.Offset})]";
139+
}
140+
141+
private string GetFieldDefinition(MemberDefinition member)
142+
{
143+
Contract.Requires(member != null);
144+
145+
return $"public {member.Type} {member.Name}; //0x{member.Offset:X04} {member.Comment}".Trim();
146+
}
147+
}
148+
}

0 commit comments

Comments
 (0)