-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathlua4dec.cpp
More file actions
73 lines (58 loc) · 1.46 KB
/
lua4dec.cpp
File metadata and controls
73 lines (58 loc) · 1.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include "lua4dec.hpp"
Vector<Byte> read_file(const char* filename)
{
auto* stream = fopen(filename, "rb");
if(stream == nullptr)
{
return {};
}
fseek(stream, 0, SEEK_END);
auto len = ftell(stream);
fseek(stream, 0, SEEK_SET);
auto buffer = Vector<Byte>(len);
auto bytes_read = (long)fread(buffer.data(), 1, len, stream);
fclose(stream);
if(len != bytes_read)
{
printf("Reading error %ld != %ld.\n", len, bytes_read);
return {};
}
return buffer;
}
void write_file(const char* filename, Ast const* const ast)
{
auto* stream = fopen(std::string(filename).append(".lua").c_str(), "w+");
print_ast(ast, stream);
fclose(stream);
}
Status create_ast(Ast*& ast, const char* filename)
{
auto buffer = read_file(filename);
auto* iter = buffer.data();
auto chunk = read_chunk(iter);
auto state = State();
return parse_function(state, ast, chunk.main);
}
void delete_ast(Ast*& ast)
{
while(ast->child)
{
ast = ast->child;
}
while(ast->parent)
{
ast = ast->parent;
delete ast->child;
}
}
Status parse(Ast*& ast, const char* filename, FILE* stream)
{
auto buffer = read_file(filename);
auto* iter = buffer.data();
auto chunk = read_chunk(iter);
auto state = State();
auto error = parse_function(state, ast, chunk.main);
if(error != Status::OK)
print_ast(ast, stream);
return error;
}