StringTools.cpp 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  2. // SPDX-License-Identifier: MIT
  3. #include <Jolt/Jolt.h>
  4. #include <Jolt/Core/StringTools.h>
  5. JPH_SUPPRESS_WARNINGS_STD_BEGIN
  6. #include <cstdarg>
  7. JPH_SUPPRESS_WARNINGS_STD_END
  8. JPH_NAMESPACE_BEGIN
  9. String StringFormat(const char *inFMT, ...)
  10. {
  11. char buffer[1024];
  12. // Format the string
  13. va_list list;
  14. va_start(list, inFMT);
  15. vsnprintf(buffer, sizeof(buffer), inFMT, list);
  16. return String(buffer);
  17. }
  18. void StringReplace(String &ioString, const string_view &inSearch, const string_view &inReplace)
  19. {
  20. size_t index = 0;
  21. for (;;)
  22. {
  23. index = ioString.find(inSearch, index);
  24. if (index == String::npos)
  25. break;
  26. ioString.replace(index, inSearch.size(), inReplace);
  27. index += inReplace.size();
  28. }
  29. }
  30. void StringToVector(const string_view &inString, Array<String> &outVector, const string_view &inDelimiter, bool inClearVector)
  31. {
  32. JPH_ASSERT(inDelimiter.size() > 0);
  33. // Ensure vector empty
  34. if (inClearVector)
  35. outVector.clear();
  36. // No string? no elements
  37. if (inString.empty())
  38. return;
  39. // Start with initial string
  40. String s(inString);
  41. // Add to vector while we have a delimiter
  42. size_t i;
  43. while (!s.empty() && (i = s.find(inDelimiter)) != String::npos)
  44. {
  45. outVector.push_back(s.substr(0, i));
  46. s.erase(0, i + inDelimiter.length());
  47. }
  48. // Add final element
  49. outVector.push_back(s);
  50. }
  51. void VectorToString(const Array<String> &inVector, String &outString, const string_view &inDelimiter)
  52. {
  53. // Ensure string empty
  54. outString.clear();
  55. for (const String &s : inVector)
  56. {
  57. // Add delimiter if not first element
  58. if (!outString.empty())
  59. outString.append(inDelimiter);
  60. // Add element
  61. outString.append(s);
  62. }
  63. }
  64. String ToLower(const string_view &inString)
  65. {
  66. String out;
  67. out.reserve(inString.length());
  68. for (char c : inString)
  69. out.push_back((char)tolower(c));
  70. return out;
  71. }
  72. const char *NibbleToBinary(uint32 inNibble)
  73. {
  74. static const char *nibbles[] = { "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111" };
  75. return nibbles[inNibble & 0xf];
  76. }
  77. JPH_NAMESPACE_END