You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

106 lines
2.4KB

  1. #include "global_pre.hpp"
  2. #include "util/common.hpp"
  3. #include <stdarg.h>
  4. #include <algorithm>
  5. #ifdef YAC_GCC
  6. #include <libgen.h> // for dirname and basename
  7. #endif
  8. namespace rack {
  9. std::string stringf(const char *format, ...) {
  10. va_list args;
  11. va_start(args, format);
  12. // Compute size of required buffer
  13. int size = vsnprintf(NULL, 0, format, args);
  14. va_end(args);
  15. if (size < 0)
  16. return "";
  17. // Create buffer
  18. std::string s;
  19. s.resize(size);
  20. va_start(args, format);
  21. vsnprintf(&s[0], size + 1, format, args);
  22. va_end(args);
  23. return s;
  24. }
  25. std::string stringLowercase(std::string s) {
  26. std::transform(s.begin(), s.end(), s.begin(), ::tolower);
  27. return s;
  28. }
  29. std::string stringUppercase(std::string s) {
  30. std::transform(s.begin(), s.end(), s.begin(), ::toupper);
  31. return s;
  32. }
  33. std::string stringEllipsize(std::string s, size_t len) {
  34. if (s.size() <= len)
  35. return s;
  36. else
  37. return s.substr(0, len - 3) + "...";
  38. }
  39. bool stringStartsWith(std::string str, std::string prefix) {
  40. return str.substr(0, prefix.size()) == prefix;
  41. }
  42. bool stringEndsWith(std::string str, std::string suffix) {
  43. return str.substr(str.size() - suffix.size(), suffix.size()) == suffix;
  44. }
  45. std::string stringDirectory(std::string path) {
  46. #ifdef YAC_POSIX
  47. char *pathDup = strdup(path.c_str());
  48. std::string directory = dirname(pathDup);
  49. free(pathDup);
  50. #elif defined(YAC_WIN32)
  51. char drive[_MAX_DRIVE];
  52. char dir [_MAX_DIR];
  53. char file [_MAX_FNAME];
  54. char ext [_MAX_EXT];
  55. char dirName [_MAX_DRIVE + _MAX_DIR + _MAX_EXT];
  56. _splitpath(path.c_str(), drive, dir, file, ext);
  57. sprintf(dirName, "%s%s", drive, dir);
  58. printf("xxx dirName=\"%s\"\n", dirName);
  59. std::string directory = dirName;
  60. #else
  61. #error dirname not implemented
  62. #endif
  63. return directory;
  64. }
  65. std::string stringFilename(std::string path) {
  66. #ifdef YAC_POSIX
  67. char *pathDup = strdup(path.c_str());
  68. std::string filename = basename(pathDup);
  69. free(pathDup);
  70. #elif defined(YAC_WIN32)
  71. char drive[_MAX_DRIVE];
  72. char dir [_MAX_DIR];
  73. char file [_MAX_FNAME];
  74. char ext [_MAX_EXT];
  75. char fileName [_MAX_FNAME + _MAX_EXT];
  76. _splitpath(path.c_str(), drive, dir, file, ext);
  77. sprintf(fileName, "%s%s", file, ext);
  78. // printf("xxx fileName=\"%s\"\n", fileName);
  79. std::string filename = fileName;
  80. #else
  81. #error basename not implemented
  82. #endif
  83. return filename;
  84. }
  85. std::string stringExtension(std::string path) {
  86. const char *ext = strrchr(stringFilename(path).c_str(), '.');
  87. if (!ext)
  88. return "";
  89. return ext + 1;
  90. }
  91. } // namespace rack