Loading...
Searching...
No Matches
ASSA::IniFile Class Reference

`#include <IniFile.h>`

## Public Types

typedef pair< string, string > | tuple_type
| A tuple is a name/value pair.
typedef pair< string, list< tuple_type > > | sect_type
| A section is a logical subcategory of related configuration information.
typedef list< sect_type > | config_type
| INI configuration is the collection of sections.
typedef config_type::iterator | config_iterator
| Mutable iterator over the list of configuration sections.
typedef config_type::const_iterator | const_config_iterator
| Constant iterator over the list of configuration sections.
typedef list< tuple_type >::iterator | tuple_iterator
| Mutable iterator over name/value pairs in a section.
typedef list< tuple_type >::const_iterator | const_tuple_iterator
| Constant iterator over name/value pairs in a section.

## Public Member Functions

| IniFile (const string &fname_)
| Do-nothing constructor.
| ~IniFile ()
| Destructor does not save cache data to the file.
bool | operator== (const IniFile &rhs_) const
| Compare two configurations.
bool | operator!= (const IniFile &rhs_) const
| Compare two configurations.
int | load ()
| Load configuration data from the file.
void | drop_all ()
| Clear up configuration cache.
int | sync ()
| Write cached configuration to the file.
int | sync (const string &fname_)
| Write cached configuration to the file fname_.
void | add_section (const string &section_)
| Add new section.
int | drop_section (const string &section_)
| Remove section from cache.
int | set_pair (const string &section_, const tuple_type &newkey_)
| Add or change name/value pair in the section.
int | drop_pair (const string &section_, const string &name_)
| Remove name/value pair from the section in cache.
string | get_value (const string &section_, const string &name_) const
| Find and return a value of the name/value pair in the section section_.
config_iterator | find_section (const string &section_)
| Find section by its name.
const_config_iterator | find_section (const string &section_) const
| Find section by its name.
const_config_iterator | sect_begin () const
| Return iterator to the first section.
config_iterator | sect_end ()
| Return iterator past the last section.
unsigned int | size () const
| Return number of sections in the cache.
void | dump () const
| Dump cache to the log file.

## Private Member Functions

int | trim_section_name (string &text_)
| Remove square brakets around section name.

## Private Attributes

string | m_fname
| INI file name.
std::fstream | m_stream
| File stream.
config_type | m_config
| Cache holds the entire INI file in memory.
Regexp | m_section_pttrn
| Section header match.
Regexp | m_tuple_pttrn
| Name/value pair match.
Regexp | m_comment_pttrn
| Comment match.

## Detailed Description

Definition at line 39 of file IniFile.h.

## Member Typedef Documentation

## config_iterator

typedef config_type::iterator ASSA::IniFile::config_iterator

Mutable iterator over the list of configuration sections.

Definition at line 56 of file IniFile.h.

## config_type

typedef list<sect_type> ASSA::IniFile::config_type

INI configuration is the collection of sections.

Definition at line 53 of file IniFile.h.

## const_config_iterator

typedef config_type::const_iterator ASSA::IniFile::const_config_iterator

Constant iterator over the list of configuration sections.

Definition at line 59 of file IniFile.h.

## const_tuple_iterator

typedef list<tuple_type>::const_iterator ASSA::IniFile::const_tuple_iterator

Constant iterator over name/value pairs in a section.

Definition at line 65 of file IniFile.h.

## sect_type

typedef pair<string, list<tuple_type> > ASSA::IniFile::sect_type

A section is a logical subcategory of related configuration information.

Definition at line 49 of file IniFile.h.

## tuple_iterator

typedef list<tuple_type>::iterator ASSA::IniFile::tuple_iterator

Mutable iterator over name/value pairs in a section.

Definition at line 62 of file IniFile.h.

## tuple_type

typedef pair<string, string> ASSA::IniFile::tuple_type

A tuple is a name/value pair.

Definition at line 44 of file IniFile.h.

## Constructor & Destructor Documentation

## IniFile()

IniFile::IniFile | ( | const string & | fname_ | ) |

Do-nothing constructor.

Parameters

  fname_ | Name of the INI file

Definition at line 22 of file IniFile.cpp.

