#include "global_pre.hpp" #include "util/common.hpp" #include #include #ifdef YAC_GCC #include // for dirname and basename #endif namespace rack { std::string stringf(const char *format, ...) { va_list args; va_start(args, format); // Compute size of required buffer int size = vsnprintf(NULL, 0, format, args); va_end(args); if (size < 0) return ""; // Create buffer std::string s; s.resize(size); va_start(args, format); vsnprintf(&s[0], size + 1, format, args); va_end(args); return s; } std::string stringLowercase(std::string s) { std::transform(s.begin(), s.end(), s.begin(), ::tolower); return s; } std::string stringUppercase(std::string s) { std::transform(s.begin(), s.end(), s.begin(), ::toupper); return s; } std::string stringEllipsize(std::string s, size_t len) { if (s.size() <= len) return s; else return s.substr(0, len - 3) + "..."; } bool stringStartsWith(std::string str, std::string prefix) { return str.substr(0, prefix.size()) == prefix; } bool stringEndsWith(std::string str, std::string suffix) { return str.substr(str.size() - suffix.size(), suffix.size()) == suffix; } std::string stringDirectory(std::string path) { #ifdef YAC_POSIX char *pathDup = strdup(path.c_str()); std::string directory = dirname(pathDup); free(pathDup); #elif defined(YAC_WIN32) char drive[_MAX_DRIVE]; char dir [_MAX_DIR]; char file [_MAX_FNAME]; char ext [_MAX_EXT]; char dirName [_MAX_DRIVE + _MAX_DIR + _MAX_EXT]; _splitpath(path.c_str(), drive, dir, file, ext); sprintf(dirName, "%s%s", drive, dir); printf("xxx dirName=\"%s\"\n", dirName); std::string directory = dirName; #else #error dirname not implemented #endif return directory; } std::string stringFilename(std::string path) { #ifdef YAC_POSIX char *pathDup = strdup(path.c_str()); std::string filename = basename(pathDup); free(pathDup); #elif defined(YAC_WIN32) char drive[_MAX_DRIVE]; char dir [_MAX_DIR]; char file [_MAX_FNAME]; char ext [_MAX_EXT]; char fileName [_MAX_FNAME + _MAX_EXT]; _splitpath(path.c_str(), drive, dir, file, ext); sprintf(fileName, "%s%s", file, ext); // printf("xxx fileName=\"%s\"\n", fileName); std::string filename = fileName; #else #error basename not implemented #endif return filename; } std::string stringExtension(std::string path) { const char *ext = strrchr(stringFilename(path).c_str(), '.'); if (!ext) return ""; return ext + 1; } } // namespace rack