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.

79 lines
1.7KB

  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(std::string s) {
  23. std::transform(s.begin(), s.end(), s.begin(), ::tolower);
  24. return s;
  25. }
  26. std::string uppercase(std::string s) {
  27. std::transform(s.begin(), s.end(), s.begin(), ::toupper);
  28. return s;
  29. }
  30. std::string ellipsize(const std::string &s, size_t len) {
  31. if (s.size() <= len)
  32. return s;
  33. else
  34. return s.substr(0, len - 3) + "...";
  35. }
  36. bool startsWith(const std::string &str, const std::string &prefix) {
  37. return str.substr(0, prefix.size()) == prefix;
  38. }
  39. bool endsWith(const std::string &str, const std::string &suffix) {
  40. return str.substr(str.size() - suffix.size(), suffix.size()) == suffix;
  41. }
  42. std::string directory(const std::string &path) {
  43. char *pathDup = strdup(path.c_str());
  44. std::string directory = dirname(pathDup);
  45. free(pathDup);
  46. return directory;
  47. }
  48. std::string filename(const std::string &path) {
  49. char *pathDup = strdup(path.c_str());
  50. std::string filename = basename(pathDup);
  51. free(pathDup);
  52. return filename;
  53. }
  54. std::string basename(const std::string &path) {
  55. size_t pos = path.rfind('.');
  56. return std::string(path, 0, pos);
  57. }
  58. std::string extension(const std::string &path) {
  59. size_t pos = path.rfind('.');
  60. return std::string(path, pos);
  61. }
  62. } // namespace string
  63. } // namespace rack