:
m_fname (fname_),
m_section_pttrn ("\\[[a-zA-Z0-9]+.*] *$"),
m_tuple_pttrn ("^[ \t]*[a-zA-Z0-9]+.* *= *.*"),
m_comment_pttrn ("^#.*$")
{
trace_with_mask ("IniFile::IniFile", INIFILE);
}
trace_with_mask
#define trace_with_mask(s, m)
trace_with_mask() is used to trace function call chain in C++ program.
Definition Logger.h:437
ASSA::IniFile::m_tuple_pttrn
Regexp m_tuple_pttrn
Name/value pair match.
Definition IniFile.h:205
ASSA::IniFile::m_comment_pttrn
Regexp m_comment_pttrn
Comment match.
Definition IniFile.h:208
ASSA::IniFile::m_section_pttrn
Regexp m_section_pttrn
Section header match.
Definition IniFile.h:202
ASSA::IniFile::m_fname
string m_fname
INI file name.
Definition IniFile.h:193
ASSA::INIFILE
@ INIFILE
Class IniFile messages.
Definition LogMask.h:52

References ASSA::INIFILE, m_comment_pttrn, m_fname, m_section_pttrn, m_tuple_pttrn, and trace_with_mask.

Referenced by operator!=(), and operator==().

## ~IniFile()

IniFile::~IniFile | ( |  | ) |

Destructor does not save cache data to the file.

You should explicitly call sync() if you want your data to be saved to the file.

Definition at line 33 of file IniFile.cpp.

{
trace_with_mask ("IniFile::~IniFile", INIFILE);
m_config.clear ();
}
ASSA::IniFile::m_config
config_type m_config
Cache holds the entire INI file in memory.
Definition IniFile.h:199

References ASSA::INIFILE, m_config, and trace_with_mask.

## Member Function Documentation

## add_section()

void IniFile::add_section | ( | const string & | section_ | ) |

Add new section.

Parameters

  section_ | Section name to add

Definition at line 188 of file IniFile.cpp.

{
const_config_iterator i = find_section (section_);
if (i == m_config.end ()) {
m_config.push_back (sect_type (section_, std::list<tuple_type> ()));
}
}
ASSA::IniFile::const_config_iterator
config_type::const_iterator const_config_iterator
Constant iterator over the list of configuration sections.
Definition IniFile.h:59
ASSA::IniFile::find_section
config_iterator find_section(const string &section_)
Find section by its name.
Definition IniFile.cpp:199
ASSA::IniFile::sect_type
pair< string, list< tuple_type > > sect_type
A section is a logical subcategory of related configuration information.
Definition IniFile.h:49

References find_section(), and m_config.

## drop_all()

void ASSA::IniFile::drop_all | ( |  | ) |

inline

Clear up configuration cache.

Definition at line 100 of file IniFile.h.

{ m_config.clear (); }

References m_config.

## drop_pair()

int IniFile::drop_pair | ( | const string & | section_,
|  | const string & | name_ )

Remove name/value pair from the section in cache.

Parameters

  section_ | Section that holds name/value pair.
  name_ | Name part of name/value pair.

Returns
  0 on success; -1 if section_ or name_ was not found

Definition at line 266 of file IniFile.cpp.

{
trace_with_mask ("IniFile::drop_pair", INIFILE);
config_iterator i = find_section (section_);
if (i == sect_end ()) {
DL((INIFILE,"Section [%s] is not found!\n", section_.c_str ()));
return -1;
}
tuple_iterator j = (*i).second.begin ();
while (j != (*i).second.end ()) {
if ((*j).first == name_) {
(*i).second.erase (j);
return 0;
}
j++;
}
return -1;
}
DL
#define DL(X)
A macro for writing debug message to the Logger.
Definition Logger.h:273
ASSA::IniFile::config_iterator
config_type::iterator config_iterator
Mutable iterator over the list of configuration sections.
Definition IniFile.h:56
ASSA::IniFile::sect_end
config_iterator sect_end()
Return iterator past the last section.
Definition IniFile.h:174
ASSA::IniFile::tuple_iterator
list< tuple_type >::iterator tuple_iterator
Mutable iterator over name/value pairs in a section.
Definition IniFile.h:62

References DL, find_section(), ASSA::INIFILE, sect_end(), and trace_with_mask.

## drop_section()

int IniFile::drop_section | ( | const string & | section_ | ) |

Remove section from cache.

Parameters

  section_ | Section to remove

