//--------------------------------------------------------------------------- #pragma hdrstop #include "INIParser.h" //--------------------------------------------------------------------------- #pragma package(smart_init) //remove all blank space string &TrimString(string &str) { string::size_type pos = 0; while(str.npos != (pos = str.find(" "))) str = str.replace(pos, pos+1, ""); return str; } //read in INI file and parse it int INIParser::ReadINI(string path) { ifstream in_conf_file(path.c_str()); if(!in_conf_file) return 0; string str_line = ""; string str_root = ""; vector vec_ini; while(getline(in_conf_file, str_line)) { string::size_type left_pos = 0; string::size_type right_pos = 0; string::size_type equal_div_pos = 0; string str_key = ""; string str_value = ""; //comment if(str_line.npos != (left_pos = str_line.find("#"))) str_line.erase(left_pos); if(str_line.npos != (left_pos = str_line.find(";"))) str_line.erase(left_pos); //section if((str_line.npos != (left_pos = str_line.find("["))) && (str_line.npos != (right_pos = str_line.find("]")))) { //cout << str_line.substr(left_pos+1, right_pos-1) << endl; str_root = str_line.substr(left_pos+1, right_pos-1); } //key-value else if(str_line.npos != (equal_div_pos = str_line.find("="))) { str_key = str_line.substr(0, equal_div_pos); str_value = str_line.substr(equal_div_pos+1, str_line.size()-1); str_key = TrimString(str_key); str_value = TrimString(str_value); //cout << str_key << "=" << str_value << endl; } if((!str_root.empty()) && (!str_key.empty()) && (!str_value.empty())) { ININode ini_node(str_root, str_key, str_value); vec_ini.push_back(ini_node); //cout << vec_ini.size() << endl; } } in_conf_file.close(); in_conf_file.clear(); //vector convert to map map map_tmp; for(vector::iterator itr = vec_ini.begin(); itr != vec_ini.end(); ++itr) { map_tmp.insert(pair(itr->root, "")); } SubNode sn; for(map::iterator itr = map_tmp.begin(); itr != map_tmp.end(); ++itr) { //cout << itr->first << endl; for(vector::iterator sub_itr = vec_ini.begin(); sub_itr != vec_ini.end(); ++sub_itr) { if(sub_itr->root == itr->first) { //cout << sub_itr->key << "=" << sub_itr->value << endl; sn.InsertElement(sub_itr->key, sub_itr->value); } } map_ini.insert(pair(itr->first, sn)); } return 1; } //get value by root and key string INIParser::GetValue(string root, string key) { map::iterator itr = map_ini.find(root); if(map_ini.end() != itr) { //if section found map::iterator sub_itr = itr->second.sub_node.find(key); if(!(sub_itr->second).empty()) return sub_itr->second; } return ""; } //write ini file int INIParser::WriteINI(string path) { ofstream out_conf_file(path.c_str()); if(!out_conf_file) return -1; //cout << map_ini.size() << endl; for(map::iterator itr = map_ini.begin(); itr != map_ini.end(); ++itr) { //cout << itr->first << endl; out_conf_file << "[" << itr->first << "]" << endl; for(map::iterator sub_itr = itr->second.sub_node.begin(); sub_itr != itr->second.sub_node.end(); ++sub_itr) { //cout << sub_itr->first << "=" << sub_itr->second << endl; out_conf_file << sub_itr->first << "=" << sub_itr->second << endl; } } out_conf_file.close(); out_conf_file.clear(); return 1; } //set value vector::size_type INIParser::SetValue(string root, string key, string value) { map::iterator itr = map_ini.find(root); if(map_ini.end() != itr) itr->second.sub_node.insert(pair(key, value)); else { SubNode sn; sn.InsertElement(key, value); map_ini.insert(pair(root, sn)); } return map_ini.size(); }