// -*- Mode: C++ -*- // // Copyright (C) 2013-2014 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 . // // Author: Dodji Seketeli /// @file /// /// This file contains the declarations for the ini file reader used in /// the libabigail library. #ifndef __ABG_INI_H__ #define __ABG_INI_H__ #include #include #include #include #include namespace abigail { /// Namespace for handling ini-style files namespace ini { // Inject some standard types in this namespace. using std::tr1::shared_ptr; using std::string; using std::vector; using std:: pair; class config; /// A convenience typedef for a shared pointer to @ref config typedef shared_ptr config_sptr; /// The abstraction of the structured content of an .ini file. This /// roughly follows what is explained at /// http://en.wikipedia.org/wiki/INI_file. class config { class priv; typedef shared_ptr priv_sptr; public: class section; /// A convenience typedef for a shared pointer to a config::section. typedef shared_ptr
section_sptr; /// A convenience typedef for a vector of config::section_sptr. typedef vector sections_type; /// A convenience typedef for a pair of strings representing a /// property that lies inside a section. The first element of the /// pair is the property name, and the second is the property value. typedef std::pair property; /// A convenience typedef for a shared pointer to a @ref property. typedef shared_ptr property_sptr; /// A convenience typedef for a vector of @ref property_sptr typedef vector property_vector; private: priv_sptr priv_; public: config(); config(const string& path, sections_type& sections); virtual ~config(); const string& get_path() const; void set_path(const string& path); const sections_type& get_sections() const; void set_sections(const sections_type& sections); }; // end class config /// The abstraction of one section of the .ini config. class config::section { struct priv; typedef shared_ptr priv_sptr; priv_sptr priv_; // Forbid this section(); public: section(const string& name); section(const string& name, const property_vector& properties); const string& get_name() const; const property_vector& get_properties() const; void set_properties(const property_vector& properties); void add_property(const property_sptr prop); property_sptr find_property(const string& prop_name) const; virtual ~section(); }; //end class config::section bool read_sections(std::istream& input, config::sections_type& sections); bool read_sections(const string& path, config::sections_type& sections); bool read_config(std::istream& input, config& conf); config_sptr read_config(std::istream& input); bool read_config(const string& path, config& conf); config_sptr read_config(const string& path); bool write_sections(const config::sections_type& sections, std::ostream& output); bool write_sections(const config::sections_type& sections, const string& path); bool write_config(const config& conf, std::ostream& output); bool write_config(const config& conf, const string& path); }// end namespace ini }// end namespace abigail #endif // __ABG_INI_H__