forked from raduprv/Eternal-Lands
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathxmlhelper.cpp
153 lines (133 loc) · 2.54 KB
/
xmlhelper.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
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/*
* xml helper
* Copyright (C) Daniel Jungmann 2007 <[email protected]>
*
*/
#include "xmlhelper.hpp"
namespace eternal_lands
{
xmlNodePtr get_next_element_node(const xmlNodePtr cur_node)
{
if (cur_node == 0)
{
EXTENDED_EXCEPTION(ExtendedException::ec_item_not_found, "Node is zero");
}
else
{
xmlNodePtr next_node;
next_node = cur_node->next;
while (next_node)
{
if (next_node->type == XML_ELEMENT_NODE)
{
return next_node;
}
else
{
next_node = next_node->next;
}
}
return 0;
}
}
xmlNodePtr get_node_element_children(const xmlNodePtr cur_node)
{
if (cur_node == 0)
{
EXTENDED_EXCEPTION(ExtendedException::ec_item_not_found, "Node is zero");
}
else
{
xmlNodePtr next_node;
next_node = cur_node->children;
while (next_node)
{
if (next_node->type == XML_ELEMENT_NODE)
{
return next_node;
}
else
{
next_node = next_node->next;
}
}
return 0;
}
}
bool is_node(const xmlNodePtr cur_node, const std::string &name)
{
if (cur_node != 0)
{
return get_node_name(cur_node) == name;
}
else
{
return false;
}
}
bool is_node(xmlTextReaderPtr reader, const std::string &name)
{
if (reader != 0)
{
return xmlStrcmp(reinterpret_cast<const xmlChar*>(name.c_str()), xmlTextReaderConstName(reader)) == 0;
}
else
{
return false;
}
}
std::string get_node_name(const xmlNodePtr cur_node)
{
if (cur_node == 0)
{
EXTENDED_EXCEPTION(ExtendedException::ec_item_not_found, "Node is zero");
}
else
{
return reinterpret_cast<const char*>(cur_node->name);
}
}
static inline void reader_read_helper(xmlTextReaderPtr reader)
{
if (reader == 0)
{
EXTENDED_EXCEPTION(ExtendedException::ec_internal_error, "Reader is zero");
}
else
{
switch (xmlTextReaderRead(reader))
{
case 0:
EXTENDED_EXCEPTION(ExtendedException::ec_item_not_found,
"Nothing to parse any more");
case 1:
break;
default:
EXTENDED_EXCEPTION(ExtendedException::ec_io_error,
"XML parser error");
}
}
}
void reader_read(xmlTextReaderPtr reader, bool ignore_whitespace)
{
reader_read_helper(reader);
if (ignore_whitespace)
{
while (xmlTextReaderNodeType(reader) ==
XML_READER_TYPE_SIGNIFICANT_WHITESPACE)
{
reader_read_helper(reader);
}
}
}
bool reader_read_next(xmlTextReaderPtr reader)
{
int ret;
ret = xmlTextReaderNext(reader);
if (ret < 0)
{
EXTENDED_EXCEPTION(ExtendedException::ec_io_error, "XML parser error");
}
return ret == 1;
}
}