Claw  1.7.3
configuration_file.hpp
Go to the documentation of this file.
1 /*
2  CLAW - a C++ Library Absolutely Wonderful
3 
4  CLAW is a free library without any particular aim but being useful to
5  anyone.
6 
7  Copyright (C) 2005-2011 Julien Jorge
8 
9  This library is free software; you can redistribute it and/or
10  modify it under the terms of the GNU Lesser General Public
11  License as published by the Free Software Foundation; either
12  version 2.1 of the License, or (at your option) any later version.
13 
14  This library is distributed in the hope that it will be useful,
15  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17  Lesser General Public License for more details.
18 
19  You should have received a copy of the GNU Lesser General Public
20  License along with this library; if not, write to the Free Software
21  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
22 
23  contact: julien.jorge@gamned.org
24 */
30 #ifndef __CLAW_CONFIGURATION_FILE_HPP__
31 #define __CLAW_CONFIGURATION_FILE_HPP__
32 
33 #include <claw/iterator.hpp>
34 #include <claw/functional.hpp>
35 
36 #include <iostream>
37 #include <map>
38 #include <string>
39 
40 namespace claw
41 {
47  {
48  public:
51  {
52  public:
54  typedef std::pair<char, char> paired_symbol;
55 
56  public:
58 
59  std::string make_comment( const std::string& value ) const;
60  std::string make_assignment
61  ( const std::string& key, const std::string& value ) const;
62  std::string make_section_name( const std::string& name ) const;
63 
64  public:
66  char comment;
67 
69  char assignment;
70 
73 
74  }; // struct syntax_descritpion
75 
76  private:
78  typedef std::multimap<std::string, std::string> section_content;
79 
81  typedef std::map<std::string, section_content> file_content;
82 
84  typedef section_content* section_content_ptr;
85 
86  public:
89  < const file_content::key_type,
90  file_content::const_iterator,
92  >::iterator_type const_file_iterator;
93 
96  < const section_content::key_type,
97  section_content::const_iterator,
99  >::iterator_type const_section_iterator;
100 
105  {
106  private:
108  typedef section_content::const_iterator wrapped_iterator_type;
109 
110  public:
111  typedef std::string value_type;
112  typedef const value_type& reference;
113  typedef const value_type* pointer;
114  typedef wrapped_iterator_type::difference_type difference_type;
115 
116  typedef wrapped_iterator_type::iterator_category iterator_category;
117 
118  public:
120  const_field_iterator( wrapped_iterator_type it ) : m_iterator(it) {}
121 
122  bool operator==( const const_field_iterator& that ) const
123  {
124  return m_iterator == that.m_iterator;
125  } // operator==()
126 
127  bool operator!=( const const_field_iterator& that ) const
128  {
129  return m_iterator != that.m_iterator;
130  } // operator!=()
131 
132  const_field_iterator& operator++()
133  {
134  ++m_iterator;
135  return *this;
136  } // operator++()
137 
138  const_field_iterator operator++(int)
139  {
140  const_field_iterator tmp(*this);
141  ++m_iterator;
142  return tmp;
143  } // operator++() [post]
144 
145  const_field_iterator& operator--()
146  {
147  --m_iterator;
148  return *this;
149  } // operator--()
150 
151  const_field_iterator operator--(int)
152  {
153  const_field_iterator tmp(*this);
154  --m_iterator;
155  return tmp;
156  } // operator--() [post]
157 
158  reference operator*() const
159  {
160  return m_iterator->second;
161  } // operator*()
162 
163  pointer operator->() const
164  {
165  return &m_iterator->second;
166  } // operator->()
167 
168  private:
170  wrapped_iterator_type m_iterator;
171 
172  }; // class const_field_iterator
173 
174  public:
177  (std::istream& is, const syntax_description& syntax = syntax_description());
178 
179  bool open
180  (std::istream& is, const syntax_description& syntax = syntax_description());
181  void save
182  (std::ostream& os, const syntax_description& syntax = syntax_description());
183 
184  const std::string&
185  operator()( const std::string& section, const std::string& field ) const;
186 
187  const std::string& operator()( const std::string& field ) const;
188 
189  bool has_field
190  ( const std::string& section, const std::string& field ) const;
191  bool has_field( const std::string& field ) const;
192 
193  void set_value
194  ( const std::string& section, const std::string& field,
195  const std::string& val );
196  void set_value( const std::string& field, const std::string& val );
197 
198  void add_value
199  ( const std::string& section, const std::string& field,
200  const std::string& val );
201  void add_value( const std::string& field, const std::string& val );
202 
203  void clear_section( const std::string& section );
204 
206  field_begin( const std::string& section, const std::string& field ) const;
208  field_end( const std::string& section, const std::string& field ) const;
209 
210  const_field_iterator field_begin( const std::string& field ) const;
211  const_field_iterator field_end( const std::string& field ) const;
212 
215 
216  const_section_iterator section_begin( const std::string& section ) const;
217  const_section_iterator section_end( const std::string& section ) const;
218 
221 
222  private:
223  bool get_line( std::istream& is, const syntax_description& syntax,
224  std::string& line ) const;
225  bool
226  process_line( const std::string& line, const syntax_description& syntax,
227  section_content_ptr& section );
228 
229  void escape_line( std::istream& is, const syntax_description& syntax,
230  std::string& line ) const;
231 
232  void escape_char
233  ( char escaped, const syntax_description& syntax, std::string& str ) const;
234 
235  void save_section_content
236  ( const section_content& c, std::ostream& os,
237  const syntax_description& syntax ) const;
238 
239  private:
241  section_content m_noname_section;
242 
244  file_content m_sections;
245 
247  static const std::string s_unknow_field_value;
248 
249  }; // class configuration_file
250 } // namespace claw
251 
252 #endif // __CLAW_CONFIGURATION_FILE_HPP__
claw::configuration_file::file_end
const_file_iterator file_end() const
Get an iterator just past the last named section.
Definition: configuration_file.cpp:429
claw::configuration_file::clear_section
void clear_section(const std::string &section)
Remove a section and its fields.
Definition: configuration_file.cpp:291
claw::const_pair_first
Fuction object to get the first element of a std::pair.
Definition: functional.hpp:92
iterator.hpp
Some special kind of iterators. As an example: iterator on the keys of a map.
claw::configuration_file::open
bool open(std::istream &is, const syntax_description &syntax=syntax_description())
Read the configuration from a stream.
Definition: configuration_file.cpp:113
claw::configuration_file::section_end
const_section_iterator section_end() const
Get an iterator past the last field name of a section.
Definition: configuration_file.cpp:377
claw::configuration_file::save
void save(std::ostream &os, const syntax_description &syntax=syntax_description())
Write the configuration in a stream.
Definition: configuration_file.cpp:137
claw
This is the main namespace.
Definition: algorithm.hpp:33
claw::configuration_file::file_begin
const_file_iterator file_begin() const
Get an iterator on the first named section.
Definition: configuration_file.cpp:419
claw::configuration_file::add_value
void add_value(const std::string &section, const std::string &field, const std::string &val)
Add a value to a field.
Definition: configuration_file.cpp:267
claw::configuration_file
A class to get the content of a configuration file.
Definition: configuration_file.hpp:46
claw::configuration_file::configuration_file
configuration_file()
Default constructor.
Definition: configuration_file.cpp:89
claw::configuration_file::syntax_description::syntax_description
syntax_description()
Default constructor.
Definition: configuration_file.cpp:38
functional.hpp
Some function object classes.
claw::wrapped_iterator
This class defines an iterator resulting of the appliance of a function to an effective iterator.
Definition: iterator.hpp:361
claw::configuration_file::syntax_description::make_comment
std::string make_comment(const std::string &value) const
Create a comment from a string.
Definition: configuration_file.cpp:50
claw::configuration_file::syntax_description::make_assignment
std::string make_assignment(const std::string &key, const std::string &value) const
Make an assignment of a value to a key.
Definition: configuration_file.cpp:62
claw::configuration_file::syntax_description
This class tells us how to parse the input file.
Definition: configuration_file.hpp:50
claw::configuration_file::const_section_iterator
claw::wrapped_iterator< const section_content::key_type, section_content::const_iterator, const_pair_first< section_content::value_type > >::iterator_type const_section_iterator
Iterator on the fields of a section.
Definition: configuration_file.hpp:99
claw::wrapped_iterator_by_category
Base class for wrapped iterators.
Definition: iterator.hpp:45
claw::configuration_file::section_begin
const_section_iterator section_begin() const
Get an iterator on the field names of a section.
Definition: configuration_file.cpp:365
claw::configuration_file::syntax_description::section_name
paired_symbol section_name
Pair of symbols around a section name.
Definition: configuration_file.hpp:72
claw::configuration_file::has_field
bool has_field(const std::string &section, const std::string &field) const
Tell if a field exists.
Definition: configuration_file.cpp:203
claw::configuration_file::set_value
void set_value(const std::string &section, const std::string &field, const std::string &val)
Set the value of a field.
Definition: configuration_file.cpp:230
claw::configuration_file::syntax_description::assignment
char assignment
Symbol used to assign a value to a field.
Definition: configuration_file.hpp:69
claw::configuration_file::syntax_description::make_section_name
std::string make_section_name(const std::string &name) const
Create a section name from a string.
Definition: configuration_file.cpp:73
claw::configuration_file::field_begin
const_field_iterator field_begin(const std::string &section, const std::string &field) const
Get an iterator on the first value set for a field.
Definition: configuration_file.cpp:304
claw::configuration_file::field_end
const_field_iterator field_end(const std::string &section, const std::string &field) const
Get an iterator past the last value set for a field.
Definition: configuration_file.cpp:322
claw::configuration_file::syntax_description::paired_symbol
std::pair< char, char > paired_symbol
Two symbols making a pair (like () or []).
Definition: configuration_file.hpp:54
claw::configuration_file::operator()
const std::string & operator()(const std::string &section, const std::string &field) const
Get the value of a field.
Definition: configuration_file.cpp:161
claw::configuration_file::const_file_iterator
claw::wrapped_iterator< const file_content::key_type, file_content::const_iterator, const_pair_first< file_content::value_type > >::iterator_type const_file_iterator
Iterator on the name of the sections.
Definition: configuration_file.hpp:92
claw::configuration_file::const_field_iterator
This class is an iterator on the values set for a same field name.
Definition: configuration_file.hpp:104
claw::configuration_file::syntax_description::comment
char comment
Symbol used to comment the rest of the line.
Definition: configuration_file.hpp:66