diff options
author | Nat Goodspeed <nat@lindenlab.com> | 2024-05-14 21:02:28 -0400 |
---|---|---|
committer | Nat Goodspeed <nat@lindenlab.com> | 2024-05-14 21:02:28 -0400 |
commit | 094dcc07f8c1d90ae723dbe60eddacb90a09eae8 (patch) | |
tree | e750942e5f22ed677b543bd49509c2a7cdc5ce56 /indra/llfilesystem/lldiriterator.cpp | |
parent | d4043d3b011c32eb503c43c551872f9c24d7344f (diff) | |
parent | 38c2a5bde985a6a8a96d912d432f8bdf7e5b60be (diff) |
Merge DRTVWR-591-maint-X to main on promotion of secondlife/viewer #705: Maintenance X
Diffstat (limited to 'indra/llfilesystem/lldiriterator.cpp')
-rw-r--r-- | indra/llfilesystem/lldiriterator.cpp | 322 |
1 files changed, 161 insertions, 161 deletions
diff --git a/indra/llfilesystem/lldiriterator.cpp b/indra/llfilesystem/lldiriterator.cpp index f57bf4ebc6..61f768c512 100644 --- a/indra/llfilesystem/lldiriterator.cpp +++ b/indra/llfilesystem/lldiriterator.cpp @@ -37,74 +37,74 @@ static std::string glob_to_regex(const std::string& glob); class LLDirIterator::Impl { public: - Impl(const std::string &dirname, const std::string &mask); - ~Impl(); + Impl(const std::string &dirname, const std::string &mask); + ~Impl(); - bool next(std::string &fname); + bool next(std::string &fname); private: - boost::regex mFilterExp; - fs::directory_iterator mIter; - bool mIsValid; + boost::regex mFilterExp; + fs::directory_iterator mIter; + bool mIsValid; }; LLDirIterator::Impl::Impl(const std::string &dirname, const std::string &mask) - : mIsValid(false) + : mIsValid(false) { #ifdef LL_WINDOWS // or BOOST_WINDOWS_API - fs::path dir_path(utf8str_to_utf16str(dirname)); + fs::path dir_path(utf8str_to_utf16str(dirname)); #else - fs::path dir_path(dirname); + fs::path dir_path(dirname); #endif - bool is_dir = false; - - // Check if path is a directory. - try - { - is_dir = fs::is_directory(dir_path); - } - catch (const fs::filesystem_error& e) - { - LL_WARNS() << e.what() << LL_ENDL; - return; - } - - if (!is_dir) - { - LL_WARNS() << "Invalid path: \"" << dir_path.string() << "\"" << LL_ENDL; - return; - } - - // Initialize the directory iterator for the given path. - try - { - mIter = fs::directory_iterator(dir_path); - } - catch (const fs::filesystem_error& e) - { - LL_WARNS() << e.what() << LL_ENDL; - return; - } - - // Convert the glob mask to a regular expression - std::string exp = glob_to_regex(mask); - - // Initialize boost::regex with the expression converted from - // the glob mask. - // An exception is thrown if the expression is not valid. - try - { - mFilterExp.assign(exp); - } - catch (boost::regex_error& e) - { - LL_WARNS() << "\"" << exp << "\" is not a valid regular expression: " - << e.what() << LL_ENDL; - return; - } - - mIsValid = true; + bool is_dir = false; + + // Check if path is a directory. + try + { + is_dir = fs::is_directory(dir_path); + } + catch (const fs::filesystem_error& e) + { + LL_WARNS() << e.what() << LL_ENDL; + return; + } + + if (!is_dir) + { + LL_WARNS() << "Invalid path: \"" << dir_path.string() << "\"" << LL_ENDL; + return; + } + + // Initialize the directory iterator for the given path. + try + { + mIter = fs::directory_iterator(dir_path); + } + catch (const fs::filesystem_error& e) + { + LL_WARNS() << e.what() << LL_ENDL; + return; + } + + // Convert the glob mask to a regular expression + std::string exp = glob_to_regex(mask); + + // Initialize boost::regex with the expression converted from + // the glob mask. + // An exception is thrown if the expression is not valid. + try + { + mFilterExp.assign(exp); + } + catch (boost::regex_error& e) + { + LL_WARNS() << "\"" << exp << "\" is not a valid regular expression: " + << e.what() << LL_ENDL; + return; + } + + mIsValid = true; } LLDirIterator::Impl::~Impl() @@ -113,39 +113,39 @@ LLDirIterator::Impl::~Impl() bool LLDirIterator::Impl::next(std::string &fname) { - fname = ""; - - if (!mIsValid) - { - LL_WARNS() << "The iterator is not correctly initialized." << LL_ENDL; - return false; - } - - fs::directory_iterator end_itr; // default construction yields past-the-end - bool found = false; - - // Check if path is a directory. - try - { - while (mIter != end_itr && !found) - { - boost::smatch match; - std::string name = mIter->path().filename().string(); - found = ll_regex_match(name, match, mFilterExp); - if (found) - { - fname = name; - } - - ++mIter; - } - } - catch (const fs::filesystem_error& e) - { - LL_WARNS() << e.what() << LL_ENDL; - } - - return found; + fname = ""; + + if (!mIsValid) + { + LL_WARNS() << "The iterator is not correctly initialized." << LL_ENDL; + return false; + } + + fs::directory_iterator end_itr; // default construction yields past-the-end + bool found = false; + + // Check if path is a directory. + try + { + while (mIter != end_itr && !found) + { + boost::smatch match; + std::string name = mIter->path().filename().string(); + found = ll_regex_match(name, match, mFilterExp); + if (found) + { + fname = name; + } + + ++mIter; + } + } + catch (const fs::filesystem_error& e) + { + LL_WARNS() << e.what() << LL_ENDL; + } + + return found; } /** @@ -153,91 +153,91 @@ Converts the incoming glob into a regex. This involves converting incoming glob expressions to regex equivilents and at the same time, escaping any regex meaningful characters which do not have glob meaning, i.e. - .()+|^$ + .()+|^$ in the input. */ std::string glob_to_regex(const std::string& glob) { - std::string regex; - regex.reserve(glob.size()<<1); - S32 braces = 0; - bool escaped = false; - bool square_brace_open = false; - - for (std::string::const_iterator i = glob.begin(); i != glob.end(); ++i) - { - char c = *i; - - switch (c) - { - case '*': - if (glob.begin() == i) - { - regex+="[^.].*"; - } - else - { - regex+= escaped ? "*" : ".*"; - } - break; - case '?': - regex+= escaped ? '?' : '.'; - break; - case '{': - braces++; - regex+='('; - break; - case '}': - if (!braces) - { - LL_ERRS() << "glob_to_regex: Closing brace without an equivalent opening brace: " << glob << LL_ENDL; - } - - regex+=')'; - braces--; - break; - case ',': - regex+= braces ? '|' : c; - break; - case '!': - regex+= square_brace_open ? '^' : c; - break; - case '.': // This collection have different regex meaning - case '^': // and so need escaping. - case '(': - case ')': - case '+': - case '|': - case '$': - regex += '\\'; - default: - regex += c; - break; - } - - escaped = ('\\' == c); - square_brace_open = ('[' == c); - } - - if (braces) - { - LL_ERRS() << "glob_to_regex: Unterminated brace expression: " << glob << LL_ENDL; - } - - return regex; + std::string regex; + regex.reserve(glob.size()<<1); + S32 braces = 0; + bool escaped = false; + bool square_brace_open = false; + + for (std::string::const_iterator i = glob.begin(); i != glob.end(); ++i) + { + char c = *i; + + switch (c) + { + case '*': + if (glob.begin() == i) + { + regex+="[^.].*"; + } + else + { + regex+= escaped ? "*" : ".*"; + } + break; + case '?': + regex+= escaped ? '?' : '.'; + break; + case '{': + braces++; + regex+='('; + break; + case '}': + if (!braces) + { + LL_ERRS() << "glob_to_regex: Closing brace without an equivalent opening brace: " << glob << LL_ENDL; + } + + regex+=')'; + braces--; + break; + case ',': + regex+= braces ? '|' : c; + break; + case '!': + regex+= square_brace_open ? '^' : c; + break; + case '.': // This collection have different regex meaning + case '^': // and so need escaping. + case '(': + case ')': + case '+': + case '|': + case '$': + regex += '\\'; + default: + regex += c; + break; + } + + escaped = ('\\' == c); + square_brace_open = ('[' == c); + } + + if (braces) + { + LL_ERRS() << "glob_to_regex: Unterminated brace expression: " << glob << LL_ENDL; + } + + return regex; } LLDirIterator::LLDirIterator(const std::string &dirname, const std::string &mask) { - mImpl = new Impl(dirname, mask); + mImpl = new Impl(dirname, mask); } LLDirIterator::~LLDirIterator() { - delete mImpl; + delete mImpl; } bool LLDirIterator::next(std::string &fname) { - return mImpl->next(fname); + return mImpl->next(fname); } |