summaryrefslogtreecommitdiff
path: root/Source/Core/Common/Src/StringUtil.cpp
diff options
context:
space:
mode:
authorbushing <bushing@gmail.com>2008-12-08 05:30:24 +0000
committerbushing <bushing@gmail.com>2008-12-08 05:30:24 +0000
commit49cfded60bb5b444d1828190eacc52bbb49a9cb8 (patch)
tree0823218c1f2f6eec307dadbdec18c5632625f052 /Source/Core/Common/Src/StringUtil.cpp
parent901fe7c00fec5e2aaf55d184edbcb6d092345d52 (diff)
set svn:eol-style=native for **.cpp
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@1442 8ced0084-cf51-0410-be5f-012b33b47a6e
Diffstat (limited to 'Source/Core/Common/Src/StringUtil.cpp')
-rw-r--r--Source/Core/Common/Src/StringUtil.cpp792
1 files changed, 396 insertions, 396 deletions
diff --git a/Source/Core/Common/Src/StringUtil.cpp b/Source/Core/Common/Src/StringUtil.cpp
index 205ad61e72..597e5fc620 100644
--- a/Source/Core/Common/Src/StringUtil.cpp
+++ b/Source/Core/Common/Src/StringUtil.cpp
@@ -1,396 +1,396 @@
-// Copyright (C) 2003-2008 Dolphin Project.
-
-// 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, version 2.0.
-
-// 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 2.0 for more details.
-
-// A copy of the GPL 2.0 should have been included with the program.
-// If not, see http://www.gnu.org/licenses/
-
-// Official SVN repository and contact information can be found at
-// http://code.google.com/p/dolphin-emu/
-
-#include <stdlib.h>
-#include <stdio.h>
-
-#include "StringUtil.h"
-#include "TestFramework.h"
-
-// faster than sscanf
-bool AsciiToHex(const char* _szValue, u32& result)
-{
- u32 value = 0;
- size_t finish = strlen(_szValue);
-
- if (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 'A':
- case 'a': value += 10; break;
- case 'B':
- case 'b': value += 11; break;
- case 'C':
- case 'c': value += 12; break;
- case 'D':
- case 'd': value += 13; break;
- case 'E':
- case 'e': value += 14; break;
- case 'F':
- case 'f': value += 15; break;
- default:
- return false;
- break;
- }
- }
-
- result = value;
- return (true);
-}
-
-bool CharArrayFromFormatV(char* out, int outsize, const char* format, va_list args)
-{
- int writtenCount = vsnprintf(out, outsize, format, args);
-
- if (writtenCount > 0 && writtenCount < outsize)
- {
- out[writtenCount] = '\0';
- return true;
- }
- else
- {
- out[outsize - 1] = '\0';
- return false;
- }
-}
-
-
-// Expensive!
-void StringFromFormatV(std::string* out, const char* format, va_list args)
-{
- int writtenCount = -1;
- size_t newSize = strlen(format) + 16;
- char* buf = 0;
-
- while (writtenCount < 0)
- {
- delete [] buf;
- buf = new char[newSize + 1];
- writtenCount = vsnprintf(buf, newSize, format, args);
- if (writtenCount > (int)newSize)
- writtenCount = -1;
- // ARGH! vsnprintf does no longer return -1 on truncation in newer libc!
- // WORKAROUND! let's fake the old behaviour (even though it's less efficient).
- // TODO: figure out why the fix causes an invalid read in strlen called from vsnprintf :(
-// if (writtenCount >= (int)newSize)
-// writtenCount = -1;
- newSize *= 2;
- }
-
- buf[writtenCount] = '\0';
- *out = buf;
- delete[] buf;
-}
-
-
-std::string StringFromFormat(const char* format, ...)
-{
- std::string temp;
- va_list args;
- va_start(args, format);
- StringFromFormatV(&temp, format, args);
- va_end(args);
- return(temp);
-}
-
-
-void ToStringFromFormat(std::string* out, const char* format, ...)
-{
- va_list args;
- va_start(args, format);
- StringFromFormatV(out, format, args);
- va_end(args);
-}
-
-
-// Turns " hej " into "hej". Also handles tabs.
-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))
- {
- break;
- }
- }
-
- s = s.substr(i);
-
- for (i = (int)s.size() - 1; i > 0; i--)
- {
- if ((s[i] != ' ') && (s[i] != 9))
- {
- break;
- }
- }
-
- return s.substr(0, i + 1);
-}
-
-
-// "\"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 StripQuotes(const std::string& s)
-{
- if ((s[0] == '\"') && (s[s.size() - 1] == '\"'))
- return s.substr(1, s.size() - 2);
- else
- 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)
-{
- const char* s = str;
- int value = 0;
- bool negativ = false;
-
- if (*s == '-')
- {
- negativ = true;
- s++;
- }
-
- while (*s)
- {
- char c = *s++;
-
- if ((c < '0') || (c > '9'))
- {
- return false;
- }
-
- value = value * 10 + (c - '0');
- }
- if (negativ)
- value = -value;
-
- *outVal = value;
- return true;
-}
-
-
-bool TryParseBool(const char* str, bool* output)
-{
- if ((str[0] == '1') || !strcmp(str, "true") || !strcmp(str, "True") || !strcmp(str, "TRUE"))
- {
- *output = true;
- return true;
- }
- else if (str[0] == '0' || !strcmp(str, "false") || !strcmp(str, "False") || !strcmp(str, "FALSE"))
- {
- *output = false;
- return true;
- }
- return false;
-}
-
-std::string StringFromInt(int value)
-{
- char temp[16];
- sprintf(temp, "%i", value);
- return std::string(temp);
-}
-
-std::string StringFromBool(bool value)
-{
- return value ? "True" : "False";
-}
-
-#ifdef _WIN32
-bool SplitPath(const std::string& full_path, std::string* _pPath, std::string* _pFilename, std::string* _pExtension)
-{
- char drive[_MAX_DRIVE];
- char dir[_MAX_DIR];
- char fname[_MAX_FNAME];
- char ext[_MAX_EXT];
-
- if (_splitpath_s(full_path.c_str(), drive, _MAX_DRIVE, dir, _MAX_DIR, fname, _MAX_FNAME, ext, _MAX_EXT) == 0)
- {
- if (_pPath)
- {
- *_pPath = std::string(drive) + std::string(dir);
- }
-
- if (_pFilename != 0)
- {
- *_pFilename = fname;
- }
-
- if (_pExtension != 0)
- {
- *_pExtension = ext;
- }
-
- return true;
- }
-
- return false;
-}
-
-
-#else
-bool SplitPath(const std::string& full_path, std::string* _pPath, std::string* _pFilename, std::string* _pExtension)
-{
- size_t last_slash = full_path.rfind('/');
-
- if (last_slash == std::string::npos)
- {
- return false;
- }
-
- size_t last_dot = full_path.rfind('.');
-
- if ((last_dot == std::string::npos) || (last_dot < last_slash))
- {
- return false;
- }
-
- if (_pPath)
- {
- *_pPath = full_path.substr(0, last_slash + 1);
- }
-
- if (_pFilename)
- {
- *_pFilename = full_path.substr(last_slash + 1, last_dot - (last_slash + 1));
- }
-
- if (_pExtension)
- {
- *_pExtension = full_path.substr(last_dot + 1);
- _pExtension->insert(0, ".");
- }
- else if (_pFilename)
- {
- *_pFilename += full_path.substr(last_dot);
- }
-
- return true;
-}
-
-
-#endif
-
-void BuildCompleteFilename(std::string& _CompleteFilename, const std::string& _Path, const std::string& _Filename)
-{
- _CompleteFilename = _Path;
-
- // check for seperator
- if (_CompleteFilename[_CompleteFilename.size() - 1] != '\\')
- {
- _CompleteFilename += "\\";
- }
-
- // add the filename
- _CompleteFilename += _Filename;
-}
-
-
-void SplitString(const std::string& str, const std::string& delim, std::vector<std::string>& output)
-{
- output.clear();
-
- size_t offset = 0;
- size_t delimIndex = 0;
-
- delimIndex = str.find(delim, offset);
-
- while (delimIndex != std::string::npos)
- {
- output.push_back(str.substr(offset, delimIndex - offset));
- offset += delimIndex - offset + delim.length();
- delimIndex = str.find(delim, offset);
- }
-
- output.push_back(str.substr(offset));
-}
-
-
-bool TryParseUInt(const std::string& str, u32* output)
-{
- if (!strcmp(str.substr(0, 2).c_str(), "0x") || !strcmp(str.substr(0, 2).c_str(), "0X"))
- return sscanf(str.c_str() + 2, "%x", output) > 0;
- else
- 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;
- i++;
- }
- return -1;
-}
-
-
-// Thousand separator. Turns 12345678 into 12,345,678.
-std::string ThS(int a, bool b)
-{
- char cbuf[20];
-
- // determine treatment of signed or unsigned
- if(b) sprintf(cbuf, "%u", a); else sprintf(cbuf, "%i", a);
-
-
- std::string sbuf = cbuf;
- for (u32 i = 0; i < sbuf.length(); ++i)
- {
- if((i & 3) == 3)
- {
- sbuf.insert(sbuf.length() - i, ",");
- }
- }
- return sbuf;
-}
-
-
+// Copyright (C) 2003-2008 Dolphin Project.
+
+// 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, version 2.0.
+
+// 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 2.0 for more details.
+
+// A copy of the GPL 2.0 should have been included with the program.
+// If not, see http://www.gnu.org/licenses/
+
+// Official SVN repository and contact information can be found at
+// http://code.google.com/p/dolphin-emu/
+
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "StringUtil.h"
+#include "TestFramework.h"
+
+// faster than sscanf
+bool AsciiToHex(const char* _szValue, u32& result)
+{
+ u32 value = 0;
+ size_t finish = strlen(_szValue);
+
+ if (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 'A':
+ case 'a': value += 10; break;
+ case 'B':
+ case 'b': value += 11; break;
+ case 'C':
+ case 'c': value += 12; break;
+ case 'D':
+ case 'd': value += 13; break;
+ case 'E':
+ case 'e': value += 14; break;
+ case 'F':
+ case 'f': value += 15; break;
+ default:
+ return false;
+ break;
+ }
+ }
+
+ result = value;
+ return (true);
+}
+
+bool CharArrayFromFormatV(char* out, int outsize, const char* format, va_list args)
+{
+ int writtenCount = vsnprintf(out, outsize, format, args);
+
+ if (writtenCount > 0 && writtenCount < outsize)
+ {
+ out[writtenCount] = '\0';
+ return true;
+ }
+ else
+ {
+ out[outsize - 1] = '\0';
+ return false;
+ }
+}
+
+
+// Expensive!
+void StringFromFormatV(std::string* out, const char* format, va_list args)
+{
+ int writtenCount = -1;
+ size_t newSize = strlen(format) + 16;
+ char* buf = 0;
+
+ while (writtenCount < 0)
+ {
+ delete [] buf;
+ buf = new char[newSize + 1];
+ writtenCount = vsnprintf(buf, newSize, format, args);
+ if (writtenCount > (int)newSize)
+ writtenCount = -1;
+ // ARGH! vsnprintf does no longer return -1 on truncation in newer libc!
+ // WORKAROUND! let's fake the old behaviour (even though it's less efficient).
+ // TODO: figure out why the fix causes an invalid read in strlen called from vsnprintf :(
+// if (writtenCount >= (int)newSize)
+// writtenCount = -1;
+ newSize *= 2;
+ }
+
+ buf[writtenCount] = '\0';
+ *out = buf;
+ delete[] buf;
+}
+
+
+std::string StringFromFormat(const char* format, ...)
+{
+ std::string temp;
+ va_list args;
+ va_start(args, format);
+ StringFromFormatV(&temp, format, args);
+ va_end(args);
+ return(temp);
+}
+
+
+void ToStringFromFormat(std::string* out, const char* format, ...)
+{
+ va_list args;
+ va_start(args, format);
+ StringFromFormatV(out, format, args);
+ va_end(args);
+}
+
+
+// Turns " hej " into "hej". Also handles tabs.
+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))
+ {
+ break;
+ }
+ }
+
+ s = s.substr(i);
+
+ for (i = (int)s.size() - 1; i > 0; i--)
+ {
+ if ((s[i] != ' ') && (s[i] != 9))
+ {
+ break;
+ }
+ }
+
+ return s.substr(0, i + 1);
+}
+
+
+// "\"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 StripQuotes(const std::string& s)
+{
+ if ((s[0] == '\"') && (s[s.size() - 1] == '\"'))
+ return s.substr(1, s.size() - 2);
+ else
+ 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)
+{
+ const char* s = str;
+ int value = 0;
+ bool negativ = false;
+
+ if (*s == '-')
+ {
+ negativ = true;
+ s++;
+ }
+
+ while (*s)
+ {
+ char c = *s++;
+
+ if ((c < '0') || (c > '9'))
+ {
+ return false;
+ }
+
+ value = value * 10 + (c - '0');
+ }
+ if (negativ)
+ value = -value;
+
+ *outVal = value;
+ return true;
+}
+
+
+bool TryParseBool(const char* str, bool* output)
+{
+ if ((str[0] == '1') || !strcmp(str, "true") || !strcmp(str, "True") || !strcmp(str, "TRUE"))
+ {
+ *output = true;
+ return true;
+ }
+ else if (str[0] == '0' || !strcmp(str, "false") || !strcmp(str, "False") || !strcmp(str, "FALSE"))
+ {
+ *output = false;
+ return true;
+ }
+ return false;
+}
+
+std::string StringFromInt(int value)
+{
+ char temp[16];
+ sprintf(temp, "%i", value);
+ return std::string(temp);
+}
+
+std::string StringFromBool(bool value)
+{
+ return value ? "True" : "False";
+}
+
+#ifdef _WIN32
+bool SplitPath(const std::string& full_path, std::string* _pPath, std::string* _pFilename, std::string* _pExtension)
+{
+ char drive[_MAX_DRIVE];
+ char dir[_MAX_DIR];
+ char fname[_MAX_FNAME];
+ char ext[_MAX_EXT];
+
+ if (_splitpath_s(full_path.c_str(), drive, _MAX_DRIVE, dir, _MAX_DIR, fname, _MAX_FNAME, ext, _MAX_EXT) == 0)
+ {
+ if (_pPath)
+ {
+ *_pPath = std::string(drive) + std::string(dir);
+ }
+
+ if (_pFilename != 0)
+ {
+ *_pFilename = fname;
+ }
+
+ if (_pExtension != 0)
+ {
+ *_pExtension = ext;
+ }
+
+ return true;
+ }
+
+ return false;
+}
+
+
+#else
+bool SplitPath(const std::string& full_path, std::string* _pPath, std::string* _pFilename, std::string* _pExtension)
+{
+ size_t last_slash = full_path.rfind('/');
+
+ if (last_slash == std::string::npos)
+ {
+ return false;
+ }
+
+ size_t last_dot = full_path.rfind('.');
+
+ if ((last_dot == std::string::npos) || (last_dot < last_slash))
+ {
+ return false;
+ }
+
+ if (_pPath)
+ {
+ *_pPath = full_path.substr(0, last_slash + 1);
+ }
+
+ if (_pFilename)
+ {
+ *_pFilename = full_path.substr(last_slash + 1, last_dot - (last_slash + 1));
+ }
+
+ if (_pExtension)
+ {
+ *_pExtension = full_path.substr(last_dot + 1);
+ _pExtension->insert(0, ".");
+ }
+ else if (_pFilename)
+ {
+ *_pFilename += full_path.substr(last_dot);
+ }
+
+ return true;
+}
+
+
+#endif
+
+void BuildCompleteFilename(std::string& _CompleteFilename, const std::string& _Path, const std::string& _Filename)
+{
+ _CompleteFilename = _Path;
+
+ // check for seperator
+ if (_CompleteFilename[_CompleteFilename.size() - 1] != '\\')
+ {
+ _CompleteFilename += "\\";
+ }
+
+ // add the filename
+ _CompleteFilename += _Filename;
+}
+
+
+void SplitString(const std::string& str, const std::string& delim, std::vector<std::string>& output)
+{
+ output.clear();
+
+ size_t offset = 0;
+ size_t delimIndex = 0;
+
+ delimIndex = str.find(delim, offset);
+
+ while (delimIndex != std::string::npos)
+ {
+ output.push_back(str.substr(offset, delimIndex - offset));
+ offset += delimIndex - offset + delim.length();
+ delimIndex = str.find(delim, offset);
+ }
+
+ output.push_back(str.substr(offset));
+}
+
+
+bool TryParseUInt(const std::string& str, u32* output)
+{
+ if (!strcmp(str.substr(0, 2).c_str(), "0x") || !strcmp(str.substr(0, 2).c_str(), "0X"))
+ return sscanf(str.c_str() + 2, "%x", output) > 0;
+ else
+ 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;
+ i++;
+ }
+ return -1;
+}
+
+
+// Thousand separator. Turns 12345678 into 12,345,678.
+std::string ThS(int a, bool b)
+{
+ char cbuf[20];
+
+ // determine treatment of signed or unsigned
+ if(b) sprintf(cbuf, "%u", a); else sprintf(cbuf, "%i", a);
+
+
+ std::string sbuf = cbuf;
+ for (u32 i = 0; i < sbuf.length(); ++i)
+ {
+ if((i & 3) == 3)
+ {
+ sbuf.insert(sbuf.length() - i, ",");
+ }
+ }
+ return sbuf;
+}
+
+