Returns
  0 on success; -1 if section was not found

Definition at line 251 of file IniFile.cpp.

{
trace_with_mask ("IniFile::drop_section", INIFILE);
config_iterator i = find_section (section_);
if (i == sect_end ()) {
DL((INIFILE,"Section [%s] is not found!\n", section_.c_str ()));
return -1;
}
m_config.erase (i);
return 0;
}

References DL, find_section(), ASSA::INIFILE, m_config, sect_end(), and trace_with_mask.

## dump()

void IniFile::dump | ( |  | ) | const

Dump cache to the log file.

Definition at line 140 of file IniFile.cpp.

{
trace_with_mask ("IniFile::dump", INIFILE);
const_config_iterator i = m_config.begin ();
const_tuple_iterator j;
DL((INIFILE,"============= Start =================\n"));
while (i != m_config.end ()) {
DL((INIFILE, "[%s]\n", (*i).first.c_str ()));
j = (*i).second.begin ();
while (j != (*i).second.end ()) {
DL((INIFILE, " %s=\%s\n",
(*j).first.c_str (), (*j).second.c_str ()));
j++;
}
i++;
}
DL((INIFILE,"============== End =================\n"));
}
ASSA::IniFile::const_tuple_iterator
list< tuple_type >::const_iterator const_tuple_iterator
Constant iterator over name/value pairs in a section.
Definition IniFile.h:65

References DL, ASSA::INIFILE, m_config, and trace_with_mask.

## find_section() [1/2]

IniFile::config_iterator IniFile::find_section | ( | const string & | section_ | ) |

Find section by its name.

Parameters

  section_ | Section name to earch for

Returns
  An iterator pointing to sect_type of the section if it is found or pointing to sect_end() if not.

Definition at line 198 of file IniFile.cpp.

{
config_iterator i = m_config.begin ();
while (i != m_config.end ()) {
if ((*i).first == section_) {
return (i);
}
i++;
}
return m_config.end ();
}

References m_config.

Referenced by add_section(), drop_pair(), drop_section(), ASSA::CmdLineOpts::parse_config_file(), and set_pair().

## find_section() [2/2]

IniFile::const_config_iterator IniFile::find_section | ( | const string & | section_ | ) | const

Find section by its name.

Parameters

  section_ | Section name to earch for

Returns
  An iterator pointing to the sect_type of the section if it is found or pointing to sect_end() if not.

Definition at line 213 of file IniFile.cpp.

{
const_config_iterator i = m_config.begin ();
while (i != m_config.end ()) {
if ((*i).first == section_) {
return (i);
}
i++;
}
return m_config.end ();
}

References m_config.

## get_value()

string IniFile::get_value | ( | const string & | section_,
|  | const string & | name_ ) const

Find and return a value of the name/value pair in the section section_.

Parameters

  section_ | Section name to search for name/value
  name_ | Name part of name/value pair

Returns
  value part of name/value; or an empty string if not found.

Definition at line 164 of file IniFile.cpp.

{
const_config_iterator i = m_config.begin ();
const_tuple_iterator j;
string ret ("");
while (i != m_config.end ()) {
if ((*i).first == section_) {
j = (*i).second.begin ();
while (j != (*i).second.end ()) {
if ((*j).first == name_) {
ret = (*j).second;
break;
}
j++;
}
}
i++;
}
return ret;
}

References m_config.

Referenced by ASSA::CmdLineOpts::parse_config_file().

## load()

int IniFile::load | ( |  | ) |

Load configuration data from the file.

The file name is specified in the constructor.

Returns
  0 on success; -1 if there was a syntax error.

From N.M.Josuttis, "The C++ Standard Library", Sec. 13.9 File Access:

"Clear eofbit and failbit set due to the end-of-file. Note that after the processing of a file, clear() must be called to clear the state flags that are set at end-of-file. This is required because the stream object is used for multiple files. open() NEVER clears any state flags. Thus, if a stream was not in a good state, after closing and reopening it, you still have to call clear() to get to a good state. This is also the case, if you open a different file."

Definition at line 41 of file IniFile.cpp.

