summaryrefslogtreecommitdiff
path: root/rld-config.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'rld-config.cpp')
-rw-r--r--rld-config.cpp150
1 files changed, 150 insertions, 0 deletions
diff --git a/rld-config.cpp b/rld-config.cpp
new file mode 100644
index 0000000..b6b84c2
--- /dev/null
+++ b/rld-config.cpp
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 2014, Chris Johns <chrisj@rtems.org>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/**
+ * @file
+ *
+ * @ingroup rtems_rld
+ *
+ * @brief INI Configuration reader.
+ *
+ */
+
+#include <errno.h>
+
+#include <rld-config.h>
+#include <rld.h>
+
+#include <SimpleIni.h>
+
+namespace rld
+{
+ namespace config
+ {
+ item::item (const std::string& text)
+ : text (text)
+ {
+ }
+
+ item::item (const char* text)
+ : text (text)
+ {
+ }
+
+ const record&
+ section::get_record (const std::string& name) const
+ {
+ for (records::const_iterator ri = recs.begin ();
+ ri != recs.end ();
+ ++ri)
+ {
+ if ((*ri).name == name)
+ return *ri;
+ }
+
+ throw error ("not found", "config record: " + this->name + '/' + name);
+ }
+
+ config::config()
+ {
+ }
+
+ config::~config()
+ {
+ }
+
+ void
+ config::clear ()
+ {
+ secs.clear ();
+ }
+
+ void
+ config::load (const std::string& path)
+ {
+ CSimpleIniCaseA ini (false, true, true);
+
+ if (ini.LoadFile (path.c_str ()) != SI_OK)
+ throw rld::error (::strerror (errno), "load config: " + path);
+
+ paths.push_back (path);
+
+ /*
+ * Merge the loaded configuration into our configuration.
+ */
+
+ CSimpleIniCaseA::TNamesDepend skeys;
+
+ ini.GetAllSections(skeys);
+
+ for (CSimpleIniCaseA::TNamesDepend::const_iterator si = skeys.begin ();
+ si != skeys.end ();
+ ++si)
+ {
+ section sec;
+
+ sec.name = (*si).pItem;
+
+ CSimpleIniCaseA::TNamesDepend rkeys;
+
+ ini.GetAllKeys((*si).pItem, rkeys);
+
+ for (CSimpleIniCaseA::TNamesDepend::const_iterator ri = rkeys.begin ();
+ ri != rkeys.end ();
+ ++ri)
+ {
+ record rec;
+
+ rec.name = (*ri).pItem;
+
+ CSimpleIniCaseA::TNamesDepend vals;
+
+ ini.GetAllValues((*si).pItem, (*ri).pItem, vals);
+
+ for (CSimpleIniCaseA::TNamesDepend::const_iterator vi = vals.begin ();
+ vi != vals.end ();
+ ++vi)
+ {
+ rec.items.push_back (item ((*vi).pItem));
+ }
+
+ sec.recs.push_back (rec);
+ }
+
+ secs.push_back (sec);
+ }
+ }
+
+ const section&
+ config::get_section (const std::string& name) const
+ {
+ for (sections::const_iterator si = secs.begin ();
+ si != secs.end ();
+ ++si)
+ {
+ if ((*si).name == name)
+ return *si;
+ }
+
+ throw error ("not found", "config section: " + name);
+ }
+
+ const paths&
+ config::get_paths () const
+ {
+ return paths;
+ }
+ }
+}