- core::map<std::string, ValueSpec> &allowed_options)
- {
- int i=1;
- for(;;)
- {
- if(i >= argc)
- break;
- std::string argname = argv[i];
- if(argname.substr(0, 2) != "--")
- {
- errorstream<<"Invalid command-line parameter \""
- <<argname<<"\": --<option> expected."<<std::endl;
- return false;
- }
- i++;
-
- std::string name = argname.substr(2);
-
- core::map<std::string, ValueSpec>::Node *n;
- n = allowed_options.find(name);
- if(n == NULL)
- {
- errorstream<<"Unknown command-line parameter \""
- <<argname<<"\""<<std::endl;
- return false;
- }
-
- ValueType type = n->getValue().type;
-
- std::string value = "";
-
- if(type == VALUETYPE_FLAG)
- {
- value = "true";
- }
- else
- {
- if(i >= argc)
- {
- errorstream<<"Invalid command-line parameter \""
- <<name<<"\": missing value"<<std::endl;
- return false;
- }
- value = argv[i];
- i++;
- }
-
-
- infostream<<"Valid command-line parameter: \""
- <<name<<"\" = \""<<value<<"\""
- <<std::endl;
- set(name, value);
- }
-
- return true;
- }
-
- void set(std::string name, std::string value)
- {
- JMutexAutoLock lock(m_mutex);
-
- m_settings[name] = value;
- }
-
- void set(std::string name, const char *value)
- {
- JMutexAutoLock lock(m_mutex);
-
- m_settings[name] = value;
- }
-
-
- void setDefault(std::string name, std::string value)
- {
- JMutexAutoLock lock(m_mutex);
-
- m_defaults[name] = value;
- }
-
- bool exists(std::string name)
- {
- JMutexAutoLock lock(m_mutex);
-
- return (m_settings.find(name) || m_defaults.find(name));
- }
-
- std::string get(std::string name)
- {
- JMutexAutoLock lock(m_mutex);
-
- core::map<std::string, std::string>::Node *n;
- n = m_settings.find(name);
- if(n == NULL)
- {
- n = m_defaults.find(name);
- if(n == NULL)
- {
- throw SettingNotFoundException("Setting not found");
- }
- }
-
- return n->getValue();
- }
-
- bool getBool(std::string name)
- {
- return is_yes(get(name));
- }
-
- bool getFlag(std::string name)
- {
- try
- {
- return getBool(name);
- }
- catch(SettingNotFoundException &e)
- {
- return false;
- }
- }
+ std::map<std::string, ValueSpec> &allowed_options);
+ bool parseConfigLines(std::istream &is, const std::string &end = "");
+ void writeLines(std::ostream &os) const;
+
+
+ /***********
+ * Getters *
+ ***********/
+
+ std::string get(const std::string &name) const;
+ bool getBool(const std::string &name) const;
+ u16 getU16(const std::string &name) const;
+ s16 getS16(const std::string &name) const;
+ s32 getS32(const std::string &name) const;
+ u64 getU64(const std::string &name) const;
+ float getFloat(const std::string &name) const;
+ v2f getV2F(const std::string &name) const;
+ v3f getV3F(const std::string &name) const;
+ u32 getFlagStr(const std::string &name, const FlagDesc *flagdesc,
+ u32 *flagmask) const;
+ // N.B. if getStruct() is used to read a non-POD aggregate type,
+ // the behavior is undefined.
+ bool getStruct(const std::string &name, const std::string &format,
+ void *out, size_t olen) const;
+
+ // return all keys used
+ std::vector<std::string> getNames() const;
+ bool exists(const std::string &name) const;
+
+
+ /***************************************
+ * Getters that don't throw exceptions *
+ ***************************************/
+
+ bool getNoEx(const std::string &name, std::string &val) const;
+ bool getFlag(const std::string &name) const;
+ bool getU16NoEx(const std::string &name, u16 &val) const;
+ bool getS16NoEx(const std::string &name, s16 &val) const;
+ bool getS32NoEx(const std::string &name, s32 &val) const;
+ bool getU64NoEx(const std::string &name, u64 &val) const;
+ bool getFloatNoEx(const std::string &name, float &val) const;
+ bool getV2FNoEx(const std::string &name, v2f &val) const;
+ bool getV3FNoEx(const std::string &name, v3f &val) const;
+ // N.B. getFlagStrNoEx() does not set val, but merely modifies it. Thus,
+ // val must be initialized before using getFlagStrNoEx(). The intention of
+ // this is to simplify modifying a flags field from a default value.
+ bool getFlagStrNoEx(const std::string &name, u32 &val, FlagDesc *flagdesc) const;
+
+
+ /***********
+ * Setters *
+ ***********/
+
+ void set(const std::string &name, std::string value);
+ void set(const std::string &name, const char *value);
+ void setDefault(const std::string &name, std::string value);
+ void setBool(const std::string &name, bool value);
+ void setS16(const std::string &name, s16 value);
+ void setS32(const std::string &name, s32 value);
+ void setU64(const std::string &name, u64 value);
+ void setFloat(const std::string &name, float value);
+ void setV2F(const std::string &name, v2f value);
+ void setV3F(const std::string &name, v3f value);
+ void setFlagStr(const std::string &name, u32 flags,
+ const FlagDesc *flagdesc, u32 flagmask);
+ // N.B. if setStruct() is used to write a non-POD aggregate type,
+ // the behavior is undefined.
+ bool setStruct(const std::string &name, const std::string &format, void *value);
+
+ // remove a setting
+ bool remove(const std::string &name);
+ void clear();
+ void updateValue(const Settings &other, const std::string &name);
+ void update(const Settings &other);