Skip to content

Commit a8bd7c7

Browse files
committed
patterns: Add Lua 5.0 pattern
Based on Lua 5.1 pattern.
1 parent 4646e4b commit a8bd7c7

File tree

2 files changed

+110
-0
lines changed

2 files changed

+110
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ Everything will immediately show up in ImHex's Content Store and gets bundled wi
117117
| LOC | | [`patterns/loc.hexpat`](patterns/loc.hexpat) | Minecraft Legacy Console Edition Language file |
118118
| Lua 4.0 | | [`patterns/lua40.hexpat`](patterns/lua40.hexpat) | Lua 4.0 bytecode |
119119
| LUC | | [`patterns/popcap_luc.hexpat`](patterns/popcap_luc.hexpat) | PopCap's proprietary Lua bytecode |
120+
| Lua 5.0 | | [`patterns/lua50.hexpat`](patterns/lua50.hexpat) | Lua 5.0 bytecode |
120121
| Lua 5.1 | | [`patterns/lua51.hexpat`](patterns/lua51.hexpat) | Lua 5.1 bytecode |
121122
| Lua 5.2 | | [`patterns/lua52.hexpat`](patterns/lua52.hexpat) | Lua 5.2 bytecode |
122123
| Lua 5.3 | | [`patterns/lua53.hexpat`](patterns/lua53.hexpat) | Lua 5.3 bytecode |

patterns/lua50.hexpat

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
#pragma description Lua 5.0 bytecode
2+
#pragma magic [ 1B 4C 75 61 50 ] @ 0x00
3+
4+
import std.io;
5+
6+
namespace impl {
7+
fn format_LuaString(auto string) {
8+
if (string.size == 0) {
9+
return "None";
10+
}
11+
return std::format("\"{}\"", string.data);
12+
};
13+
14+
fn format_Constant(auto constant) {
15+
return constant.data;
16+
};
17+
18+
fn format_Version(auto ver) {
19+
return std::format("Ver. {}.{}", ver.major, ver.minor);
20+
};
21+
}
22+
using LuaFunction;
23+
24+
bitfield Version {
25+
minor : 4;
26+
major : 4;
27+
} [[format("impl::format_Version")]];
28+
29+
struct LuaBinaryHeader {
30+
char magic[4];
31+
Version version_number;
32+
u8 endianness;
33+
u8 size_of_int;
34+
u8 size_of_size_t;
35+
u8 size_of_Instruction;
36+
u8 size_of_op;
37+
u8 size_of_a;
38+
u8 size_of_b;
39+
u8 size_of_c;
40+
u8 size_of_lua_Number;
41+
double test_number;
42+
};
43+
44+
LuaBinaryHeader header @ 0;
45+
46+
struct LuaString {
47+
if (header.size_of_size_t == 4) {
48+
u32 size;
49+
} else {
50+
u64 size;
51+
}
52+
if (size > 0) {
53+
char data[size];
54+
}
55+
}[[format("impl::format_LuaString")]];
56+
57+
struct LuaConstant {
58+
u8 type;
59+
if (type == 0) { // LUA_TNIL
60+
// NULL
61+
} else if (type == 1) { // LUA_TBOOLEAN
62+
u8 data;
63+
} else if (type == 3) { // LUA_TNUMBER
64+
double data;
65+
} else if (type == 4) { // LUA_TSTRING
66+
LuaString data;
67+
}
68+
}[[format("impl::format_Constant")]];
69+
70+
struct Vector<T> {
71+
u32 size;
72+
if (size > 0) {
73+
T values[size];
74+
}
75+
};
76+
77+
struct LocalVar {
78+
LuaString varname;
79+
u32 startpc;
80+
u32 endpc;
81+
};
82+
83+
struct LuaDebugInfo {
84+
Vector<u32> lineInfo;
85+
Vector<LocalVar> localVar;
86+
Vector<LuaString> upvalues;
87+
};
88+
89+
struct LuaConstants{
90+
Vector<LuaConstant> constants;
91+
u32 sizep; // size of proto
92+
if (sizep > 0) {
93+
LuaFunction protos[sizep];
94+
}
95+
};
96+
97+
struct LuaFunction {
98+
LuaString source;
99+
u32 linedefined;
100+
u8 nups; // number of upvalues
101+
u8 numparams;
102+
u8 is_vararg;
103+
u8 maxstacksize;
104+
LuaDebugInfo debugInfo;
105+
LuaConstants luaConstants;
106+
Vector<u32> code;
107+
};
108+
109+
LuaFunction toplevelFunction @ 22;

0 commit comments

Comments
 (0)