Try this:
Code:
//#define CONFIG_FILE "your_file_name.cfg"
#include <iostream>
#include <string>
#include <map>
#ifdef CONFIG_FILE
#include <fstream>
#endif
using std::cout;
using std::endl;
using std::string;
using std::map;
////////////////////////////////////////////////////////////////////////////////
string& trim_string(string &str);
string& trim_string(string &str,
const string &pre_chars,
const string &post_chars);
string split_string(string &str,
const string &delim_chars,
bool trim_space = true);
string split_string(string &str,
char delim_char,
bool trim_space = true);
////////////////////////////////////////////////////////////////////////////////
int main() {
typedef map<string, string> StringMap;
StringMap var_map;
#ifndef CONFIG_FILE
static const int TEST_LINES = 2;
string test_data[TEST_LINES] = {
"BASEALLOWDIR = /var/maildir/allow",
"USERALLOWDIR = {BASEALLOWDIR}/username"
};
for (int i = 0; i < TEST_LINES; ++i) {
string &line = test_data[i];
#else
std::ifstream fin(CONFIG_FILE);
string file_data;
while (getline(fin, file_data).good()) {
string &line = file_data;
#endif
string var_name = split_string(line, "=");
string::size_type brack = line.find("}");
// no variable in the path, so just map it
if (brack == string::npos)
var_map[var_name] = line;
// parse the variable name and replace it from the map data
else {
// take the var without the last bracket
string replace = line.substr(0, brack);
split_string(replace, "{");
// insure the variable name already exists in the map
StringMap::iterator itr = var_map.find(replace);
if (itr == var_map.end())
cout << "ERROR: \"" << replace << "\" is undefined!" << endl;
// now map the new variable replacing the {variable}
else {
string path = itr->second + line.substr(brack + 1);
var_map[var_name] = path;
}
}
}
// let's display everything we've mapped
StringMap::iterator itr = var_map.begin();
for (; itr != var_map.end(); ++itr)
cout << "[" << itr->first << "] = " << itr->second << endl;
return 0;
}
////////////////////////////////////////////////////////////////////////////////
//
// some of my strmanip library functions - very simple, but very
// useful string manipulation routines
// http://www.rommelsantor.com
//
string& trim_string(string &str) {
return trim_string(str, " \t\r\n", " \t\r\n");
}
string& trim_string(string &str,
const string &pre_chars,
const string &post_chars)
{
if (str.length() > 0) {
string::size_type first = str.find_first_not_of(pre_chars);
string::size_type last = str.find_last_not_of(post_chars);
if (first == string::npos)
str.erase();
else
str = str.substr(first,
first != string::npos && last != string::npos
?
last - first + 1
:
string::npos);
}
return str;
}
string split_string(string &str,
const string &delim_chars,
bool trim_space)
{
string token;
string::size_type n = str.find_first_of(delim_chars);
if (n == string::npos) {
token = str;
str.erase();
}
else {
token = str.substr(0, n);
str = str.substr(n + 1);
}
if (trim_space) {
trim_string(token);
trim_string(str);
}
return token;
}
string split_string(string &str,
char delim_char,
bool trim_space)
{
char delim_str[2] = { delim_char, 0 };
return split_string(str, delim_str, trim_space);
}
Originally Posted by
output
[BASEALLOWDIR] = /var/maildir/allow
[USERALLOWDIR] = /var/maildir/allow/username