bool FileUtils::mkdirs( const String &path ) { bool res = false; ASSERT_D( path.length() > 0 ); #if defined(_WINDOWS) || defined(WIN32) TCHAR abspath[_MAX_PATH]; TCHAR drive[_MAX_DRIVE]; TCHAR dir[_MAX_DIR]; TCHAR fname[_MAX_FNAME]; TCHAR ext[_MAX_EXT]; _tsplitpath_s( _tfullpath( abspath, path.c_str(), _MAX_PATH ), drive, dir, fname, ext ); // remember the current drive int curDrive = _getdrive(); // set the current drive _chdrive( toupper(drive[0]) - 'A' + 1 ); // now start parsing out the path and create all directoried in the // heirarchy String createPath; String dirStr(dir); dirStr += fname; StringUtils::trimBoth( FileUtils::PATH_SEP_PAT, dirStr ); StringTokenizer tok(dirStr, FileUtils::PATH_SEP_PAT); while( tok.hasMoreTokens() ) { createPath += FileUtils::PATH_SEP; createPath += tok.getNextToken(); res = FileUtils::mkdir( createPath ); if ( !res ) { break; } } _chdrive( curDrive ); #else // the first step is to figure out where the path // starts. If the path contains a .. or . prefix, then // we have to calculate the start of the creation path // if it does not contain such prefix, then we'll just create // the directories relative to the current working directory String rootPath; String parsePath; String::size_type startPos = path.find_first_not_of( NTEXT("/.") ); if ( startPos != 0 ) { // there was at least one of these delimiters as a prefix String prefixStr( path, 0, startPos ); rootPath = FileUtils::resolve( prefixStr ); if ( rootPath.length() > 0 ) { if ( rootPath[ rootPath.length() - 1 ] != NTEXT('/') ) { rootPath += FileUtils::PATH_SEP; } } parsePath = path.substr( startPos ); } else { // no delimiters, so just parse the path parsePath = path; } StringTokenizer tok( parsePath, FileUtils::PATH_SEP_PAT ); while( tok.hasMoreTokens() ) { rootPath += tok.getNextToken(); rootPath += FileUtils::PATH_SEP; res = FileUtils::mkdir( rootPath ); if ( !res ) { break; } } #endif return res; }
bool ParameterList::applyParameters(uint32_t argc, const char** argv, uint32_t &a, const char* paramPrefix /*= nullptr*/, const char* defaultFilePath /*= nullptr*/) const { std::string prefixStr(paramPrefix ? paramPrefix : ""); std::string defaultPathStr(defaultFilePath ? defaultFilePath : ""); for (uint32_t p = 0; p < uint32_t(m_parameters.size()); p++) { const Parameter& param = m_parameters[p]; std::string combined = prefixStr + param.name; bool searchFileEnding = (param.type == TYPE_FILENAME) && (param.readLength == 0); bool matched = searchFileEnding ? endsWith(argv[a], param.name) : (strcmp(argv[a], combined.c_str()) == 0); if (matched && a + param.readLength < argc) { switch (param.type) { case TYPE_FLOAT: { for (uint32_t i = 0; i < param.writeLength; i++) { param.destination.f32[i] = std::min(std::max(float(atof(argv[a + i + 1])), param.minmax[0].f32), param.minmax[1].f32); } } break; case TYPE_UINT: { for (uint32_t i = 0; i < param.writeLength; i++) { param.destination.u32[i] = std::min(std::max(uint32_t(atoi(argv[a + i + 1])), param.minmax[0].u32), param.minmax[1].u32); } } break; case TYPE_INT: { for (uint32_t i = 0; i < param.writeLength; i++) { param.destination.s32[i] = std::min(std::max(int32_t(atoi(argv[a + i + 1])), param.minmax[0].s32), param.minmax[1].s32); } } break; case TYPE_BOOL: { for (uint32_t i = 0; i < param.writeLength; i++) { param.destination.b[i] = atoi(argv[a + i + 1]) != 0; } } break; case TYPE_BOOL_VALUE: { for (uint32_t i = 0; i < param.writeLength; i++) { param.destination.b[i] = param.minmax[0].b; } } break; case TYPE_STRING: { for (uint32_t i = 0; i < param.writeLength; i++) { param.destination.str[i] = std::string(argv[a + i + 1]); } } break; case TYPE_FILENAME: { std::string filename(argv[a + param.readLength]); if ( #ifdef _WIN32 filename.find(':') != std::string::npos #else !filename.empty() && filename[0] == '/' #endif ) { param.destination.str[0] = filename; } else { param.destination.str[0] = defaultPathStr + "/" + filename; } } break; case TYPE_TRIGGER: { } } if (param.callback) { param.callback(p); } if (searchFileEnding) { LOGI(" %s \"%s\"\n", param.name.c_str(), argv[a]); } else { LOGI(" "); for (uint32_t i = 0; i < param.readLength + 1; i++) { bool isString = i > 0 && (param.type == TYPE_FILENAME || param.type == TYPE_STRING); if (isString) { LOGI(" \"%s\"", argv[a + i]); } else { LOGI(" %s", argv[a + i]); } } LOGI("\n"); } a += param.readLength; return true; } } return false; }