1 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 2 // -*- mode: C++ -*- 3 // 4 // Copyright (C) 2013-2020 Red Hat, Inc. 5 6 /// @file 7 8 #ifndef __ABG_LIBXML_UTILS_H__ 9 #define __ABG_LIBXML_UTILS_H__ 10 11 #include <libxml/xmlreader.h> 12 13 #include <istream> 14 #include <memory> 15 16 #include "abg-sptr-utils.h" 17 18 namespace abigail 19 { 20 21 /// Internal namespace for xml manipulation utilities. 22 namespace xml 23 { 24 25 using sptr_utils::build_sptr; 26 using std::shared_ptr; 27 28 /// A convenience typedef for a shared pointer of xmlTextReader. 29 typedef shared_ptr<xmlTextReader> reader_sptr; 30 31 /// A convenience typedef for a shared pointer of xmlChar. 32 typedef shared_ptr<xmlChar> xml_char_sptr; 33 34 /// This functor is used to instantiate a shared_ptr for the 35 /// xmlTextReader. 36 struct textReaderDeleter 37 { 38 void operatortextReaderDeleter39 operator()(xmlTextReaderPtr reader) 40 {xmlFreeTextReader(reader);} 41 }; 42 43 /// This functor is used to instantiate a shared_ptr for xmlChar 44 struct charDeleter 45 { 46 void operatorcharDeleter47 operator()(xmlChar* str) 48 { xmlFree(str); } 49 }; 50 51 reader_sptr new_reader_from_file(const std::string& path); 52 reader_sptr new_reader_from_buffer(const std::string& buffer); 53 reader_sptr new_reader_from_istream(std::istream*); 54 bool xml_char_sptr_to_string(xml_char_sptr, std::string&); 55 56 int get_xml_node_depth(xmlNodePtr); 57 58 /// Get the name of the current element node the reader is pointing 59 /// to. Note that this macro returns an instance of 60 /// shared_ptr<xmlChar> so that the caller doesn't have to worry about 61 /// managing memory itself. Also note that the reader is a 62 /// shared_ptr<xmlTextReader> 63 #define XML_READER_GET_NODE_NAME(reader) \ 64 xml::build_sptr(xmlTextReaderName(reader.get())) 65 66 /// Get the type of the current node of the shared_ptr<xmlTextReader> 67 /// passed in argument. 68 #define XML_READER_GET_NODE_TYPE(reader) \ 69 static_cast<xmlReaderTypes> (xmlTextReaderNodeType(reader.get())) 70 71 /// Get the value of attribute 'name' on the current node of 'reader' 72 /// which is an instance of shared_ptr<xmlTextReader>. 73 #define XML_READER_GET_ATTRIBUTE(reader, name) \ 74 xml::build_sptr(xmlTextReaderGetAttribute(reader.get(), BAD_CAST(name))) 75 76 /// Get the value of attribute 'name' ont the instance of xmlNodePtr 77 /// denoted by 'node'. 78 #define XML_NODE_GET_ATTRIBUTE(node, name) \ 79 xml::build_sptr(xmlGetProp(node, BAD_CAST(name))) 80 81 #define CHAR_STR(xml_char_str) \ 82 reinterpret_cast<char*>(xml_char_str.get()) 83 84 xmlNodePtr 85 advance_to_next_sibling_element(xmlNodePtr node); 86 87 void 88 escape_xml_string(const std::string& str, 89 std::string& escaped); 90 91 std::string 92 escape_xml_string(const std::string& str); 93 94 void 95 escape_xml_comment(const std::string& str, 96 std::string& escaped); 97 98 std::string 99 escape_xml_comment(const std::string& str); 100 101 void 102 unescape_xml_string(const std::string& str, 103 std::string& escaped); 104 105 std::string 106 unescape_xml_string(const std::string& str); 107 108 void 109 unescape_xml_comment(const std::string& str, 110 std::string& escaped); 111 112 std::string 113 unescape_xml_comment(const std::string& str); 114 115 }//end namespace xml 116 117 namespace sptr_utils 118 { 119 /// Specialization of sptr_utils::build_sptr for xmlTextReader 120 template<> 121 xml::reader_sptr 122 build_sptr<xmlTextReader>(xmlTextReader *p); 123 124 /// Specialization of build_str for xmlChar. 125 template<> 126 xml::xml_char_sptr 127 build_sptr<xmlChar>(xmlChar *p); 128 }// end namespace sptr_utils 129 130 }//end namespace abigail 131 #endif //__ABG_LIBXML_UTILS_H__ 132