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.

85 lines
1.9KB

  1. #include "string.hpp"
  2. #include <algorithm> // for transform
  3. #include <libgen.h> // for dirname and basename
  4. namespace rack {
  5. namespace string {
  6. std::string f(const char *format, ...) {
  7. va_list args;
  8. va_start(args, format);
  9. // Compute size of required buffer
  10. int size = vsnprintf(NULL, 0, format, args);
  11. va_end(args);
  12. if (size < 0)
  13. return "";
  14. // Create buffer
  15. std::string s;
  16. s.resize(size);
  17. va_start(args, format);
  18. vsnprintf(&s[0], size + 1, format, args);
  19. va_end(args);
  20. return s;
  21. }
  22. std::string lowercase(const std::string &s) {
  23. std::string r = s;
  24. std::transform(r.begin(), r.end(), r.begin(), [](unsigned char c){ return std::tolower(c); });
  25. return r;
  26. }
  27. std::string uppercase(const std::string &s) {
  28. std::string r = s;
  29. std::transform(r.begin(), r.end(), r.begin(), [](unsigned char c){ return std::toupper(c); });
  30. return r;
  31. }
  32. std::string ellipsize(const std::string &s, size_t len) {
  33. if (s.size() <= len)
  34. return s;
  35. else
  36. return s.substr(0, len - 3) + "...";
  37. }
  38. bool startsWith(const std::string &str, const std::string &prefix) {
  39. return str.substr(0, prefix.size()) == prefix;
  40. }
  41. bool endsWith(const std::string &str, const std::string &suffix) {
  42. return str.substr(str.size() - suffix.size(), suffix.size()) == suffix;
  43. }
  44. std::string directory(const std::string &path) {
  45. char *pathDup = strdup(path.c_str());
  46. std::string directory = dirname(pathDup);
  47. free(pathDup);
  48. return directory;
  49. }
  50. std::string filename(const std::string &path) {
  51. char *pathDup = strdup(path.c_str());
  52. std::string filename = basename(pathDup);
  53. free(pathDup);
  54. return filename;
  55. }
  56. std::string basename(const std::string &path) {
  57. size_t pos = path.rfind('.');
  58. if (pos == std::string::npos)
  59. return path;
  60. return std::string(path, 0, pos);
  61. }
  62. std::string extension(const std::string &path) {
  63. size_t pos = path.rfind('.');
  64. if (pos == std::string::npos)
  65. return "";
  66. return std::string(path, pos + 1);
  67. }
  68. } // namespace string
  69. } // namespace rack