{
trace_with_mask ("IniFile::load", INIFILE);
const int size = 1024;
char inbuf [size];
string line;
string name;
string value;
int ret = -1;
m_stream.open (m_fname.c_str (), std::ios::in);
if (!m_stream) {
goto done;
}
while (m_stream) {
m_stream.getline (inbuf, size, '\n');
DL((INIFILE,"Input: \"%s\"\n", inbuf));
if (::strlen (inbuf) == 0 || m_comment_pttrn.match (inbuf) == 0) {
continue;
}
line = inbuf;
if (m_section_pttrn.match (inbuf) == 0) {
if (trim_section_name (line) < 0) {
goto done;
}
m_config.push_back (sect_type (line, std::list<tuple_type> ()));
}
else if (m_tuple_pttrn.match (inbuf) == 0) {
if (Utils::split_pair (line, '=', name, value) < 0) {
goto done;
}
Utils::trim_sides (name);
Utils::trim_sides (value);
m_config.back ().second.push_back (tuple_type (name, value));
}
else {
goto done;
}
}
ret = 0;
done:
if (ret < 0) {
DL((INIFILE, "Parse error: illegal syntax!\n"));
}
m_stream.clear ();
m_stream.close ();
return ret;
}
ASSA::IniFile::m_stream
std::fstream m_stream
File stream.
Definition IniFile.h:196
ASSA::IniFile::trim_section_name
int trim_section_name(string &text_)
Remove square brakets around section name.
Definition IniFile.h:212
ASSA::IniFile::tuple_type
pair< string, string > tuple_type
A tuple is a name/value pair.
Definition IniFile.h:44
ASSA::IniFile::size
unsigned int size() const
Return number of sections in the cache.
Definition IniFile.h:178
ASSA::Utils::split_pair
int split_pair(const string &text_, char sep_, string &lhs_, string &rhs_)
Split input string into two parts separated by the separator character.
Definition CommonUtils.cpp:47
ASSA::Utils::trim_sides
void trim_sides(std::string &text_)
Trim white spaces and tabs from the beginning and the end of the text string.
Definition CommonUtils.cpp:93

References DL, ASSA::INIFILE, m_comment_pttrn, m_config, m_fname, m_section_pttrn, m_stream, m_tuple_pttrn, size(), ASSA::Utils::split_pair(), trace_with_mask, trim_section_name(), and ASSA::Utils::trim_sides().

## operator!=()

bool ASSA::IniFile::operator!= | ( | const IniFile & | rhs_ | ) | const

inline

Compare two configurations.

Returns
  true if two configurations are the same; false otherwise.

Definition at line 88 of file IniFile.h.

{ return (! (*this == rhs_)); }

References IniFile().

## operator==()

bool ASSA::IniFile::operator== | ( | const IniFile & | rhs_ | ) | const

inline

Compare two configurations.

Returns
  true if two configurations are the same; false otherwise.

Definition at line 82 of file IniFile.h.

{ return (m_config == rhs_.m_config); }

References IniFile(), and m_config.

## sect_begin()

const_config_iterator ASSA::IniFile::sect_begin | ( |  | ) | const

inline

Return iterator to the first section.

Definition at line 170 of file IniFile.h.

{ return m_config.begin (); }

References m_config.

## sect_end()

config_iterator ASSA::IniFile::sect_end | ( |  | ) |

inline

Return iterator past the last section.

Definition at line 174 of file IniFile.h.

{ return m_config.end (); }

References m_config.

Referenced by drop_pair(), drop_section(), ASSA::CmdLineOpts::parse_config_file(), and set_pair().

## set_pair()

int IniFile::set_pair | ( | const string & | section_,
|  | const tuple_type & | newkey_ )

Add or change name/value pair in the section.

Parameters

  section_ | Section name
  newkey_ | Name/value pair

Returns
  0 on success; -1 if section is not found

Definition at line 228 of file IniFile.cpp.

{
trace_with_mask ("IniFile::set_pair", INIFILE);
config_iterator i = find_section (section_);
if (i == sect_end ()) {
DL((INIFILE,"Section [%s] is not found!\n", section_.c_str ()));
return -1;
}
tuple_iterator j = (*i).second.begin ();
while (j != (*i).second.end ()) {
if ((*j).first == newkey_.first) {
(*j).second = newkey_.second;
return 0;
}
j++;
}
(*i).second.push_back (newkey_);
return 0;
}

References DL, find_section(), ASSA::INIFILE, sect_end(), and trace_with_mask.

