• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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