]> Dogcows Code - chaz/openbox/commitdiff
New and improved configuration management. It now handles bool, string and number...
authorMarius Nita <marius@cs.pdx.edu>
Mon, 26 Aug 2002 06:36:37 +0000 (06:36 +0000)
committerMarius Nita <marius@cs.pdx.edu>
Mon, 26 Aug 2002 06:36:37 +0000 (06:36 +0000)
util/epist/config.cc
util/epist/config.hh

index 506aab76f517ad4a7843b035c222e45dca25114c..db9ecdddcf09aa174c8eff9ad4300891b4d0ddfc 100644 (file)
@@ -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++;
   }
index 443834edf8eff918bb3b494f3c648316e32a2035..0cb2a1c048d22425c4f0484f5e5c534e1695ffbd 100644 (file)
 #include <string>
 #include <list>
 
-class ConfigItem;
+// forward declarations
+struct BoolItem;
+struct StringItem;
+struct NumberItem;
 
 class Config {
 public:
-  enum ItemType {
-    noType,
+  enum BoolType {
+    NO_BOOL_TYPE,
+    stackedCycling,
+    NUM_BOOL_TYPES
+  };
+
+  enum StringType {
+    NO_STRING_TYPE,
+    NUM_STRING_TYPES
+  };
+
+  enum NumberType {
+    NO_NUMBER_TYPE,
     chainTimeout,
     workspaceColumns,
-    numTypes
+    NUM_NUMBER_TYPES
   };
 
 private:
-  typedef std::list<ConfigItem *> ItemList;
-  ItemList items;
+  typedef std::list<BoolItem *> BoolItemList;
+  typedef std::list<StringItem *> StringItemList;
+  typedef std::list<NumberItem *> NumberItemList;
+  BoolItemList bool_items;
+  StringItemList string_items;
+  NumberItemList number_items;
 
 public:
   Config();
   ~Config();
 
-  bool getStringValue(Config::ItemType, std::string &) const;
-  int getNumberValue(Config::ItemType) const;
-  void addOption(ConfigItem *);
+  bool getBoolValue(BoolType, bool &) const;
+  bool getStringValue(StringType, std::string &) const;
+  bool getNumberValue(NumberType, int &) const;
+
   void addOption(const std::string &, const std::string &);
 };
 
+struct BoolItem {
+  Config::BoolType type;
+  bool value;
+};
 
-class ConfigItem {
-private:
-  Config::ItemType _type;
-  std::string _value;
-
-public:
-  ConfigItem(Config::ItemType type, std::string value)
-    : _type(type), _value(value) {}
-  ~ConfigItem() {}
-
-  inline const std::string &getStringValue() const
-  { return _value; }
-
-  inline int getNumberValue() const
-  { return atoi(_value.c_str()); }
+struct StringItem {
+  Config::StringType type;
+  std::string value;
+};
 
-  inline Config::ItemType getType() const
-  { return _type; }
+struct NumberItem {
+  Config::NumberType type;
+  int value;
 };
 
 #endif // __config_hh
This page took 0.030989 seconds and 4 git commands to generate.