// -*- mode: C++ -*- // // Copyright (C) 2013 Red Hat, Inc. // // This file is part of the GNU Application Binary Interface Generic // Analysis and Instrumentation Library (libabigail). This library is // free software; you can redistribute it and/or modify it under the // terms of the GNU Lesser General Public License as published by the // Free Software Foundation; either version 3, or (at your option) any // later version. // This library is distributed in the hope that it will be useful, but // WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // General Lesser Public License for more details. // You should have received a copy of the GNU Lesser General Public // License along with this program; see the file COPYING-LGPLV3. If // not, see . /// @file #include #include namespace abigail { /// Internal namespace for xml. namespace xml { using std::tr1::shared_ptr; /// This functor is used to instantiate a shared_ptr for the /// xmlTextReader. struct textReaderDeleter { void operator()(xmlTextReaderPtr reader) { xmlFreeTextReader(reader); } }; typedef shared_ptr reader_sptr; /// This functor is used to instantiate a shared_ptr for xmlChar struct charDeleter { void operator()(xmlChar* str) { xmlFree(str); } }; typedef shared_ptr xml_char_sptr; reader_sptr new_reader_from_file(const std::string& path); xml_char_sptr build_xml_char_sptr(xmlChar*); template shared_ptr build_sptr(T*); /// Specialization of build_sptr for xmlTextReader template<> shared_ptr build_sptr(xmlTextReader *p); /// Specialization of build_str for xmlChar. template<> shared_ptr build_sptr(xmlChar *p); int get_xml_node_depth(xmlNodePtr); /// Get the name of the current element node the reader is pointing /// to. Note that this macro returns an instance of /// shared_ptr so that the caller doesn't have to worry about /// managing memory itself. Also note that the reader is a /// shared_ptr #define XML_READER_GET_NODE_NAME(reader) \ xml::build_sptr(xmlTextReaderName(reader.get())) /// Get the type of the current node of the shared_ptr /// passed in argument. #define XML_READER_GET_NODE_TYPE(reader) \ static_cast (xmlTextReaderNodeType(reader.get())) /// Get the value of attribute 'name' on the current node of 'reader' /// which is an instance of shared_ptr. #define XML_READER_GET_ATTRIBUTE(reader, name) \ xml::build_sptr(xmlTextReaderGetAttribute(reader.get(), BAD_CAST(name))) /// Get the value of attribute 'name' ont the instance of xmlNodePtr /// denoted by 'node'. #define XML_NODE_GET_ATTRIBUTE(node, name) \ xml::build_sptr(xmlGetProp(node, BAD_CAST(name))) #define CHAR_STR(xml_char_str) \ reinterpret_cast(xml_char_str.get()) }//end namespace xml }//end namespace abigail