-
Notifications
You must be signed in to change notification settings - Fork 29
/
default.h
134 lines (127 loc) · 4.1 KB
/
default.h
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#pragma once
#include "../../runtime/parser/config.h"
#include "../../runtime/logging.h"
#include "../../runtime/diagnostics/diag_info.h"
#include "../../runtime/confighost.h"
#include "../../runtime/fileio.h"
#include "../../runtime/util.h"
#include <string>
#include <string_view>
#include <vector>
namespace sqf::parser::config
{
class impl_default: public ::sqf::runtime::parser::config, public CanLog
{
public:
enum class nodetype
{
NA = 0,
NODELIST,
NODE,
CONFIGNODE,
CONFIGNODE_PARENTIDENT,
VALUENODE,
VALUENODE_ADDARRAY,
DELETENODE,
STRING,
NUMBER,
HEXNUMBER,
LOCALIZATION,
ARRAY,
VALUE
};
struct astnode : ::sqf::runtime::diagnostics::diag_info
{
std::string content;
nodetype kind;
std::vector<astnode> children;
astnode(const ::sqf::runtime::diagnostics::diag_info& base) : kind(nodetype::NA)
{
line = base.line;
column = base.column;
adjusted_offset = base.adjusted_offset;
file_offset = base.file_offset;
path = base.path;
code_segment = base.code_segment;
length = base.length;
}
astnode() : ::sqf::runtime::diagnostics::diag_info(), kind(nodetype::NA) {}
};
private:
class instance
{
private:
impl_default& owner;
#ifdef DF__SQF_CONFIG__REPORT_PROGRESS_BY_LINE
size_t ___dbg_line_count;
#endif // DF__SQF_CONFIG__REPORT_PROGRESS_BY_LINE
public:
instance(
impl_default& owner,
std::string& contents,
::sqf::runtime::fileio::pathinfo file
) : owner(owner),
m_contents(contents),
m_file(file)
{
::sqf::runtime::diagnostics::diag_info dinf(1, 0, 0, m_file, {});
m_info = dinf;
}
::sqf::runtime::diagnostics::diag_info m_info;
::sqf::parser::util::string_ref m_contents;
::sqf::runtime::fileio::pathinfo m_file;
void skip();
size_t endchr(size_t off);
size_t identifier(size_t off);
size_t operator_(size_t off);
size_t hexadecimal(size_t off);
size_t numsub(size_t off);
size_t num(size_t off);
size_t anytext(size_t off);
bool NODELIST_start(size_t curoff);
void NODELIST(::sqf::parser::config::impl_default::astnode& root, bool& errflag);
bool NODE_start(size_t curoff);
void NODE(::sqf::parser::config::impl_default::astnode& root, bool& errflag);
bool CONFIGNODE_start(size_t curoff);
void CONFIGNODE(::sqf::parser::config::impl_default::astnode& root, bool& errflag);
bool DELETENODE_start(size_t curoff);
void DELETENODE(::sqf::parser::config::impl_default::astnode& root, bool& errflag);
bool VALUENODE_start(size_t curoff);
void VALUENODE(::sqf::parser::config::impl_default::astnode& root, bool& errflag);
bool STRING_start(size_t curoff);
void STRING(::sqf::parser::config::impl_default::astnode& root, bool& errflag);
bool NUMBER_start(size_t curoff);
void NUMBER(::sqf::parser::config::impl_default::astnode& root, bool& errflag);
bool LOCALIZATION_start(size_t curoff);
void LOCALIZATION(::sqf::parser::config::impl_default::astnode& root, bool& errflag);
bool ARRAY_start(size_t curoff);
void ARRAY(::sqf::parser::config::impl_default::astnode& root, bool& errflag);
bool VALUE_start(size_t curoff);
void VALUE(::sqf::parser::config::impl_default::astnode& root, bool& errflag);
::sqf::parser::config::impl_default::astnode parse(bool& errflag);
};
bool apply_to_confighost(::sqf::parser::config::impl_default::astnode& node, ::sqf::runtime::confighost& confighost, ::sqf::runtime::confignav parent);
public:
impl_default(Logger& logger) : CanLog(logger) { }
virtual ~impl_default() override { };
virtual bool check_syntax(std::string contents, ::sqf::runtime::fileio::pathinfo pathinfo) override
{
instance i(*this, contents, pathinfo);
bool errflag = false;
auto root = i.parse(errflag);
return !errflag;
}
virtual bool parse(::sqf::runtime::confighost& target, std::string contents, ::sqf::runtime::fileio::pathinfo pathinfo) override
{
instance i(*this, contents, pathinfo);
bool errflag = false;
auto root = i.parse(errflag);
if (errflag)
{
return {};
}
auto conf_root = target.root();
return apply_to_confighost(root, target, conf_root);
}
};
}