MCPcopy Create free account
hub / github.com/WinMerge/winmerge / ParseExtensions

Method ParseExtensions

Src/FileFilterHelper.cpp:489–659  ·  view source on GitHub ↗

* @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. */

Source from the content-addressed store, hash-verified

487 * @return Regular expression that matches extension list.
488 */
489std::vector<FileFilterHelper::FilterGroup>
490FileFilterHelper::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:"))

Callers

nothing calls this directly

Calls 15

findSeparatorFunction · 0.85
addPeriodIfNoExtensionFunction · 0.85
mergeFilterFunction · 0.85
AddFilterPatternMethod · 0.80
AddFilterExpressionMethod · 0.80
GetFilterByPathMethod · 0.80
AddRegExpMethod · 0.80
makelowerFunction · 0.50
trim_wsFunction · 0.50
joinFunction · 0.50
toUTF8Function · 0.50

Tested by

no test coverage detected