static void ParsePathSegment(char *bytes, char **firstChar, char **lastChar) { /* skip over slash characters to find firstChar */ *firstChar = bytes = SkipSeparators(bytes); /* skip over non-slash characters */ while ( *bytes != '\0' ) { if ( *bytes == '/' ) { /* separator character */ break; } else { /* skip non-separator characters */ ++bytes; } } *lastChar = bytes; }
bool filemasks::Set(const string& masks, DWORD Flags) { bool Result = false; if (!masks.empty()) { Free(); string expmasks(masks); std::list<string> UsedGroups; size_t LBPos, RBPos; while((LBPos = expmasks.find(L'<')) != string::npos && (RBPos = expmasks.find(L'>', LBPos)) != string::npos) { string MaskGroupNameWB = expmasks.substr(LBPos, RBPos-LBPos+1); string MaskGroupName = expmasks.substr(LBPos+1, RBPos-LBPos-1); string MaskGroupValue; if (std::find(ALL_CONST_RANGE(UsedGroups), MaskGroupName) == UsedGroups.cend()) { Global->Db->GeneralCfg()->GetValue(L"Masks", MaskGroupName, MaskGroupValue, L""); ReplaceStrings(expmasks, MaskGroupNameWB, MaskGroupValue); UsedGroups.emplace_back(MaskGroupName); } else { ReplaceStrings(expmasks, MaskGroupNameWB, L""); } } if (!expmasks.empty()) { const wchar_t* ptr = expmasks.data(); string SimpleMasksInclude, SimpleMasksExclude; auto DestContainer = &Include; auto DestString = &SimpleMasksInclude; Result = true; while(*ptr) { ptr = SkipSeparators(ptr); auto nextpos = SkipRE(ptr); if (nextpos != ptr) { filemasks::masks m; Result = m.Set(string(ptr, nextpos-ptr)); if (Result) { DestContainer->emplace_back(std::move(m)); ptr = nextpos; } else { break; } ptr = nextpos; } ptr = SkipSeparators(ptr); nextpos = SkipMasks(ptr); if (nextpos != ptr) { *DestString += string(ptr, nextpos-ptr); ptr = nextpos; } if (*ptr == ExcludeMaskSeparator) { if (DestContainer != &Exclude) { DestContainer = &Exclude; DestString = &SimpleMasksExclude; } else { break; } ++ptr; } } if (Result && !SimpleMasksInclude.empty()) { filemasks::masks m; Result = m.Set(SimpleMasksInclude); if (Result) Include.emplace_back(std::move(m)); } if (Result && !SimpleMasksExclude.empty()) { filemasks::masks m; Result = m.Set(SimpleMasksExclude); if (Result) Exclude.emplace_back(std::move(m)); } if (Result && Include.empty() && !Exclude.empty()) { Include.emplace_back(VALUE_TYPE(Include)()); Result = Include.back().Set(L"*"); } Result = !empty(); } if (!Result) { if (!(Flags & FMF_SILENT)) { ErrorMessage(); } Free(); } } return Result; }