## size()

unsigned int ASSA::IniFile::size | ( |  | ) | const

inline

Return number of sections in the cache.

Definition at line 178 of file IniFile.h.

{ return m_config.size (); }

References m_config.

Referenced by load().

## sync() [1/2]

int ASSA::IniFile::sync | ( |  | ) |

inline

Write cached configuration to the file.

Filename used is the one given in the constructor.

Returns
  0 on success; -1 if opening/writing to the file failed.

Definition at line 218 of file IniFile.h.

{
trace_with_mask ("IniFile::sync", INIFILE);
return sync (m_fname);
}
ASSA::IniFile::sync
int sync()
Write cached configuration to the file.
Definition IniFile.h:219

References ASSA::INIFILE, m_fname, sync(), and trace_with_mask.

Referenced by sync().

## sync() [2/2]

int IniFile::sync | ( | const string & | fname_ | ) |

Write cached configuration to the file fname_.

Parameters

  fname_ | Name of the output file.

Returns
  0 on success; -1 if opening/writing to the file failed.

Definition at line 109 of file IniFile.cpp.

{
trace_with_mask ("IniFile::sync(fname)", INIFILE);
::unlink (fname_.c_str ());
m_stream.open (fname_.c_str (), std::ios::app | std::ios::out);
if (!m_stream) {
EL((INIFILE,"Failed to open(\"%s\", app|out)\n", fname_.c_str ()));
return -1;
}
const_config_iterator i = m_config.begin ();
const_tuple_iterator j;
while (i != m_config.end ()) {
m_stream << "[" << (*i).first << "]\n";
j = (*i).second.begin ();
while (j != (*i).second.end ()) {
m_stream << (*j).first << "=" << (*j).second << "\n";
j++;
}
m_stream << "\n";
i++;
}
m_stream.clear ();
m_stream.close ();
return 0;
}
EL
#define EL(X)
A macro for writing error message to the Logger.
Definition Logger.h:285

References EL, ASSA::INIFILE, m_config, m_stream, and trace_with_mask.

## trim_section_name()

int ASSA::IniFile::trim_section_name | ( | string & | text_ | ) |

inline private

Remove square brakets around section name.

Parameters

  text_ | (IN/OUT) String to work on

Returns
  0 on success; -1 on error

Definition at line 211 of file IniFile.h.

{
return (Utils::ltrim (text_, "[") == 0 &&
Utils::rtrim (text_, "]") == 0) ? 0 : -1;
}
ASSA::Utils::ltrim
int ltrim(std::string &text_, const std::string &delim_)
Trim string from the beginning to the left of the delimiter.
Definition CommonUtils.cpp:67
ASSA::Utils::rtrim
int rtrim(std::string &text_, const std::string &delim_)
Trim string from the delimiter to the end of the string.
Definition CommonUtils.cpp:80

References ASSA::Utils::ltrim(), and ASSA::Utils::rtrim().

Referenced by load().

## Member Data Documentation

## m_comment_pttrn

Regexp ASSA::IniFile::m_comment_pttrn

private

Comment match.

Definition at line 208 of file IniFile.h.

Referenced by IniFile(), and load().

## m_config

config_type ASSA::IniFile::m_config

private

Cache holds the entire INI file in memory.

Definition at line 199 of file IniFile.h.

Referenced by add_section(), drop_all(), drop_section(), dump(), find_section(), find_section(), get_value(), load(), operator==(), sect_begin(), sect_end(), size(), sync(), and ~IniFile().

## m_fname

string ASSA::IniFile::m_fname

private

INI file name.

Definition at line 193 of file IniFile.h.

Referenced by IniFile(), load(), and sync().

## m_section_pttrn

Regexp ASSA::IniFile::m_section_pttrn

private

Section header match.

Definition at line 202 of file IniFile.h.

Referenced by IniFile(), and load().

## m_stream

std::fstream ASSA::IniFile::m_stream

private

File stream.

Definition at line 196 of file IniFile.h.

Referenced by load(), and sync().

## m_tuple_pttrn

Regexp ASSA::IniFile::m_tuple_pttrn

private

Name/value pair match.

Definition at line 205 of file IniFile.h.

Referenced by IniFile(), and load().

The documentation for this class was generated from the following files:

- IniFile.h
- IniFile.cpp