* @brief Convert user-given extension list to valid regular expression. * @param [in] Extension list/mask to convert to regular expression. * @return Regular expression that matches extension list. */
| 487 | * @return Regular expression that matches extension list. |
| 488 | */ |
| 489 | std::vector<FileFilterHelper::FilterGroup> |
| 490 | FileFilterHelper::ParseExtensions(const String &extensions) const |
| 491 | { |
| 492 | std::vector<FilterGroup> filterGroups; |
| 493 | std::vector<String> groups = SplitFilterGroups(extensions); |
| 494 | for (const auto& group : groups) |
| 495 | { |
| 496 | String strFileParsed; |
| 497 | String strDirParsed; |
| 498 | std::vector<String> filePatterns; |
| 499 | std::vector<String> filePatternsExclude; |
| 500 | std::vector<String> dirPatterns; |
| 501 | std::vector<String> dirPatternsExclude; |
| 502 | String ext(group); |
| 503 | String prefix; |
| 504 | std::shared_ptr<FileFilter> pRegexOrExpressionFilter; |
| 505 | std::shared_ptr<FileFilter> pRegexOrExpressionFilterExclude; |
| 506 | size_t pos = 0; |
| 507 | for (;;) |
| 508 | { |
| 509 | pos = findSeparator(ext, prefix); |
| 510 | String token = ext.substr(0, pos == String::npos ? ext.size() : pos); |
| 511 | if (token.length() >= 1 && prefix.empty()) |
| 512 | { |
| 513 | // Only "*." or "*.something" allowed, other ignored |
| 514 | bool exclude = token[0] == '!'; |
| 515 | if (exclude) |
| 516 | token = token.substr(1); |
| 517 | bool isdir = token.length() > 0 && token.back() == '\\'; |
| 518 | if (isdir) |
| 519 | token.resize(token.size() - 1); |
| 520 | token = addPeriodIfNoExtension(token); |
| 521 | String strRegex = strutils::makelower(ConvertWildcardPatternToRegexp(token)); |
| 522 | if (exclude) |
| 523 | { |
| 524 | if (isdir) |
| 525 | dirPatternsExclude.push_back(strRegex); |
| 526 | else |
| 527 | filePatternsExclude.push_back(strRegex); |
| 528 | } |
| 529 | else |
| 530 | { |
| 531 | if (isdir) |
| 532 | dirPatterns.push_back(strRegex); |
| 533 | else |
| 534 | filePatterns.push_back(strRegex); |
| 535 | } |
| 536 | } |
| 537 | else if (!prefix.empty()) |
| 538 | { |
| 539 | if (!pRegexOrExpressionFilter) |
| 540 | { |
| 541 | pRegexOrExpressionFilter = std::make_shared<FileFilter>(); |
| 542 | pRegexOrExpressionFilter->default_include = false; |
| 543 | pRegexOrExpressionFilter->name = _T(""); |
| 544 | } |
| 545 | token = strutils::trim_ws(token.substr(token.find(':') + 1)); |
| 546 | if (prefix == _T("f:")) |
nothing calls this directly
no test coverage detected