-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.cpp
86 lines (68 loc) · 1.98 KB
/
main.cpp
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
74
75
76
77
78
79
80
81
82
83
84
85
86
#include "mimalloc-new-delete.h"
#include <iostream>
#include <string_view>
#include "clau_parser.h"
inline std::string_view toStringView(long long token, const char* buffer) {
return std::string_view(buffer + clau_parser::Utility::GetIdx(token),
clau_parser::Utility::GetLength(token));
}
inline std::string toString(long long token, const char* buffer) {
return std::string(buffer + clau_parser::Utility::GetIdx(token),
clau_parser::Utility::GetLength(token));
}
inline bool match(long long token, const char* buffer, std::string_view str) {
return toStringView(token, buffer) == str;
}
void G(const char* buffer, long long* tokens, long long tokens_size, long long idx, long long var, long long val, clau_parser::Maker* m) {
if (tokens_size <= idx) {
return;
}
if (match(tokens[idx], buffer, "{"sv)) {
if (var) {
m->NewGroup(toString(var, buffer));
var = 0;
}
else {
m->NewGroup("");
}
val = 0;
return G(buffer, tokens, tokens_size, idx + 1, var, val, m);
}
if (match(tokens[idx], buffer, "}"sv)) {
m->EndGroup();
return G(buffer, tokens, tokens_size, idx + 1, var, val, m);
}
if (idx + 1 < tokens_size) {
if (match(tokens[idx + 1], buffer, "="sv)) {
var = tokens[idx];
val = 0;
return G(buffer, tokens, tokens_size, idx + 2, var, val, m);
}
}
val = tokens[idx];
if (var) {
m->NewItem(toString(var, buffer), toString(val, buffer));
}
else {
m->NewItem("", toString(val, buffer));
}
var = 0;
val = 0;
return G(buffer, tokens, tokens_size, idx + 1, var, val, m);
}
int main(void) {
FILE* file;
fopen_s(&file, "input.eu4", "rb");
clau_parser::InFileReserver test(file, false);
char* buffer;
size_t buffer_len;
long long* tokens;
size_t tokens_len;
test(8, buffer, &buffer_len, tokens, &tokens_len);
clau_parser::Maker m;
int a = clock();
G(buffer, tokens, tokens_len, 0, 0, 0, &m);
int b = clock();
std::cout << b - a << "ms\n";
return 0;
}