1 /*
2 * Copyright 2006 Sony Computer Entertainment Inc.
3 *
4 * Licensed under the MIT Open Source License, for details please see license.txt or the website
5 * http://www.opensource.org/licenses/mit-license.php
6 *
7 */
8 #include <cstdarg>
9 #include <algorithm>
10 #include <iterator>
11 #include <dae/daeUtils.h>
12 #include <dae/daeURI.h>
13
14 #ifdef _WIN32
15 #include <direct.h> // for getcwd (windows)
16 #else
17 #include <unistd.h> // for getcwd (linux)
18 #endif
19
20 using namespace std;
21
getSystemType()22 cdom::systemType cdom::getSystemType() {
23 #ifdef WIN32
24 return Windows;
25 #else
26 return Posix;
27 #endif
28 }
29
replace(const string & s,const string & replace,const string & replaceWith)30 string cdom::replace(const string& s, const string& replace, const string& replaceWith) {
31 if (replace.empty())
32 return s;
33
34 string result;
35 size_t pos1 = 0, pos2 = s.find(replace);
36 while (pos2 != string::npos) {
37 result += s.substr(pos1, pos2-pos1);
38 result += replaceWith;
39 pos1 = pos2 + replace.length();
40 pos2 = s.find(replace, pos1);
41 }
42
43 result += s.substr(pos1, s.length()-pos1);
44 return result;
45 }
46
trimWhitespaces(string & str)47 void cdom::trimWhitespaces(string& str) {
48 string whitespaces ( " \t\f\v\n\r" );
49
50 size_t found = str.find_last_not_of( whitespaces );
51 if ( found != std::string::npos )
52 {
53 str.erase( found + 1 );
54 found = str.find_first_not_of( whitespaces );
55 if ( found != std::string::npos )
56 str.erase( 0, found );
57 }
58 else
59 {
60 // whitespaces only
61 str.clear();
62 }
63 }
64
tokenize(const string & s,const string & separators,list<string> & tokens,bool separatorsInResult)65 void cdom::tokenize(const string& s,
66 const string& separators,
67 /* out */ list<string>& tokens,
68 bool separatorsInResult) {
69 size_t currentIndex = 0, nextTokenIndex = 0;
70 while (currentIndex < s.length() &&
71 (nextTokenIndex = s.find_first_of(separators, currentIndex)) != string::npos) {
72 if ((nextTokenIndex - currentIndex) > 0)
73 tokens.push_back(s.substr(currentIndex, nextTokenIndex-currentIndex));
74 if (separatorsInResult)
75 tokens.push_back(string(1, s[nextTokenIndex]));
76 currentIndex = nextTokenIndex+1;
77 }
78
79 if (currentIndex < s.length())
80 tokens.push_back(s.substr(currentIndex, s.length()-currentIndex));
81 }
82
tokenize(const string & s,const string & separators,bool separatorsInResult)83 list<string> cdom::tokenize(const string& s,
84 const string& separators,
85 bool separatorsInResult) {
86 list<string> result;
87 tokenize(s, separators, result, separatorsInResult);
88 return result;
89 }
90
makeStringArray(const char * s,...)91 vector<string> cdom::makeStringArray(const char* s, ...) {
92 va_list args;
93 va_start(args, s);
94 vector<string> result;
95 while (s) {
96 result.push_back(s);
97 s = va_arg(args, const char*);
98 }
99 va_end(args);
100 return result;
101 }
102
makeStringList(const char * s,...)103 list<string> cdom::makeStringList(const char* s, ...) {
104 va_list args;
105 va_start(args, s);
106 list<string> result;
107 while (s) {
108 result.push_back(s);
109 s = va_arg(args, const char*);
110 }
111 va_end(args);
112 return result;
113 }
114
getCurrentDir()115 string cdom::getCurrentDir() {
116 #ifdef __CELLOS_LV2__
117 // The PS3 has no getcwd call.
118 // !!!steveT Should we return app_home instead?
119 return "/";
120 #else
121 char buffer[1024];
122 #ifdef _WIN32
123 _getcwd(buffer, 1024);
124 #else
125 getcwd(buffer, 1024);
126 #endif
127 return buffer;
128 #endif
129 }
130
getCurrentDirAsUri()131 string cdom::getCurrentDirAsUri() {
132 string result = string("file://") + cdom::nativePathToUri(getCurrentDir());
133 // Make sure the last char is a /
134 if (!result.empty() && result[result.length()-1] != '/')
135 result += "/";
136 return result;
137 }
138
getFileSeparator()139 char cdom::getFileSeparator() {
140 if (getSystemType() == Windows) {
141 return '\\';
142 }
143 return '/';
144 }
145 #ifndef NO_BOOST
getSystemTmpDir()146 const string& cdom::getSystemTmpDir() {
147 #ifdef WIN32
148 static string tmpDir = string(getenv("TMP")) + getFileSeparator();
149 #elif defined(__linux__) || defined(__linux)
150 static string tmpDir = "/tmp/";
151 #elif defined __APPLE_CC__
152 static string tmpDir = string(getenv("TMPDIR"));
153 #elif defined __CELLOS_LV2__
154 #error tmp dir for your system unknown
155 #else
156 #error tmp dir for your system unknown
157 #endif
158 return tmpDir;
159 }
160
getRandomFileName()161 string cdom::getRandomFileName() {
162 std::string randomSegment;
163 #ifdef WIN32
164 std::string tmp(tmpnam(0));
165 randomSegment = tmp.substr(tmp.find_last_of('\\')+1);
166 #elif defined(__linux__) || defined(__linux)
167 std::string tmp(tmpnam(0));
168 randomSegment = tmp.substr(tmp.find_last_of('/')+1);
169 #elif defined __APPLE_CC__
170 std::string tmp(tmpnam(0));
171 randomSegment = tmp.substr(tmp.find_last_of('/')+1);
172 #elif defined __CELLOS_LV2__
173 #error usage of tmpnam() for your system unknown
174 #else
175 #error usage of tmpnam() for your system unknown
176 #endif
177 return randomSegment;
178 }
179
getSafeTmpDir()180 const string& cdom::getSafeTmpDir() {
181 static string tmpDir = getSystemTmpDir() + getRandomFileName() + getFileSeparator();
182 return tmpDir;
183 }
184 #endif //NO_BOOST
185
strcasecmp(const char * str1,const char * str2)186 int cdom::strcasecmp(const char* str1, const char* str2) {
187 #ifdef _MSC_VER
188 return _stricmp(str1, str2);
189 #else
190 return ::strcasecmp(str1, str2);
191 #endif
192 }
193
tolower(const string & s)194 string cdom::tolower(const string& s) {
195 string result;
196 transform(s.begin(), s.end(), back_inserter(result), ::tolower);
197 return result;
198 }
199