unsigned int Process::start(const String& rawCommandLine) { // split commands into words List<Word> command; Word::split(rawCommandLine, command); // separate leading environment variables and the command line Map<String, String> environmentVariables; for(List<Word>::Node* envNode = command.getFirst(); envNode; envNode = command.getFirst()) { const char* data = envNode->data.getData(); const char* sep = strchr(data, '='); if(sep) { // load list of existing existing variables if(environmentVariables.isEmpty()) { const Map<String, String>& envs = getEnvironmentVariables(); for(const Map<String, String>::Node* i = envs.getFirst(); i; i = i->getNext()) environmentVariables.append(i->key, i->data); } // add or override a variable String key(data, sep - data); Map<String, String>::Node* existingNode = environmentVariables.find(key); if(existingNode) existingNode->data = envNode->data; else environmentVariables.append(key, envNode->data); // command.removeFirst(); } else break; } #ifdef _WIN32 struct Executable { static bool fileComplete(const String& searchName, bool testExtensions, String& result) { if(File::exists(searchName)) { result = searchName; return true; } if(testExtensions) { String testPath = searchName; testPath.append(".exe"); if(File::exists(testPath)) { result = testPath; return true; } testPath.setLength(searchName.getLength()); testPath.append(".com"); if(File::exists(testPath)) { result = testPath; return true; } } return false; } static const List<String>& getPathEnv() { static List<String> searchPaths; static bool loaded = false; if(!loaded) { char* pathVar = (char*)alloca(32767); GetEnvironmentVariable("PATH", pathVar, 32767); for(const char* str = pathVar; *str;) { const char* end = strchr(str, ';'); if(end) { if(end > str) searchPaths.append(String(str, end - str)); ++end; str = end; } else { searchPaths.append(String(str, -1)); break; } } loaded = true; } return searchPaths; } static bool resolveSymlink(const String& fileName, String& result) { String cygwinRoot = File::getDirname(File::getDirname(fileName)); result = fileName; bool success = false; for(;;) { File file; if(!file.open(result)) return success; const int len = 12 + MAX_PATH * 2 + 2; char buffer[len]; int i = file.read(buffer, len); if(i < 12 || strncmp(buffer, "!<symlink>\xff\xfe", 12) != 0) return success; i &= ~1; wchar_t* wdest = (wchar_t*)(buffer + 12); wdest[(i - 12) >> 1] = 0; String dest; dest.format(i - 12, "%S", wdest); if(strncmp(dest.getData(), "/usr/bin/", 9) == 0) { result = cygwinRoot; result.append(dest.substr(4)); } else if(dest.getData()[0] == '/') { result = cygwinRoot; result.append(dest); } else { result = File::getDirname(result); result.append('/'); result.append(dest); } success = true; } return false; } static String find(const String& program) { String result = program; bool testExtensions = File::getExtension(program).isEmpty(); // check whether the given path is absolute if(program.getData()[0] == '/' || (program.getLength() > 2 && program.getData()[1] == ':')) { // absolute fileComplete(program, testExtensions, result); } else { // try each search path const List<String>& searchPaths = getPathEnv(); for(const List<String>::Node* i = searchPaths.getFirst(); i; i = i->getNext()) { String testPath = i->data; testPath.append('\\'); testPath.append(program); if(fileComplete(testPath, testExtensions, result)) { if(strncmp(program.getData(), "../", 3) == 0 || strncmp(program.getData(), "..\\", 3) == 0) result = File::simplifyPath(result); break; } } } return result; }
device_t<CUDA>::device_t() { data = NULL; memoryAllocated = 0; getEnvironmentVariables(); }
device_t<COI>::device_t(int platform, int device){ data = NULL; memoryAllocated = 0; getEnvironmentVariables(); }