diff --git a/Source/Core/Common/Src/IniFile.cpp b/Source/Core/Common/Src/IniFile.cpp index e10b65bc20..199cd92624 100644 --- a/Source/Core/Common/Src/IniFile.cpp +++ b/Source/Core/Common/Src/IniFile.cpp @@ -86,7 +86,7 @@ bool IniFile::DeleteSection(const char* sectionName) if (!s) { - return(false); + return false; } for (std::vector
::iterator iter = sections.begin(); iter != sections.end(); ++iter) @@ -94,11 +94,11 @@ bool IniFile::DeleteSection(const char* sectionName) if (&(*iter) == s) { sections.erase(iter); - return(true); + return true; } } - return(false); + return false; } @@ -150,11 +150,11 @@ std::string* IniFile::GetLine(Section* section, const char* key, std::string* va if (!stricmp(lineKey.c_str(), key)) { - return(&line); + return &line; } } - return(0); + return 0; } @@ -206,7 +206,7 @@ bool IniFile::Get(const char* sectionName, const char* key, std::string* value, *value = defaultValue; } - return(false); + return false; } std::string* line = GetLine(section, key, value, 0); @@ -218,10 +218,10 @@ bool IniFile::Get(const char* sectionName, const char* key, std::string* value, *value = defaultValue; } - return(false); + return false; } - return(true); + return true; } @@ -232,11 +232,11 @@ bool IniFile::Get(const char* sectionName, const char* key, int* value, int defa if (retval && TryParseInt(temp.c_str(), value)) { - return(true); + return true; } *value = defaultValue; - return(false); + return false; } @@ -247,11 +247,11 @@ bool IniFile::Get(const char* sectionName, const char* key, u32* value, u32 defa if (retval && TryParseUInt(temp.c_str(), value)) { - return(true); + return true; } *value = defaultValue; - return(false); + return false; } @@ -262,11 +262,11 @@ bool IniFile::Get(const char* sectionName, const char* key, bool* value, bool de if (retval && TryParseBool(temp.c_str(), value)) { - return(true); + return true; } *value = defaultValue; - return(false); + return false; } @@ -276,7 +276,7 @@ bool IniFile::DeleteKey(const char* sectionName, const char* key) if (!section) { - return(false); + return false; } std::string* line = GetLine(section, key, 0, 0); @@ -286,11 +286,11 @@ bool IniFile::DeleteKey(const char* sectionName, const char* key) if (line == &(*liter)) { section->lines.erase(liter); - return(true); + return true; } } - return(false); //shouldn't happen + return false; //shouldn't happen } @@ -305,7 +305,7 @@ bool IniFile::Load(const char* filename) if (in.fail()) { - return(false); + return false; } while (!in.eof()) @@ -345,7 +345,7 @@ bool IniFile::Load(const char* filename) } in.close(); - return(true); + return true; } @@ -356,7 +356,7 @@ bool IniFile::Save(const char* filename) if (out.fail()) { - return(false); + return false; } for (std::vector
::const_iterator iter = sections.begin(); iter != sections.end(); ++iter) @@ -376,7 +376,7 @@ bool IniFile::Save(const char* filename) } out.close(); - return(true); + return true; } @@ -386,7 +386,7 @@ bool IniFile::GetKeys(const char* sectionName, std::vector& keys) if (!section) { - return(false); + return false; } keys.clear(); @@ -398,26 +398,21 @@ bool IniFile::GetKeys(const char* sectionName, std::vector& keys) keys.push_back(key); } - return(true); + return true; } bool IniFile::GetLines(const char* sectionName, std::vector& lines) { Section* section = GetSection(sectionName); - if (!section) - { - return(false); - } + return false; lines.clear(); - for (std::vector::const_iterator iter = section->lines.begin(); iter != section->lines.end(); ++iter) { std::string line = StripSpaces(*iter); int commentPos = (int)line.find('#'); - if (commentPos == 0) { continue; @@ -431,8 +426,7 @@ bool IniFile::GetLines(const char* sectionName, std::vector& lines) lines.push_back(line); } - lines = section->lines; - return(true); + return true; } diff --git a/Source/Core/Common/Src/IniFile.h b/Source/Core/Common/Src/IniFile.h index 8addaea7c3..07a244ad2e 100644 --- a/Source/Core/Common/Src/IniFile.h +++ b/Source/Core/Common/Src/IniFile.h @@ -25,69 +25,61 @@ class Section { - public: +public: + Section(); + Section(const std::string& _name); + Section(const Section& other); + std::vectorlines; + std::string name; + std::string comment; - Section(); - Section(const std::string& _name); - Section(const Section& other); - std::vectorlines; - std::string name; - std::string comment; - - bool operator<(const Section& other) const - { - return(name < other.name); - } + bool operator<(const Section& other) const + { + return(name < other.name); + } }; class IniFile { - public: +public: + IniFile(); + ~IniFile(); - IniFile(); - ~IniFile(); + bool Load(const char* filename); + bool Save(const char* filename); - bool Load(const char* filename); - bool Save(const char* filename); + void Set(const char* sectionName, const char* key, const char* newValue); + void Set(const char* sectionName, const char* key, int newValue); + void Set(const char* sectionName, const char* key, u32 newValue); + void Set(const char* sectionName, const char* key, bool newValue); + void Set(const char* sectionName, const char* key, const std::string& newValue) {Set(sectionName, key, newValue.c_str());} + void Set(const char* sectionName, const char* key, const std::vector& newValues); - void Set(const char* sectionName, const char* key, const char* newValue); - void Set(const char* sectionName, const char* key, int newValue); - void Set(const char* sectionName, const char* key, u32 newValue); - void Set(const char* sectionName, const char* key, bool newValue); + // getter should be const + bool Get(const char* sectionName, const char* key, std::string* value, const char* defaultValue = ""); + bool Get(const char* sectionName, const char* key, int* value, int defaultValue = 0); + bool Get(const char* sectionName, const char* key, u32* value, u32 defaultValue = 0); + bool Get(const char* sectionName, const char* key, bool* value, bool defaultValue = false); + bool Get(const char* sectionName, const char* key, std::vector& values); + bool GetKeys(const char* sectionName, std::vector& keys); + bool GetLines(const char* sectionName, std::vector& lines); - void Set(const char* sectionName, const char* key, const std::string& newValue) {Set(sectionName, key, newValue.c_str());} + bool DeleteKey(const char* sectionName, const char* key); + bool DeleteSection(const char* sectionName); + void SortSections(); - void Set(const char* sectionName, const char* key, const std::vector& newValues); + void ParseLine(const std::string& line, std::string* keyOut, std::string* valueOut, std::string* commentOut); + std::string* GetLine(Section* section, const char* key, std::string* valueOut, std::string* commentOut); - // getter should be const - bool Get(const char* sectionName, const char* key, std::string* value, const char* defaultValue = ""); - bool Get(const char* sectionName, const char* key, int* value, int defaultValue = 0); - bool Get(const char* sectionName, const char* key, u32* value, u32 defaultValue = 0); - bool Get(const char* sectionName, const char* key, bool* value, bool defaultValue = false); - bool Get(const char* sectionName, const char* key, std::vector& values); +private: + std::vector
sections; - bool GetKeys(const char* sectionName, std::vector& keys); - bool GetLines(const char* sectionName, std::vector& lines); - - bool DeleteKey(const char* sectionName, const char* key); - bool DeleteSection(const char* sectionName); - - void SortSections(); - - void ParseLine(const std::string& line, std::string* keyOut, std::string* valueOut, std::string* commentOut); - std::string* GetLine(Section* section, const char* key, std::string* valueOut, std::string* commentOut); - - - private: - - std::vector
sections; - - Section* GetSection(const char* section); - Section* GetOrCreateSection(const char* section); - std::string* GetLine(const char* section, const char* key); - void CreateSection(const char* section); + Section* GetSection(const char* section); + Section* GetOrCreateSection(const char* section); + std::string* GetLine(const char* section, const char* key); + void CreateSection(const char* section); }; #endif diff --git a/Source/Core/Common/Src/MemArena.h b/Source/Core/Common/Src/MemArena.h index 1d9cdf7cc6..6a4ae6f3c6 100644 --- a/Source/Core/Common/Src/MemArena.h +++ b/Source/Core/Common/Src/MemArena.h @@ -31,25 +31,21 @@ class MemArena { - public: +public: + void GrabLowMemSpace(size_t size); + void ReleaseSpace(); + void* CreateView(s64 offset, size_t size, bool ensure_low_mem = false); + void* CreateViewAt(s64 offset, size_t size, void* base); + void ReleaseView(void* view, size_t size); - void GrabLowMemSpace(size_t size); - void ReleaseSpace(); - void* CreateView(s64 offset, size_t size, bool ensure_low_mem = false); - void* CreateViewAt(s64 offset, size_t size, void* base); - void ReleaseView(void* view, size_t size); - - - // This only finds 1 GB in 32-bit - static u8* Find4GBBase(); - - - private: + // This only finds 1 GB in 32-bit + static u8* Find4GBBase(); +private: #ifdef _WIN32 - HANDLE hMemoryMapping; + HANDLE hMemoryMapping; #else - int fd; + int fd; #endif }; diff --git a/Source/Core/Common/Src/StringUtil.cpp b/Source/Core/Common/Src/StringUtil.cpp index 133d2fb515..fface8ae1c 100644 --- a/Source/Core/Common/Src/StringUtil.cpp +++ b/Source/Core/Common/Src/StringUtil.cpp @@ -28,103 +28,35 @@ bool AsciiToHex(const char* _szValue, u32& result) size_t finish = strlen(_szValue); if (finish > 8) - { - finish = 8; - } + finish = 8; // Max 32-bit values are supported. for (size_t count = 0; count < finish; count++) { value <<= 4; - switch (_szValue[count]) { - case '0': - break; - - case '1': - value += 1; - break; - - case '2': - value += 2; - break; - - case '3': - value += 3; - break; - - case '4': - value += 4; - break; - - case '5': - value += 5; - break; - - case '6': - value += 6; - break; - - case '7': - value += 7; - break; - - case '8': - value += 8; - break; - - case '9': - value += 9; - break; - + case '0': break; + case '1': value += 1; break; + case '2': value += 2; break; + case '3': value += 3; break; + case '4': value += 4; break; + case '5': value += 5; break; + case '6': value += 6; break; + case '7': value += 7; break; + case '8': value += 8; break; + case '9': value += 9; break; case 'A': - value += 10; - break; - - case 'a': - value += 10; - break; - + case 'a': value += 10; break; case 'B': - value += 11; - break; - - case 'b': - value += 11; - break; - + case 'b': value += 11; break; case 'C': - value += 12; - break; - - case 'c': - value += 12; - break; - + case 'c': value += 12; break; case 'D': - value += 13; - break; - - case 'd': - value += 13; - break; - + case 'd': value += 13; break; case 'E': - value += 14; - break; - - case 'e': - value += 14; - break; - + case 'e': value += 14; break; case 'F': - value += 15; - break; - - case 'f': - value += 15; - break; - + case 'f': value += 15; break; default: return false; break; @@ -201,10 +133,10 @@ void ToStringFromFormat(std::string* out, const char* format, ...) // Turns " hej " into "hej". Also handles tabs. -std::string StripSpaces(std::string s) +std::string StripSpaces(const std::string &str) { + std::string s = str; int i; - for (i = 0; i < (int)s.size(); i++) { if ((s[i] != ' ') && (s[i] != 9)) @@ -223,7 +155,7 @@ std::string StripSpaces(std::string s) } } - return(s.substr(0, i + 1)); + return s.substr(0, i + 1); } @@ -233,15 +165,23 @@ std::string StripSpaces(std::string s) std::string StripQuotes(const std::string& s) { if ((s[0] == '\"') && (s[s.size() - 1] == '\"')) - { - return(s.substr(1, s.size() - 2)); - } + return s.substr(1, s.size() - 2); else - { - return(s); - } + return s; } +// "\"hello\"" is turned to "hello" +// This one assumes that the string has already been space stripped in both +// ends, as done by StripSpaces above, for example. +std::string StripNewline(const std::string& s) +{ + if (!s.size()) + return s; + else if (s[s.size() - 1] == '\n') + return s.substr(0, s.size() - 1); + else + return s; +} bool TryParseInt(const char* str, int* outVal) { @@ -261,7 +201,7 @@ bool TryParseInt(const char* str, int* outVal) if ((c < '0') || (c > '9')) { - return(false); + return false; } value = value * 10 + (c - '0'); @@ -270,7 +210,7 @@ bool TryParseInt(const char* str, int* outVal) value = -value; *outVal = value; - return(true); + return true; } @@ -279,32 +219,28 @@ bool TryParseBool(const char* str, bool* output) if ((str[0] == '1') || !strcmp(str, "true") || !strcmp(str, "True") || !strcmp(str, "TRUE")) { *output = true; - return(true); + return true; } else if (str[0] == '0' || !strcmp(str, "false") || !strcmp(str, "False") || !strcmp(str, "FALSE")) { *output = false; - return(true); + return true; } - - return(false); + return false; } - std::string StringFromInt(int value) { char temp[16]; sprintf(temp, "%i", value); - return(std::string(temp)); + return std::string(temp); } - std::string StringFromBool(bool value) { - return(value ? "True" : "False"); + return value ? "True" : "False"; } - #ifdef _WIN32 bool SplitPath(const std::string& full_path, std::string* _pPath, std::string* _pFilename, std::string* _pExtension) { @@ -330,10 +266,10 @@ bool SplitPath(const std::string& full_path, std::string* _pPath, std::string* _ *_pExtension = ext; } - return(true); + return true; } - return(false); + return false; } @@ -344,14 +280,14 @@ bool SplitPath(const std::string& full_path, std::string* _pPath, std::string* _ if (last_slash == std::string::npos) { - return(false); + return false; } size_t last_dot = full_path.rfind('.'); if ((last_dot == std::string::npos) || (last_dot < last_slash)) { - return(false); + return false; } if (_pPath) @@ -374,7 +310,7 @@ bool SplitPath(const std::string& full_path, std::string* _pPath, std::string* _ *_pFilename += full_path.substr(last_dot); } - return(true); + return true; } @@ -418,49 +354,20 @@ void SplitString(const std::string& str, const std::string& delim, std::vector 0); - } + return sscanf(str.c_str() + 2, "%x", output) > 0; else - { - return(sscanf(str.c_str(), "%d", output) > 0); - } + return sscanf(str.c_str(), "%d", output) > 0; } int ChooseStringFrom(const char* str, const char* * items) { int i = 0; - while (items[i] != 0) { if (!strcmp(str, items[i])) - { - return(i); - } - + return i; i++; } - - return(-1); -} - - -// Hmm, sometimes this test doesn't get run :P -TEST(splitStringTest) -{ - /* - std::string orig = "abc:def"; - std::vector split; - SplitString(orig, std::string(":"), split); - CHECK(split.size() == 2); - CHECK(!strcmp(split[0].c_str(), "abc")); - CHECK(!strcmp(split[1].c_str(), "def")); - - orig = "abc"; - SplitString(orig, std::string(":"), split); - CHECK(split.size() == 1); - orig = ":"; - SplitString(orig, std::string(":"), split); - CHECK(split.size() == 2);*/ + return -1; } diff --git a/Source/Core/Common/Src/StringUtil.h b/Source/Core/Common/Src/StringUtil.h index bc6496d198..f5e90729aa 100644 --- a/Source/Core/Common/Src/StringUtil.h +++ b/Source/Core/Common/Src/StringUtil.h @@ -47,8 +47,9 @@ inline void CharArrayFromFormat(char (& out)[Count], const char* format, ...) } -std::string StripSpaces(std::string s); -std::string StripQuotes(const std::string& s); +std::string StripSpaces(const std::string &s); +std::string StripQuotes(const std::string &s); +std::string StripNewline(const std::string &s); std::string StringFromInt(int value); diff --git a/Source/Core/Core/Src/HW/Memmap.cpp b/Source/Core/Core/Src/HW/Memmap.cpp index 7d14a37eca..e9b69ee923 100644 --- a/Source/Core/Core/Src/HW/Memmap.cpp +++ b/Source/Core/Core/Src/HW/Memmap.cpp @@ -448,7 +448,6 @@ bool Init() #ifdef _M_X64 //Then, in x64 mode where we have space, grab a 4GB virtual address space - //TODO: grab 8GB and align, for easier debugging base = MemArena::Find4GBBase(); //OK, we know where to find free space. Now grab it! diff --git a/Source/Core/Core/Src/PatchEngine.cpp b/Source/Core/Core/Src/PatchEngine.cpp index 64544d67c3..da5044ac0f 100644 --- a/Source/Core/Core/Src/PatchEngine.cpp +++ b/Source/Core/Core/Src/PatchEngine.cpp @@ -173,47 +173,59 @@ void LoadActionReplayCodes(IniFile &ini) if (!ini.GetLines("ActionReplay", lines)) return; - for (std::vector::const_iterator iter = lines.begin(); iter != lines.end(); ++iter) { - std::string line = StripSpaces(*iter); + for (std::vector::const_iterator iter = lines.begin(); iter != lines.end(); ++iter) + { + std::string line = *iter; + std::vector pieces; SplitString(line, " ", pieces); - if (pieces.size() == 2 && pieces[0].size() == 8 && pieces[1].size() == 8) { + if (pieces.size() == 2 && pieces[0].size() == 8 && pieces[1].size() == 8) + { // Smells like a decrypted Action Replay code, great! Decode! AREntry op; bool success = TryParseUInt(std::string("0x") + pieces[0], &op.cmd_addr); - success |= TryParseUInt(std::string("0x") + pieces[1], &op.value); - if (!success) { + success |= TryParseUInt(std::string("0x") + pieces[1], &op.value); + if (!success) PanicAlert("Invalid AR code line: %s", line.c_str()); - } else { + else currentCode.ops.push_back(op); - } - } else { + } + else + { SplitString(line, "-", pieces); if (pieces.size() == 3 && pieces[0].size() == 4 && pieces[1].size() == 4 && pieces[2].size() == 4) { // Encrypted AR code PanicAlert("Dolphin does not yet support encrypted AR codes."); } - else if (line.size()) { - if (line[0] == '+') { - // Active code + else if (line.size() > 1) + { + // OK, name line. This is the start of a new code. Push the old one, prepare the new one. + if (currentCode.ops.size()) + arCodes.push_back(currentCode); + currentCode.name = "(invalid)"; + currentCode.ops.clear(); + + if (line[0] == '+') + { + // Active code - name line. line = StripSpaces(line.substr(1)); currentCode.name = line; currentCode.active = true; } - else if (line[0] != '+') { + else + { + // Inactive code. currentCode.name = line; currentCode.active = false; } - } else { - // Empty line - end of code. Push it. - arCodes.push_back(currentCode); - currentCode.name = "(invalid)"; - currentCode.ops.clear(); } } - arCodes.push_back(currentCode); } + + // Handle the last code correctly. + if (currentCode.ops.size()) + arCodes.push_back(currentCode); } // The mechanism is slightly different than what the real AR uses, so there may be compatibility problems.