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
|
#include "saxparser.h"
#include <stdio.h>
#include <string.h>
#include <hugin.hpp>
SAXParser::SAXParser()
{
p = XML_ParserCreate(nullptr);
if(!p) {
ERR(sax, "Couldn't allocate memory for parser\n");
return;
}
XML_SetUserData(p, this);
XML_UseParserAsHandlerArg(p);
XML_SetElementHandler(p, start_hndl, end_hndl);
XML_SetCharacterDataHandler(p, character_hndl);
}
SAXParser::~SAXParser()
{
XML_ParserFree(p);
}
int SAXParser::parse()
{
DEBUG(sax, "parse()\n");
std::string buf;
int len;
do {
len = readData(buf, 32);
if(len <= -1) {
parseError("", 0, "Could not read data", 0);
return 1;
}
if(!XML_Parse(p, (char*)buf.c_str(), len, len == 0)) {
parseError(buf, len, XML_ErrorString(XML_GetErrorCode(p)),
(int)XML_GetCurrentLineNumber(p));
return 1;
}
buf.clear();
} while(len);
return 0;
}
int SAXParser::parse(const std::string& buffer)
{
DEBUG(sax, "parse(buffer %d bytes)\n", (int)buffer.length());
if(!XML_Parse(p, buffer.c_str(), buffer.length(), true)) {
parseError(buffer, buffer.length(),
XML_ErrorString(XML_GetErrorCode(p)),
(int)XML_GetCurrentLineNumber(p));
return 1;
}
return 0;
}
void SAXParser::parseError(const std::string& buf, std::size_t len, const std::string& error, std::size_t lineno)
{
fprintf(stderr, "SAXParser error at line %d: %s\n", (int)lineno, error.c_str());
fprintf(stderr, "Buffer %u bytes: \n[\n", (int)len);
fwrite((char*)buf.c_str(), len, 1, stderr);
fprintf(stderr, "\n]\n");
fflush(stderr);
}
void SAXParser::character_hndl(void* p, const XML_Char* s, int len)
{
SAXParser* parser = (SAXParser*)XML_GetUserData(p);
std::string chars(s, len);
parser->characterData(chars);
}
void SAXParser::start_hndl(void* p, const char* el, const char** attr)
{
SAXParser* parser = (SAXParser*)XML_GetUserData(p);
attr_t attributes;
while(*attr) {
std::string at_name = *attr++;
std::string at_value = *attr++;
attributes.emplace(at_name, at_value);
}
parser->startTag(std::string(el), attributes);
}
void SAXParser::end_hndl(void* p, const char* el)
{
SAXParser* parser = (SAXParser*)XML_GetUserData(p);
parser->endTag(std::string(el));
}
|