From 9e46cbf7ea512330f35d0f2ede0c7c0c085c7cf4 Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Wed, 12 Oct 2011 13:53:38 +0300 Subject: Header file tweaking; mainly for speed --- src/settings.h | 583 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 583 insertions(+) create mode 100644 src/settings.h (limited to 'src/settings.h') diff --git a/src/settings.h b/src/settings.h new file mode 100644 index 000000000..f972ce3ec --- /dev/null +++ b/src/settings.h @@ -0,0 +1,583 @@ +/* +Minetest-c55 +Copyright (C) 2010-2011 celeron55, Perttu Ahola + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along +with this program; if not, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + +#ifndef SETTINGS_HEADER +#define SETTINGS_HEADER + +#include "common_irrlicht.h" +#include +#include +#include +#include +#include "strfnd.h" +#include +#include +#include +#include "debug.h" +#include "utility.h" + +enum ValueType +{ + VALUETYPE_STRING, + VALUETYPE_FLAG // Doesn't take any arguments +}; + +struct ValueSpec +{ + ValueSpec(ValueType a_type, const char *a_help=NULL) + { + type = a_type; + help = a_help; + } + ValueType type; + const char *help; +}; + +class Settings +{ +public: + Settings() + { + m_mutex.Init(); + } + + void writeLines(std::ostream &os) + { + JMutexAutoLock lock(m_mutex); + + for(core::map::Iterator + i = m_settings.getIterator(); + i.atEnd() == false; i++) + { + std::string name = i.getNode()->getKey(); + std::string value = i.getNode()->getValue(); + os< &dst, + core::map &updated) + { + JMutexAutoLock lock(m_mutex); + + if(is.eof()) + return false; + + // NOTE: This function will be expanded to allow multi-line settings + std::string line; + std::getline(is, line); + + std::string trimmedline = trim(line); + + std::string line_end = ""; + if(is.eof() == false) + line_end = "\n"; + + // Ignore comments + if(trimmedline[0] == '#') + { + dst.push_back(line+line_end); + return true; + } + + Strfnd sf(trim(line)); + + std::string name = sf.next("="); + name = trim(name); + + if(name == "") + { + dst.push_back(line+line_end); + return true; + } + + std::string value = sf.next("\n"); + value = trim(value); + + if(m_settings.find(name)) + { + std::string newvalue = m_settings[name]; + + if(newvalue != value) + { + dstream<<"Changing value of \""< \""< objects; + core::map updated; + + // Read and modify stuff + { + std::ifstream is(filename); + if(is.good() == false) + { + dstream<<"INFO: updateConfigFile():" + " Error opening configuration file" + " for reading: \"" + <::Iterator + i = objects.begin(); + i != objects.end(); i++) + { + os<<(*i); + } + + /* + Write stuff that was not already in the file + */ + for(core::map::Iterator + i = m_settings.getIterator(); + i.atEnd() == false; i++) + { + if(updated.find(i.getNode()->getKey())) + continue; + std::string name = i.getNode()->getKey(); + std::string value = i.getNode()->getValue(); + dstream<<"Adding \""< &allowed_options) + { + int i=1; + for(;;) + { + if(i >= argc) + break; + std::string argname = argv[i]; + if(argname.substr(0, 2) != "--") + { + dstream<<"Invalid command-line parameter \"" + < expected."<::Node *n; + n = allowed_options.find(name); + if(n == NULL) + { + dstream<<"Unknown command-line parameter \"" + <getValue().type; + + std::string value = ""; + + if(type == VALUETYPE_FLAG) + { + value = "true"; + } + else + { + if(i >= argc) + { + dstream<<"Invalid command-line parameter \"" + <::Node *n; + n = m_settings.find(name); + if(n == NULL) + { + n = m_defaults.find(name); + if(n == NULL) + { + dstream<<"INFO: Settings: Setting not found: \"" + <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; + } + } + + // Asks if empty + bool getBoolAsk(std::string name, std::string question, bool def) + { + // If it is in settings + if(exists(name)) + return getBool(name); + + std::string s; + char templine[10]; + std::cout<>value; + return value; + } + + void setBool(std::string name, bool value) + { + if(value) + set(name, "true"); + else + set(name, "false"); + } + + void setS32(std::string name, s32 value) + { + set(name, itos(value)); + } + + void setFloat(std::string name, float value) + { + set(name, ftos(value)); + } + + void setV3F(std::string name, v3f value) + { + std::ostringstream os; + os<<"("<::Iterator + i = other.m_settings.getIterator(); + i.atEnd() == false; i++) + { + m_settings.insert(i.getNode()->getKey(), + i.getNode()->getValue()); + } + + for(core::map::Iterator + i = other.m_defaults.getIterator(); + i.atEnd() == false; i++) + { + m_defaults.insert(i.getNode()->getKey(), + i.getNode()->getValue()); + } + + return *this; + + } + + Settings & operator=(Settings &other) + { + JMutexAutoLock lock(m_mutex); + JMutexAutoLock lock2(other.m_mutex); + + if(&other == this) + return *this; + + clear(); + (*this) += other; + + return *this; + } + +private: + core::map m_settings; + core::map m_defaults; + // All methods that access m_settings/m_defaults directly should lock this. + JMutex m_mutex; +}; + +#endif + -- cgit v1.2.3