| /* |
| * Copyright 2006 Sony Computer Entertainment Inc. |
| * |
| * Licensed under the MIT Open Source License, for details please see license.txt or the website |
| * http://www.opensource.org/licenses/mit-license.php |
| * |
| */ |
| #include <cstdarg> |
| #include <algorithm> |
| #include <iterator> |
| #include <dae/daeUtils.h> |
| #include <dae/daeURI.h> |
| |
| #ifdef _WIN32 |
| #include <direct.h> // for getcwd (windows) |
| #else |
| #include <unistd.h> // for getcwd (linux) |
| #endif |
| |
| using namespace std; |
| |
| cdom::systemType cdom::getSystemType() { |
| #ifdef WIN32 |
| return Windows; |
| #else |
| return Posix; |
| #endif |
| } |
| |
| string cdom::replace(const string& s, const string& replace, const string& replaceWith) { |
| if (replace.empty()) |
| return s; |
| |
| string result; |
| size_t pos1 = 0, pos2 = s.find(replace); |
| while (pos2 != string::npos) { |
| result += s.substr(pos1, pos2-pos1); |
| result += replaceWith; |
| pos1 = pos2 + replace.length(); |
| pos2 = s.find(replace, pos1); |
| } |
| |
| result += s.substr(pos1, s.length()-pos1); |
| return result; |
| } |
| |
| void cdom::trimWhitespaces(string& str) { |
| string whitespaces ( " \t\f\v\n\r" ); |
| |
| size_t found = str.find_last_not_of( whitespaces ); |
| if ( found != std::string::npos ) |
| { |
| str.erase( found + 1 ); |
| found = str.find_first_not_of( whitespaces ); |
| if ( found != std::string::npos ) |
| str.erase( 0, found ); |
| } |
| else |
| { |
| // whitespaces only |
| str.clear(); |
| } |
| } |
| |
| void cdom::tokenize(const string& s, |
| const string& separators, |
| /* out */ list<string>& tokens, |
| bool separatorsInResult) { |
| size_t currentIndex = 0, nextTokenIndex = 0; |
| while (currentIndex < s.length() && |
| (nextTokenIndex = s.find_first_of(separators, currentIndex)) != string::npos) { |
| if ((nextTokenIndex - currentIndex) > 0) |
| tokens.push_back(s.substr(currentIndex, nextTokenIndex-currentIndex)); |
| if (separatorsInResult) |
| tokens.push_back(string(1, s[nextTokenIndex])); |
| currentIndex = nextTokenIndex+1; |
| } |
| |
| if (currentIndex < s.length()) |
| tokens.push_back(s.substr(currentIndex, s.length()-currentIndex)); |
| } |
| |
| list<string> cdom::tokenize(const string& s, |
| const string& separators, |
| bool separatorsInResult) { |
| list<string> result; |
| tokenize(s, separators, result, separatorsInResult); |
| return result; |
| } |
| |
| vector<string> cdom::makeStringArray(const char* s, ...) { |
| va_list args; |
| va_start(args, s); |
| vector<string> result; |
| while (s) { |
| result.push_back(s); |
| s = va_arg(args, const char*); |
| } |
| va_end(args); |
| return result; |
| } |
| |
| list<string> cdom::makeStringList(const char* s, ...) { |
| va_list args; |
| va_start(args, s); |
| list<string> result; |
| while (s) { |
| result.push_back(s); |
| s = va_arg(args, const char*); |
| } |
| va_end(args); |
| return result; |
| } |
| |
| string cdom::getCurrentDir() { |
| #ifdef __CELLOS_LV2__ |
| // The PS3 has no getcwd call. |
| // !!!steveT Should we return app_home instead? |
| return "/"; |
| #else |
| char buffer[1024]; |
| #ifdef _WIN32 |
| _getcwd(buffer, 1024); |
| #else |
| getcwd(buffer, 1024); |
| #endif |
| return buffer; |
| #endif |
| } |
| |
| string cdom::getCurrentDirAsUri() { |
| string result = string("file://") + cdom::nativePathToUri(getCurrentDir()); |
| // Make sure the last char is a / |
| if (!result.empty() && result[result.length()-1] != '/') |
| result += "/"; |
| return result; |
| } |
| |
| char cdom::getFileSeparator() { |
| if (getSystemType() == Windows) { |
| return '\\'; |
| } |
| return '/'; |
| } |
| #ifndef NO_BOOST |
| const string& cdom::getSystemTmpDir() { |
| #ifdef WIN32 |
| static string tmpDir = string(getenv("TMP")) + getFileSeparator(); |
| #elif defined(__linux__) || defined(__linux) |
| static string tmpDir = "/tmp/"; |
| #elif defined __APPLE_CC__ |
| static string tmpDir = string(getenv("TMPDIR")); |
| #elif defined __CELLOS_LV2__ |
| #error tmp dir for your system unknown |
| #else |
| #error tmp dir for your system unknown |
| #endif |
| return tmpDir; |
| } |
| |
| string cdom::getRandomFileName() { |
| std::string randomSegment; |
| #ifdef WIN32 |
| std::string tmp(tmpnam(0)); |
| randomSegment = tmp.substr(tmp.find_last_of('\\')+1); |
| #elif defined(__linux__) || defined(__linux) |
| std::string tmp(tmpnam(0)); |
| randomSegment = tmp.substr(tmp.find_last_of('/')+1); |
| #elif defined __APPLE_CC__ |
| std::string tmp(tmpnam(0)); |
| randomSegment = tmp.substr(tmp.find_last_of('/')+1); |
| #elif defined __CELLOS_LV2__ |
| #error usage of tmpnam() for your system unknown |
| #else |
| #error usage of tmpnam() for your system unknown |
| #endif |
| return randomSegment; |
| } |
| |
| const string& cdom::getSafeTmpDir() { |
| static string tmpDir = getSystemTmpDir() + getRandomFileName() + getFileSeparator(); |
| return tmpDir; |
| } |
| #endif //NO_BOOST |
| |
| int cdom::strcasecmp(const char* str1, const char* str2) { |
| #ifdef _MSC_VER |
| return _stricmp(str1, str2); |
| #else |
| return ::strcasecmp(str1, str2); |
| #endif |
| } |
| |
| string cdom::tolower(const string& s) { |
| string result; |
| transform(s.begin(), s.end(), back_inserter(result), ::tolower); |
| return result; |
| } |