summaryrefslogtreecommitdiffstats
path: root/CAN-binder/libs/ini-config
diff options
context:
space:
mode:
Diffstat (limited to 'CAN-binder/libs/ini-config')
-rw-r--r--CAN-binder/libs/ini-config/ini-config.cpp93
-rw-r--r--CAN-binder/libs/ini-config/ini-config.hpp61
2 files changed, 154 insertions, 0 deletions
diff --git a/CAN-binder/libs/ini-config/ini-config.cpp b/CAN-binder/libs/ini-config/ini-config.cpp
new file mode 100644
index 00000000..b670e76b
--- /dev/null
+++ b/CAN-binder/libs/ini-config/ini-config.cpp
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2015, 2016 ,2017 "IoT.bzh"
+ * Author "Loïc Collignon" <loic.collignon@iot.bzh>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "ini-config.hpp"
+
+bool starts_with(const std::string& text, const std::string& token)
+{
+ if(text.length() < token.length()) return false;
+ return (text.compare(0, token.length(), token) == 0);
+}
+
+void ini_config::read_file(const std::string& filename)
+{
+ std::ifstream f(filename);
+ if (f)
+ {
+ std::regex r_section("^\\s*\\[([^\\]]+)\\]\\s*(#.*)?$");
+ std::regex r_key("^\\s*([^\\s]+)\\s*=\\s*\"([^\"]+)\"\\s*(#.*)?$");
+ std::string current_section;
+ std::string line;
+ while (std::getline(f, line))
+ {
+ std::smatch mr;
+
+ switch (qualify(line))
+ {
+ case line_type::section:
+ if (std::regex_match(line, mr, r_section) && mr.size() >= 2 && mr[1].matched)
+ {
+ current_section = mr[1].str();
+ }
+ break;
+ case line_type::key:
+ if(std::regex_match(line, mr, r_key) && mr.size() >= 2 && mr[1].matched)
+ {
+ std::string key = current_section + '/' + mr[1].str();
+ config_[key] = (mr.size() >= 3 && mr[2].matched) ? mr[2].str() : "";
+ }
+ break;
+ }
+ }
+ }
+}
+
+std::map<std::string, std::string> ini_config::get_keys(const std::string& section)
+{
+ std::map<std::string, std::string> ret;
+
+ std::string prefix = section + '/';
+ for(auto i = config_.begin();
+ i != config_.end();
+ ++i)
+ {
+ if (starts_with(i->first, prefix))
+ {
+ ret[i->first] = i->second;
+ }
+ }
+ return ret;
+}
+
+std::string ini_config::get_value(const std::string& section, const std::string& key)
+{
+ return config_[section + '/' + key];
+}
+
+ini_config::line_type ini_config::qualify(std::string& line)
+{
+ if (line.size())
+ {
+ for (std::string::value_type c : line)
+ {
+ if (c == '#') return line_type::ignore;
+ if (c == '[') return line_type::section;
+ if (!std::isspace(c, std::locale("C"))) return line_type::key;
+ }
+ }
+ return line_type::ignore;
+} \ No newline at end of file
diff --git a/CAN-binder/libs/ini-config/ini-config.hpp b/CAN-binder/libs/ini-config/ini-config.hpp
new file mode 100644
index 00000000..3a154547
--- /dev/null
+++ b/CAN-binder/libs/ini-config/ini-config.hpp
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) 2015, 2016 ,2017 "IoT.bzh"
+ * Author "Loïc Collignon" <loic.collignon@iot.bzh>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef INI_CONFIG_HPP
+#define INI_CONFIG_HPP
+
+#include <string>
+#include <fstream>
+#include <map>
+#include <regex>
+#include <algorithm>
+
+// Représente un fichier de configuration.
+class ini_config
+{
+public:
+ using map = std::map<std::string, std::string>;
+
+ void read_file(const std::string& filename);
+
+ map get_keys(const std::string& section);
+ std::string get_value(const std::string& section, const std::string& key);
+
+ typename map::size_type size() const { return config_.size(); }
+ typename map::iterator begin() { return config_.begin(); }
+ typename map::iterator end() { return config_.end(); }
+ typename map::const_iterator cbegin() const { return config_.cbegin(); }
+ typename map::const_iterator cend() const { return config_.cend(); }
+ typename map::reverse_iterator rbegin() { return config_.rbegin(); }
+ typename map::reverse_iterator rend() { return config_.rend(); }
+ typename map::const_reverse_iterator crbegin() const { return config_.crbegin(); }
+ typename map::const_reverse_iterator crend() const { return config_.crend(); }
+
+private:
+ map config_;
+
+ enum class line_type
+ {
+ ignore = 0,
+ section = 1,
+ key = 2
+ };
+
+ line_type qualify(std::string& line);
+};
+
+#endif // INI_CONFIG_HPP