diff --git a/Common/ArmCPUDetect.cpp b/Common/ArmCPUDetect.cpp index da8d45f2f9..90aeaf8433 100644 --- a/Common/ArmCPUDetect.cpp +++ b/Common/ArmCPUDetect.cpp @@ -16,6 +16,9 @@ // http://code.google.com/p/dolphin-emu/ #include "ppsspp_config.h" + +#include + #if PPSSPP_ARCH(ARM) || PPSSPP_ARCH(ARM64) #include diff --git a/Common/KeyMap.cpp b/Common/KeyMap.cpp index 8683ba8346..1652b51da8 100644 --- a/Common/KeyMap.cpp +++ b/Common/KeyMap.cpp @@ -917,7 +917,7 @@ void LoadFromIni(IniFile &file) { return; } - IniFile::Section *controls = file.GetOrCreateSection("ControlMapping"); + Section *controls = file.GetOrCreateSection("ControlMapping"); for (size_t i = 0; i < ARRAY_SIZE(psp_button_names); i++) { std::string value; controls->Get(psp_button_names[i].name, &value, ""); @@ -944,7 +944,7 @@ void LoadFromIni(IniFile &file) { } void SaveToIni(IniFile &file) { - IniFile::Section *controls = file.GetOrCreateSection("ControlMapping"); + Section *controls = file.GetOrCreateSection("ControlMapping"); for (size_t i = 0; i < ARRAY_SIZE(psp_button_names); i++) { std::vector keys; diff --git a/Common/LogManager.cpp b/Common/LogManager.cpp index 485a7b47da..c13a3d712f 100644 --- a/Common/LogManager.cpp +++ b/Common/LogManager.cpp @@ -185,14 +185,14 @@ void LogManager::ChangeFileLog(const char *filename) { } } -void LogManager::SaveConfig(IniFile::Section *section) { +void LogManager::SaveConfig(Section *section) { for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; i++) { section->Set((std::string(log_[i].m_shortName) + "Enabled").c_str(), log_[i].enabled); section->Set((std::string(log_[i].m_shortName) + "Level").c_str(), (int)log_[i].level); } } -void LogManager::LoadConfig(IniFile::Section *section, bool debugDefaults) { +void LogManager::LoadConfig(Section *section, bool debugDefaults) { for (int i = 0; i < LogTypes::NUMBER_OF_LOGS; i++) { bool enabled = false; int level = 0; diff --git a/Common/LogManager.h b/Common/LogManager.h index 81a23d518d..a9d5a568e9 100644 --- a/Common/LogManager.h +++ b/Common/LogManager.h @@ -180,6 +180,6 @@ public: void ChangeFileLog(const char *filename); - void SaveConfig(IniFile::Section *section); - void LoadConfig(IniFile::Section *section, bool debugDefaults); + void SaveConfig(Section *section); + void LoadConfig(Section *section, bool debugDefaults); }; diff --git a/Core/Config.cpp b/Core/Config.cpp index d28e9c2494..f7fd8e9af9 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include "base/display.h" #include "base/NativeApp.h" @@ -202,7 +203,7 @@ struct ConfigSetting { return type_ != TYPE_TERMINATOR; } - bool Get(IniFile::Section *section) { + bool Get(Section *section) { switch (type_) { case TYPE_BOOL: if (cb_.b) { @@ -255,7 +256,7 @@ struct ConfigSetting { } } - void Set(IniFile::Section *section) { + void Set(Section *section) { if (!save_) return; @@ -1107,9 +1108,9 @@ static ConfigSectionSettings sections[] = { {"Theme", themeSettings}, }; -static void IterateSettings(IniFile &iniFile, std::function func) { +static void IterateSettings(IniFile &iniFile, std::function func) { for (size_t i = 0; i < ARRAY_SIZE(sections); ++i) { - IniFile::Section *section = iniFile.GetOrCreateSection(sections[i].section); + Section *section = iniFile.GetOrCreateSection(sections[i].section); for (auto setting = sections[i].settings; setting->HasMore(); ++setting) { func(section, setting); } @@ -1146,8 +1147,8 @@ std::map> GetLangValuesMapping() { langCodeMapping["CHINESE_TRADITIONAL"] = PSP_SYSTEMPARAM_LANGUAGE_CHINESE_TRADITIONAL; langCodeMapping["CHINESE_SIMPLIFIED"] = PSP_SYSTEMPARAM_LANGUAGE_CHINESE_SIMPLIFIED; - IniFile::Section *langRegionNames = mapping.GetOrCreateSection("LangRegionNames"); - IniFile::Section *systemLanguage = mapping.GetOrCreateSection("SystemLanguage"); + Section *langRegionNames = mapping.GetOrCreateSection("LangRegionNames"); + Section *systemLanguage = mapping.GetOrCreateSection("SystemLanguage"); for (size_t i = 0; i < keys.size(); i++) { std::string langName; @@ -1186,7 +1187,7 @@ void Config::Load(const char *iniFileName, const char *controllerIniFilename) { // Continue anyway to initialize the config. } - IterateSettings(iniFile, [](IniFile::Section *section, ConfigSetting *setting) { + IterateSettings(iniFile, [](Section *section, ConfigSetting *setting) { setting->Get(section); }); @@ -1194,7 +1195,7 @@ void Config::Load(const char *iniFileName, const char *controllerIniFilename) { if (!File::Exists(currentDirectory)) currentDirectory = ""; - IniFile::Section *log = iniFile.GetOrCreateSection(logSectionName); + Section *log = iniFile.GetOrCreateSection(logSectionName); bool debugDefaults = false; #ifdef _DEBUG @@ -1202,7 +1203,7 @@ void Config::Load(const char *iniFileName, const char *controllerIniFilename) { #endif LogManager::GetInstance()->LoadConfig(log, debugDefaults); - IniFile::Section *recent = iniFile.GetOrCreateSection("Recent"); + Section *recent = iniFile.GetOrCreateSection("Recent"); recent->Get("MaxRecent", &iMaxRecent, 30); // Fix issue from switching from uint (hex in .ini) to int (dec) @@ -1248,7 +1249,7 @@ void Config::Load(const char *iniFileName, const char *controllerIniFilename) { } // Check for an old dpad setting - IniFile::Section *control = iniFile.GetOrCreateSection("Control"); + Section *control = iniFile.GetOrCreateSection("Control"); float f; control->Get("DPadRadius", &f, 0.0f); if (f > 0.0f) { @@ -1337,13 +1338,13 @@ void Config::Save(const char *saveReason) { // Need to do this somewhere... bFirstRun = false; - IterateSettings(iniFile, [&](IniFile::Section *section, ConfigSetting *setting) { + IterateSettings(iniFile, [&](Section *section, ConfigSetting *setting) { if (!bGameSpecific || !setting->perGame_) { setting->Set(section); } }); - IniFile::Section *recent = iniFile.GetOrCreateSection("Recent"); + Section *recent = iniFile.GetOrCreateSection("Recent"); recent->Set("MaxRecent", iMaxRecent); for (int i = 0; i < iMaxRecent; i++) { @@ -1356,7 +1357,7 @@ void Config::Save(const char *saveReason) { } } - IniFile::Section *pinnedPaths = iniFile.GetOrCreateSection("PinnedPaths"); + Section *pinnedPaths = iniFile.GetOrCreateSection("PinnedPaths"); pinnedPaths->Clear(); for (size_t i = 0; i < vPinnedPaths.size(); ++i) { char keyName[64]; @@ -1365,17 +1366,17 @@ void Config::Save(const char *saveReason) { } if (!bGameSpecific) { - IniFile::Section *postShaderSetting = iniFile.GetOrCreateSection("PostShaderSetting"); + Section *postShaderSetting = iniFile.GetOrCreateSection("PostShaderSetting"); postShaderSetting->Clear(); for (auto it = mPostShaderSetting.begin(), end = mPostShaderSetting.end(); it != end; ++it) { postShaderSetting->Set(it->first.c_str(), it->second); } } - IniFile::Section *control = iniFile.GetOrCreateSection("Control"); + Section *control = iniFile.GetOrCreateSection("Control"); control->Delete("DPadRadius"); - IniFile::Section *log = iniFile.GetOrCreateSection(logSectionName); + Section *log = iniFile.GetOrCreateSection(logSectionName); if (LogManager::GetInstance()) LogManager::GetInstance()->SaveConfig(log); @@ -1613,16 +1614,16 @@ bool Config::saveGameConfig(const std::string &pGameId, const std::string &title IniFile iniFile; - IniFile::Section *top = iniFile.GetOrCreateSection(""); + Section *top = iniFile.GetOrCreateSection(""); top->AddComment(StringFromFormat("Game config for %s - %s", pGameId.c_str(), title.c_str())); - IterateSettings(iniFile, [](IniFile::Section *section, ConfigSetting *setting) { + IterateSettings(iniFile, [](Section *section, ConfigSetting *setting) { if (setting->perGame_) { setting->Set(section); } }); - IniFile::Section *postShaderSetting = iniFile.GetOrCreateSection("PostShaderSetting"); + Section *postShaderSetting = iniFile.GetOrCreateSection("PostShaderSetting"); postShaderSetting->Clear(); for (auto it = mPostShaderSetting.begin(), end = mPostShaderSetting.end(); it != end; ++it) { postShaderSetting->Set(it->first.c_str(), it->second); @@ -1652,7 +1653,7 @@ bool Config::loadGameConfig(const std::string &pGameId, const std::string &title mPostShaderSetting[it.first] = std::stof(it.second); } - IterateSettings(iniFile, [](IniFile::Section *section, ConfigSetting *setting) { + IterateSettings(iniFile, [](Section *section, ConfigSetting *setting) { if (setting->perGame_) { setting->Get(section); } @@ -1670,7 +1671,7 @@ void Config::unloadGameConfig() { iniFile.Load(iniFilename_); // Reload game specific settings back to standard. - IterateSettings(iniFile, [](IniFile::Section *section, ConfigSetting *setting) { + IterateSettings(iniFile, [](Section *section, ConfigSetting *setting) { if (setting->perGame_) { setting->Get(section); } diff --git a/Core/Dialog/PSPSaveDialog.cpp b/Core/Dialog/PSPSaveDialog.cpp index 80b4f7c6e1..1e58737c2a 100755 --- a/Core/Dialog/PSPSaveDialog.cpp +++ b/Core/Dialog/PSPSaveDialog.cpp @@ -21,6 +21,7 @@ #include +#include "base/stringutil.h" #include "i18n/i18n.h" #include "thread/threadutil.h" diff --git a/Core/SaveState.cpp b/Core/SaveState.cpp index 649b644a88..42ec9b289b 100644 --- a/Core/SaveState.cpp +++ b/Core/SaveState.cpp @@ -20,8 +20,8 @@ #include #include -#include "base/stringutil.h" #include "base/timeutil.h" +#include "base/stringutil.h" #include "i18n/i18n.h" #include "thread/threadutil.h" #include "util/text/parsers.h" diff --git a/Core/Util/GameManager.cpp b/Core/Util/GameManager.cpp index da0617dd43..031f51b119 100644 --- a/Core/Util/GameManager.cpp +++ b/Core/Util/GameManager.cpp @@ -17,9 +17,10 @@ #include #include +#include #include #include -#include +#include #include #include "file/file_util.h" @@ -29,6 +30,7 @@ #include "ext/libzip/zip.h" #endif #include "util/text/utf8.h" +#include "file/ini_file.h" #include "Common/Log.h" #include "Common/FileUtil.h" diff --git a/GPU/Common/PostShader.cpp b/GPU/Common/PostShader.cpp index 5c24d48ee3..57eaf1f50d 100644 --- a/GPU/Common/PostShader.cpp +++ b/GPU/Common/PostShader.cpp @@ -103,7 +103,7 @@ void LoadPostShaderInfo(const std::vector &directories) { // Alright, let's loop through the sections and see if any is a shader. for (size_t i = 0; i < ini.Sections().size(); i++) { - IniFile::Section §ion = ini.Sections()[i]; + Section §ion = ini.Sections()[i]; std::string shaderType; section.Get("Type", &shaderType, "render"); diff --git a/GPU/Vulkan/PipelineManagerVulkan.cpp b/GPU/Vulkan/PipelineManagerVulkan.cpp index e8898c144b..9986f1a523 100644 --- a/GPU/Vulkan/PipelineManagerVulkan.cpp +++ b/GPU/Vulkan/PipelineManagerVulkan.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include "profiler/profiler.h" diff --git a/UI/CwCheatScreen.cpp b/UI/CwCheatScreen.cpp index c36056b273..dad1ac5861 100644 --- a/UI/CwCheatScreen.cpp +++ b/UI/CwCheatScreen.cpp @@ -15,6 +15,7 @@ // Official git repository and contact information can be found at // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. +#include "base/stringutil.h" #include "ext/cityhash/city.h" #include "i18n/i18n.h" #include "ui/ui.h" diff --git a/UI/ReportScreen.cpp b/UI/ReportScreen.cpp index e2cf904b2c..f214ba9dfd 100644 --- a/UI/ReportScreen.cpp +++ b/UI/ReportScreen.cpp @@ -16,6 +16,7 @@ // https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. #include + #include "base/display.h" #include "base/stringutil.h" // TODO: For text align flags, probably shouldn't be in gfx_es2/... diff --git a/ext/native/base/stringutil.cpp b/ext/native/base/stringutil.cpp index d0ff0a71d7..5fa467c577 100644 --- a/ext/native/base/stringutil.cpp +++ b/ext/native/base/stringutil.cpp @@ -8,8 +8,8 @@ #define _GNU_SOURCE #include #endif -#include -#include +#include +#include #include #include #include diff --git a/ext/native/base/stringutil.h b/ext/native/base/stringutil.h index 744a725088..05551d4043 100644 --- a/ext/native/base/stringutil.h +++ b/ext/native/base/stringutil.h @@ -1,7 +1,6 @@ #pragma once #include -#include #include #include "base/basictypes.h" @@ -38,7 +37,7 @@ inline bool startsWith(const std::string &str, const std::string &what) { inline bool endsWith(const std::string &str, const std::string &what) { if (str.size() < what.size()) return false; - return str.substr(str.size() - what.size()) == what; + return str.substr(str.size() - what.size()) == what; } // Only use on strings where you're only concerned about ASCII. @@ -57,7 +56,7 @@ inline bool endsWithNoCase(const std::string &str, const std::string &what) { void DataToHexString(const uint8_t *data, size_t size, std::string *output); inline void StringToHexString(const std::string &data, std::string *output) { - DataToHexString((uint8_t *)(&data[0]), data.size(), output); + DataToHexString((uint8_t *)(&data[0]), data.size(), output); } std::string StringFromFormat(const char* format, ...); diff --git a/ext/native/file/ini_file.cpp b/ext/native/file/ini_file.cpp index f8a96025a2..1e4beadaeb 100644 --- a/ext/native/file/ini_file.cpp +++ b/ext/native/file/ini_file.cpp @@ -2,18 +2,19 @@ // Taken from Dolphin but relicensed by me, Henrik Rydgard, under the MIT // license as I wrote the whole thing originally and it has barely changed. -#include -#include +#include +#include #ifndef _MSC_VER #include #endif -#include -#include +#include #include #include -#include +#include +#include +#include #include "base/logging.h" #include "base/stringutil.h" @@ -22,7 +23,7 @@ #include "util/text/parsers.h" #ifdef _WIN32 -#include "../util/text/utf8.h" +#include "util/text/utf8.h" #endif static bool ParseLineKey(const std::string &line, size_t &pos, std::string *keyOut) { @@ -147,11 +148,11 @@ static std::string EscapeComments(const std::string &value) { return result; } -void IniFile::Section::Clear() { +void Section::Clear() { lines.clear(); } -std::string* IniFile::Section::GetLine(const char* key, std::string* valueOut, std::string* commentOut) +std::string* Section::GetLine(const char* key, std::string* valueOut, std::string* commentOut) { for (std::vector::iterator iter = lines.begin(); iter != lines.end(); ++iter) { @@ -164,7 +165,7 @@ std::string* IniFile::Section::GetLine(const char* key, std::string* valueOut, s return 0; } -void IniFile::Section::Set(const char* key, const char* newValue) +void Section::Set(const char* key, const char* newValue) { std::string value, commented; std::string* line = GetLine(key, &value, &commented); @@ -180,7 +181,7 @@ void IniFile::Section::Set(const char* key, const char* newValue) } } -void IniFile::Section::Set(const char* key, const std::string& newValue, const std::string& defaultValue) +void Section::Set(const char* key, const std::string& newValue, const std::string& defaultValue) { if (newValue != defaultValue) Set(key, newValue); @@ -188,7 +189,7 @@ void IniFile::Section::Set(const char* key, const std::string& newValue, const s Delete(key); } -bool IniFile::Section::Get(const char* key, std::string* value, const char* defaultValue) +bool Section::Get(const char* key, std::string* value, const char* defaultValue) { const std::string* line = GetLine(key, value, 0); if (!line) @@ -202,7 +203,7 @@ bool IniFile::Section::Get(const char* key, std::string* value, const char* defa return true; } -void IniFile::Section::Set(const char* key, const float newValue, const float defaultValue) +void Section::Set(const char* key, const float newValue, const float defaultValue) { if (newValue != defaultValue) Set(key, newValue); @@ -210,7 +211,7 @@ void IniFile::Section::Set(const char* key, const float newValue, const float de Delete(key); } -void IniFile::Section::Set(const char* key, int newValue, int defaultValue) +void Section::Set(const char* key, int newValue, int defaultValue) { if (newValue != defaultValue) Set(key, newValue); @@ -218,7 +219,7 @@ void IniFile::Section::Set(const char* key, int newValue, int defaultValue) Delete(key); } -void IniFile::Section::Set(const char* key, bool newValue, bool defaultValue) +void Section::Set(const char* key, bool newValue, bool defaultValue) { if (newValue != defaultValue) Set(key, newValue); @@ -226,7 +227,7 @@ void IniFile::Section::Set(const char* key, bool newValue, bool defaultValue) Delete(key); } -void IniFile::Section::Set(const char* key, const std::vector& newValues) +void Section::Set(const char* key, const std::vector& newValues) { std::string temp; // Join the strings with , @@ -241,11 +242,11 @@ void IniFile::Section::Set(const char* key, const std::vector& newV Set(key, temp.c_str()); } -void IniFile::Section::AddComment(const std::string &comment) { +void Section::AddComment(const std::string &comment) { lines.push_back("# " + comment); } -bool IniFile::Section::Get(const char* key, std::vector& values) +bool Section::Get(const char* key, std::vector& values) { std::string temp; bool retval = Get(key, &temp, 0); @@ -273,7 +274,7 @@ bool IniFile::Section::Get(const char* key, std::vector& values) return true; } -bool IniFile::Section::Get(const char* key, int* value, int defaultValue) +bool Section::Get(const char* key, int* value, int defaultValue) { std::string temp; bool retval = Get(key, &temp, 0); @@ -283,7 +284,7 @@ bool IniFile::Section::Get(const char* key, int* value, int defaultValue) return false; } -bool IniFile::Section::Get(const char* key, uint32_t* value, uint32_t defaultValue) +bool Section::Get(const char* key, uint32_t* value, uint32_t defaultValue) { std::string temp; bool retval = Get(key, &temp, 0); @@ -293,7 +294,7 @@ bool IniFile::Section::Get(const char* key, uint32_t* value, uint32_t defaultVal return false; } -bool IniFile::Section::Get(const char* key, bool* value, bool defaultValue) +bool Section::Get(const char* key, bool* value, bool defaultValue) { std::string temp; bool retval = Get(key, &temp, 0); @@ -303,7 +304,7 @@ bool IniFile::Section::Get(const char* key, bool* value, bool defaultValue) return false; } -bool IniFile::Section::Get(const char* key, float* value, float defaultValue) +bool Section::Get(const char* key, float* value, float defaultValue) { std::string temp; bool retval = Get(key, &temp, 0); @@ -313,7 +314,7 @@ bool IniFile::Section::Get(const char* key, float* value, float defaultValue) return false; } -bool IniFile::Section::Get(const char* key, double* value, double defaultValue) +bool Section::Get(const char* key, double* value, double defaultValue) { std::string temp; bool retval = Get(key, &temp, 0); @@ -323,7 +324,7 @@ bool IniFile::Section::Get(const char* key, double* value, double defaultValue) return false; } -bool IniFile::Section::Exists(const char *key) const +bool Section::Exists(const char *key) const { for (std::vector::const_iterator iter = lines.begin(); iter != lines.end(); ++iter) { @@ -335,7 +336,7 @@ bool IniFile::Section::Exists(const char *key) const return false; } -std::map IniFile::Section::ToMap() const +std::map Section::ToMap() const { std::map outMap; for (std::vector::const_iterator iter = lines.begin(); iter != lines.end(); ++iter) @@ -349,7 +350,7 @@ std::map IniFile::Section::ToMap() const } -bool IniFile::Section::Delete(const char *key) +bool Section::Delete(const char *key) { std::string* line = GetLine(key, 0, 0); for (std::vector::iterator liter = lines.begin(); liter != lines.end(); ++liter) @@ -365,7 +366,7 @@ bool IniFile::Section::Delete(const char *key) // IniFile -const IniFile::Section* IniFile::GetSection(const char* sectionName) const +const Section* IniFile::GetSection(const char* sectionName) const { for (std::vector
::const_iterator iter = sections.begin(); iter != sections.end(); ++iter) if (!strcasecmp(iter->name().c_str(), sectionName)) @@ -373,7 +374,7 @@ const IniFile::Section* IniFile::GetSection(const char* sectionName) const return 0; } -IniFile::Section* IniFile::GetSection(const char* sectionName) +Section* IniFile::GetSection(const char* sectionName) { for (std::vector
::iterator iter = sections.begin(); iter != sections.end(); ++iter) if (!strcasecmp(iter->name().c_str(), sectionName)) @@ -381,7 +382,7 @@ IniFile::Section* IniFile::GetSection(const char* sectionName) return 0; } -IniFile::Section* IniFile::GetOrCreateSection(const char* sectionName) +Section* IniFile::GetOrCreateSection(const char* sectionName) { Section* section = GetSection(sectionName); if (!section) diff --git a/ext/native/file/ini_file.h b/ext/native/file/ini_file.h index 467f4b870f..41d7bb711f 100644 --- a/ext/native/file/ini_file.h +++ b/ext/native/file/ini_file.h @@ -8,89 +8,86 @@ #include #include #include +#include "base/stringutil.h" -std::string StringFromFormat(const char* format, ...); -std::string StringFromInt(int value); -std::string StringFromBool(bool value); +class Section +{ + friend class IniFile; + +public: + Section() {} + Section(const std::string& name) : name_(name) {} + + bool Exists(const char *key) const; + bool Delete(const char *key); + + void Clear(); + + std::map ToMap() const; + + std::string* GetLine(const char* key, std::string* valueOut, std::string* commentOut); + void Set(const char* key, const char* newValue); + void Set(const char* key, const std::string& newValue, const std::string& defaultValue); + + void Set(const std::string &key, const std::string &value) { + Set(key.c_str(), value.c_str()); + } + bool Get(const char* key, std::string* value, const char* defaultValue); + + void Set(const char* key, uint32_t newValue) { + Set(key, StringFromFormat("0x%08x", newValue).c_str()); + } + void Set(const char* key, float newValue) { + Set(key, StringFromFormat("%f", newValue).c_str()); + } + void Set(const char* key, const float newValue, const float defaultValue); + void Set(const char* key, double newValue) { + Set(key, StringFromFormat("%f", newValue).c_str()); + } + + void Set(const char* key, int newValue, int defaultValue); + void Set(const char* key, int newValue) { + Set(key, StringFromInt(newValue).c_str()); + } + + void Set(const char* key, bool newValue, bool defaultValue); + void Set(const char* key, bool newValue) { + Set(key, StringFromBool(newValue).c_str()); + } + void Set(const char* key, const std::vector& newValues); + + // Declare without a body to make it fail to compile. This is to prevent accidentally + // setting a pointer as a bool. The failure is in the linker unfortunately, but that's better + // than accidentally succeeding in a bad way. + template + void Set(const char *key, T *ptr); + + void AddComment(const std::string &comment); + + bool Get(const char* key, int* value, int defaultValue = 0); + bool Get(const char* key, uint32_t* value, uint32_t defaultValue = 0); + bool Get(const char* key, bool* value, bool defaultValue = false); + bool Get(const char* key, float* value, float defaultValue = false); + bool Get(const char* key, double* value, double defaultValue = false); + bool Get(const char* key, std::vector& values); + + bool operator < (const Section& other) const { + return name_ < other.name_; + } + + const std::string &name() const { + return name_; + } + +protected: + std::vector lines; + std::string name_; + std::string comment; +}; class IniFile { public: - class Section - { - friend class IniFile; - - public: - Section() {} - Section(const std::string& name) : name_(name) {} - - bool Exists(const char *key) const; - bool Delete(const char *key); - - void Clear(); - - std::map ToMap() const; - - std::string* GetLine(const char* key, std::string* valueOut, std::string* commentOut); - void Set(const char* key, const char* newValue); - void Set(const char* key, const std::string& newValue, const std::string& defaultValue); - - void Set(const std::string &key, const std::string &value) { - Set(key.c_str(), value.c_str()); - } - bool Get(const char* key, std::string* value, const char* defaultValue); - - void Set(const char* key, uint32_t newValue) { - Set(key, StringFromFormat("0x%08x", newValue).c_str()); - } - void Set(const char* key, float newValue) { - Set(key, StringFromFormat("%f", newValue).c_str()); - } - void Set(const char* key, const float newValue, const float defaultValue); - void Set(const char* key, double newValue) { - Set(key, StringFromFormat("%f", newValue).c_str()); - } - - void Set(const char* key, int newValue, int defaultValue); - void Set(const char* key, int newValue) { - Set(key, StringFromInt(newValue).c_str()); - } - - void Set(const char* key, bool newValue, bool defaultValue); - void Set(const char* key, bool newValue) { - Set(key, StringFromBool(newValue).c_str()); - } - void Set(const char* key, const std::vector& newValues); - - // Declare without a body to make it fail to compile. This is to prevent accidentally - // setting a pointer as a bool. The failure is in the linker unfortunately, but that's better - // than accidentally succeeding in a bad way. - template - void Set(const char *key, T *ptr); - - void AddComment(const std::string &comment); - - bool Get(const char* key, int* value, int defaultValue = 0); - bool Get(const char* key, uint32_t* value, uint32_t defaultValue = 0); - bool Get(const char* key, bool* value, bool defaultValue = false); - bool Get(const char* key, float* value, float defaultValue = false); - bool Get(const char* key, double* value, double defaultValue = false); - bool Get(const char* key, std::vector& values); - - bool operator < (const Section& other) const { - return name_ < other.name_; - } - - const std::string &name() const { - return name_; - } - - protected: - std::vector lines; - std::string name_; - std::string comment; - }; - bool Load(const char* filename); bool Load(const std::string &filename) { return Load(filename.c_str()); } bool Load(std::istream &istream); diff --git a/ext/native/i18n/i18n.cpp b/ext/native/i18n/i18n.cpp index cba62a2e4b..2b0aa77f8d 100644 --- a/ext/native/i18n/i18n.cpp +++ b/ext/native/i18n/i18n.cpp @@ -96,7 +96,7 @@ bool I18NRepo::LoadIni(const std::string &languageID, const std::string &overrid Clear(); - const std::vector §ions = ini.Sections(); + const std::vector
§ions = ini.Sections(); std::lock_guard guard(catsLock_); for (auto iter = sections.begin(); iter != sections.end(); ++iter) { @@ -109,7 +109,7 @@ bool I18NRepo::LoadIni(const std::string &languageID, const std::string &overrid return true; } -I18NCategory *I18NRepo::LoadSection(const IniFile::Section *section, const char *name) { +I18NCategory *I18NRepo::LoadSection(const Section *section, const char *name) { I18NCategory *cat = new I18NCategory(this, name); std::map sectionMap = section->ToMap(); cat->SetMap(sectionMap); @@ -124,13 +124,13 @@ void I18NRepo::SaveIni(const std::string &languageID) { std::lock_guard guard(catsLock_); for (auto iter = cats_.begin(); iter != cats_.end(); ++iter) { std::string categoryName = iter->first; - IniFile::Section *section = ini.GetOrCreateSection(categoryName.c_str()); + Section *section = ini.GetOrCreateSection(categoryName.c_str()); SaveSection(ini, section, iter->second); } ini.Save(GetIniPath(languageID)); } -void I18NRepo::SaveSection(IniFile &ini, IniFile::Section *section, std::shared_ptr cat) { +void I18NRepo::SaveSection(IniFile &ini, Section *section, std::shared_ptr cat) { const std::map &missed = cat->Missed(); for (auto iter = missed.begin(); iter != missed.end(); ++iter) { diff --git a/ext/native/i18n/i18n.h b/ext/native/i18n/i18n.h index b184dd7975..a973ea2f8f 100644 --- a/ext/native/i18n/i18n.h +++ b/ext/native/i18n/i18n.h @@ -15,11 +15,12 @@ #include #include "base/basictypes.h" -#include "file/ini_file.h" // Reasonably thread safe. class I18NRepo; +class IniFile; +class Section; struct I18NEntry { I18NEntry(const std::string &t) : text(t), readFlag(false) {} @@ -90,8 +91,8 @@ public: private: std::string GetIniPath(const std::string &languageID) const; void Clear(); - I18NCategory *LoadSection(const IniFile::Section *section, const char *name); - void SaveSection(IniFile &ini, IniFile::Section *section, std::shared_ptr cat); + I18NCategory *LoadSection(const Section *section, const char *name); + void SaveSection(IniFile &ini, Section *section, std::shared_ptr cat); mutable std::mutex catsLock_; std::map> cats_;