summaryrefslogtreecommitdiff
path: root/util/epist/config.cc
diff options
context:
space:
mode:
authorMarius Nita <marius@cs.pdx.edu>2002-08-26 06:36:37 +0000
committerMarius Nita <marius@cs.pdx.edu>2002-08-26 06:36:37 +0000
commit11e643f4b885ee1f96112fcf531739a339691272 (patch)
tree8fb87c401666f4bd29002bdc6e8f6abcc1fecebf /util/epist/config.cc
parenta6d6f0118be066b9bb86e681aa67eca715f4fc69 (diff)
New and improved configuration management. It now handles bool, string and number types, and all conversions happen at initialization time, so retrieval is faster. (yay)
Diffstat (limited to 'util/epist/config.cc')
-rw-r--r--util/epist/config.cc126
1 files changed, 100 insertions, 26 deletions
diff --git a/util/epist/config.cc b/util/epist/config.cc
index 506aab76..db9ecddd 100644
--- a/util/epist/config.cc
+++ b/util/epist/config.cc
@@ -28,19 +28,30 @@ Config::Config() {}
Config::~Config()
{
- ItemList::const_iterator it = items.begin(), end = items.end();
- for (; it != end; ++it)
- delete *it;
- items.clear();
+ // deallocate memory for the 3 lists
+ BoolItemList::const_iterator b_it, b_end = bool_items.end();
+ for (b_it = bool_items.begin(); b_it != b_end; ++b_it)
+ delete *b_it;
+ bool_items.clear();
+
+ NumberItemList::const_iterator n_it, n_end = number_items.end();
+ for (n_it = number_items.begin(); n_it != n_end; ++n_it)
+ delete *n_it;
+ number_items.clear();
+
+ StringItemList::const_iterator s_it, s_end = string_items.end();
+ for (s_it = string_items.begin(); s_it != s_end; ++s_it)
+ delete *s_it;
+ string_items.clear();
}
-bool Config::getStringValue(Config::ItemType type, string &ret) const
+bool Config::getStringValue(Config::StringType type, string &ret) const
{
- ItemList::const_iterator it = items.begin(), end = items.end();
+ StringItemList::const_iterator it = string_items.begin(), end = string_items.end();
for (; it != end; ++it) {
- if ((*it)->getType() == type) {
- ret = (*it)->getStringValue();
+ if ((*it)->type == type) {
+ ret = (*it)->value;
return true;
}
}
@@ -48,20 +59,29 @@ bool Config::getStringValue(Config::ItemType type, string &ret) const
}
-int Config::getNumberValue(Config::ItemType type) const
+bool Config::getNumberValue(Config::NumberType type, int &ret) const
{
- ItemList::const_iterator it = items.begin(), end = items.end();
+ NumberItemList::const_iterator it = number_items.begin(), end = number_items.end();
for (; it != end; ++it) {
- if ((*it)->getType() == type)
- return (*it)->getNumberValue();
+ if ((*it)->type == type) {
+ ret = (*it)->value;
+ return true;
+ }
}
- return 0;
+ return false;
}
-void Config::addOption(ConfigItem *item)
+bool Config::getBoolValue(Config::BoolType type, bool &ret) const
{
- items.push_back(item);
+ BoolItemList::const_iterator it = bool_items.begin(), end = bool_items.end();
+ for (; it != end; ++it) {
+ if ((*it)->type == type) {
+ ret = (*it)->type;
+ return true;
+ }
+ }
+ return false;
}
@@ -69,21 +89,75 @@ void Config::addOption(const std::string &name, const std::string &value)
{
const struct {
const char *name;
- Config::ItemType type;
+ Config::BoolType type;
+ }
+ bool_options[] = {
+ { "stackedcycling", Config::stackedCycling },
+ { "", NUM_BOOL_TYPES }
+ };
+
+ const struct {
+ const char *name;
+ Config::StringType type;
}
- options[] = {
- { "notype", Config::noType },
- { "chaintimeout", Config::chainTimeout },
- { "workspacecolumns", Config::workspaceColumns },
- { "", numTypes }
+ string_options[] = {
+ { "", NUM_STRING_TYPES }
};
+ const struct {
+ const char *name;
+ Config::NumberType type;
+ }
+ number_options[] = {
+ { "chaintimeout", chainTimeout },
+ { "workspacecolumns", workspaceColumns },
+ { "", NUM_NUMBER_TYPES }
+ };
+
+ // if it's bool option, add it to the bool_items list
size_t i = 0;
- while (options[i].type != numTypes) {
- if (strcasecmp(name.c_str(), options[i].name) == 0) {
- ConfigItem *item = new ConfigItem(options[i].type, value);
- items.push_back(item);
- break;
+ while (bool_options[i].type != NUM_BOOL_TYPES) {
+ if (strcasecmp(name.c_str(), bool_options[i].name) == 0) {
+ BoolItem *item = new BoolItem;
+ const char *tmp = value.c_str();
+
+ item->type = bool_options[i].type;
+
+ if (strcasecmp(tmp, "true") == 0 || strcasecmp(tmp, "1"))
+ item->value = true;
+ else
+ item->value = false;
+
+ bool_items.push_back(item);
+ return;
+ }
+ i++;
+ }
+
+ // if it's a string, add it to the string_items list
+ i = 0;
+ while (string_options[i].type != NUM_STRING_TYPES) {
+ if (strcasecmp(name.c_str(), string_options[i].name) == 0) {
+ StringItem *item = new StringItem;
+ item->type = string_options[i].type;
+ item->value = value;
+
+ string_items.push_back(item);
+ return;
+ }
+ i++;
+ }
+
+ // if it's a number, add it to the number_items list
+ i = 0;
+ while (number_options[i].type != NUM_NUMBER_TYPES) {
+ if (strcasecmp(name.c_str(), number_options[i].name) == 0) {
+ NumberItem *item = new NumberItem;
+ item->type = number_options[i].type;
+ item->value = atoi( value.c_str() );
+
+ number_items.push_back(item);
+ return;
}
i++;
}