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