pal::string_t get_directory(const pal::string_t& path) { // Find the last dir separator auto path_sep = path.find_last_of(DIR_SEPARATOR); if (path_sep == pal::string_t::npos) { return pal::string_t(path); } return path.substr(0, path_sep); }
pal::string_t get_filename_without_ext(const pal::string_t& path) { if (path.empty()) { return path; } size_t name_pos = path.find_last_of(_X("/\\")); size_t dot_pos = path.rfind(_X('.')); size_t start_pos = (name_pos == pal::string_t::npos) ? 0 : (name_pos + 1); size_t count = (dot_pos == pal::string_t::npos || dot_pos < start_pos) ? pal::string_t::npos : (dot_pos - start_pos); return path.substr(start_pos, count); }
pal::string_t strip_file_ext(const pal::string_t& path) { if (path.empty()) { return path; } size_t sep_pos = path.rfind(_X("/\\")); size_t dot_pos = path.rfind(_X('.')); if (sep_pos != pal::string_t::npos && sep_pos > dot_pos) { return path; } return path.substr(0, dot_pos); }
pal::string_t get_filename(const pal::string_t& path) { if (path.empty()) { return path; } auto name_pos = path.find_last_of(DIR_SEPARATOR); if (name_pos == pal::string_t::npos) { return path; } return path.substr(name_pos + 1); }
void get_tpafile_path(const pal::string_t& app_base, const pal::string_t& app_name, pal::string_t& tpapath) { tpapath.reserve(app_base.length() + app_name.length() + 5); tpapath.append(app_base); tpapath.push_back(DIR_SEPARATOR); // Remove the extension from the app_name auto ext_location = app_name.find_last_of('.'); if (ext_location != std::string::npos) { tpapath.append(app_name.substr(0, ext_location)); } else { tpapath.append(app_name); } tpapath.append(_X(".deps")); }
bool parse_internal(const pal::string_t& ver, fx_ver_t* fx_ver, bool parse_only_production) { size_t maj_start = 0; size_t maj_sep = ver.find(_X('.')); if (maj_sep == pal::string_t::npos) { return false; } unsigned major = 0; if (!try_stou(ver.substr(maj_start, maj_sep), &major)) { return false; } size_t min_start = maj_sep + 1; size_t min_sep = ver.find(_X('.'), min_start); if (min_sep == pal::string_t::npos) { return false; } unsigned minor = 0; if (!try_stou(ver.substr(min_start, min_sep - min_start), &minor)) { return false; } unsigned patch = 0; size_t pat_start = min_sep + 1; size_t pat_sep = ver.find_first_not_of(_X("0123456789"), pat_start); if (pat_sep == pal::string_t::npos) { if (!try_stou(ver.substr(pat_start), &patch)) { return false; } *fx_ver = fx_ver_t(major, minor, patch); return true; } if (parse_only_production) { // This is a prerelease or has build suffix. return false; } if (!try_stou(ver.substr(pat_start, pat_sep - pat_start), &patch)) { return false; } size_t pre_start = pat_sep; size_t pre_sep = ver.find(_X('+'), pre_start); if (pre_sep == pal::string_t::npos) { *fx_ver = fx_ver_t(major, minor, patch, ver.substr(pre_start)); return true; } else { size_t build_start = pre_sep + 1; *fx_ver = fx_ver_t(major, minor, patch, ver.substr(pre_start, pre_sep - pre_start), ver.substr(build_start)); return true; } }