/* * 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; }