16 #ifndef __NODAMUSHI_SVD_EXPAT_HPP__ 17 #define __NODAMUSHI_SVD_EXPAT_HPP__ 29 namespace expat_handler{
34 const XML_Char *name,
const XML_Char **attributes)
36 auto& e = ptr->add_child(std::string(name));
37 while(attributes!=
nullptr){
38 const XML_Char* n = *attributes;
39 if(n ==
nullptr)
break;
41 const XML_Char* v = *attributes;
42 if(v ==
nullptr)
break;
44 e.add_attribute(std::string(n),std::string(v));
51 const XML_Char *name,
const XML_Char **attributes)
53 UD* ptr= reinterpret_cast<UD*>(user_data);
54 auto* c = ptr->get_active_open_element();
55 if(c ==
nullptr)
add_child(ptr,name,attributes);
64 UD* ptr= reinterpret_cast<UD*>(user_data);
65 auto* c = ptr->get_active_open_element();
76 const XML_Char *data,
int len)
78 UD* ptr= reinterpret_cast<UD*>(user_data);
79 auto* c = ptr->get_active_open_element();
81 c->add_value(data,(
size_t)len);
114 fname(throw_error?file_name:
"")
117 file = std::fopen(file_name.data(),
"r");
120 parser = XML_ParserCreate( NULL );
121 XML_SetElementHandler(parser,
122 expat_handler::element_start<expat_svd_reader>,
123 expat_handler::element_end<expat_svd_reader>);
124 XML_SetCharacterDataHandler(parser,expat_handler::element_char<expat_svd_reader>);
125 XML_SetUserData(parser,
this);
135 bool ok()
const {
return _ok;}
139 parser(
std::move(d.parser)),
145 XML_SetUserData(parser,
this);
160 XML_ParserFree(parser);
172 size_t len = std::fread(buffer,
sizeof(
char),
BUFFER_SIZE,file);
174 if(XML_Parse(parser,buffer,len,eof) == XML_STATUS_ERROR){
201 #endif // __NODAMUSHI_SVD_EXPAT_HPP__
static bool check(const std::string &file_name, bool throw_exception)
void read()
svd_reader_base interface function
SVD reader with Expat(https://github.com/libexpat/libexpat)
void XMLCALL element_char(void *user_data, const XML_Char *data, int len)
void add_child(P *ptr, const XML_Char *name, const XML_Char **attributes)
expat_svd_reader(const std::string &file_name, bool throw_error=false)
void XMLCALL element_start(void *user_data, const XML_Char *name, const XML_Char **attributes)
svd_reader base class for stream type parser subclasses must be implements read method and is_end met...
void XMLCALL element_end(void *user_data, const XML_Char *name)
expat_svd_reader & operator=(const expat_svd_reader &)=delete
expat_svd_reader(expat_svd_reader &&d)
bool is_end()
svd_reader_base interface function
static xml_parse_exception make(const std::string &file, size_t file_line=UNKNOWN_FILE_LINE)
static constexpr size_t BUFFER_SIZE