summaryrefslogtreecommitdiff
path: root/indra/llvfs/lldiriterator.cpp
diff options
context:
space:
mode:
authorOz Linden <oz@lindenlab.com>2011-01-17 10:39:54 -0500
committerOz Linden <oz@lindenlab.com>2011-01-17 10:39:54 -0500
commit7f58b4f2928f60f0a93f49c0897f84af3ea8a78b (patch)
treeed64dc5178900cb9d31ecc47887fce7755962e7c /indra/llvfs/lldiriterator.cpp
parentdee9c80862ed54138889de8095087dda340ac073 (diff)
parent74fdba829574e5132fec6633b0ddcd2feb9fe51e (diff)
merge changes for vwr-24401
Diffstat (limited to 'indra/llvfs/lldiriterator.cpp')
-rw-r--r--indra/llvfs/lldiriterator.cpp203
1 files changed, 0 insertions, 203 deletions
diff --git a/indra/llvfs/lldiriterator.cpp b/indra/llvfs/lldiriterator.cpp
deleted file mode 100644
index 5536ed8f69..0000000000
--- a/indra/llvfs/lldiriterator.cpp
+++ /dev/null
@@ -1,203 +0,0 @@
-/**
- * @file lldiriterator.cpp
- * @brief Iterator through directory entries matching the search pattern.
- *
- * $LicenseInfo:firstyear=2010&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation;
- * version 2.1 of the License only.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
- * $/LicenseInfo$
- */
-
-#include "lldiriterator.h"
-
-#include <boost/filesystem.hpp>
-#include <boost/regex.hpp>
-
-namespace fs = boost::filesystem;
-
-static std::string glob_to_regex(const std::string& glob);
-
-class LLDirIterator::Impl
-{
-public:
- Impl(const std::string &dirname, const std::string &mask);
- ~Impl();
-
- bool next(std::string &fname);
-
-private:
- boost::regex mFilterExp;
- fs::directory_iterator mIter;
- bool mIsValid;
-};
-
-LLDirIterator::Impl::Impl(const std::string &dirname, const std::string &mask)
- : mIsValid(false)
-{
- fs::path dir_path(dirname);
-
- // Check if path exists.
- if (!fs::exists(dir_path))
- {
- llerrs << "Invalid path: \"" << dir_path.string() << "\"" << llendl;
- return;
- }
-
- // Initialize the directory iterator for the given path.
- try
- {
- mIter = fs::directory_iterator(dir_path);
- }
- catch (fs::basic_filesystem_error<fs::path>& e)
- {
- llerrs << e.what() << llendl;
- 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)
- {
- llerrs << "\"" << exp << "\" is not a valid regular expression: "
- << e.what() << llendl;
- return;
- }
-
- mIsValid = true;
-}
-
-LLDirIterator::Impl::~Impl()
-{
-}
-
-bool LLDirIterator::Impl::next(std::string &fname)
-{
- fname = "";
-
- if (!mIsValid)
- {
- llerrs << "The iterator is not correctly initialized." << llendl;
- return false;
- }
-
- fs::directory_iterator end_itr; // default construction yields past-the-end
- bool found = false;
- while (mIter != end_itr && !found)
- {
- boost::smatch match;
- std::string name = mIter->path().filename();
- if (found = boost::regex_match(name, match, mFilterExp))
- {
- fname = name;
- }
-
- ++mIter;
- }
-
- return found;
-}
-
-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 '.':
- regex+="\\.";
- break;
- case '*':
- if (glob.begin() == i)
- {
- regex+="[^.].*";
- }
- else
- {
- regex+= escaped ? "*" : ".*";
- }
- break;
- case '?':
- regex+= escaped ? '?' : '.';
- break;
- case '{':
- braces++;
- regex+='(';
- break;
- case '}':
- if (!braces)
- {
- llerrs << "glob_to_regex: Closing brace without an equivalent opening brace: " << glob << llendl;
- }
-
- regex+=')';
- braces--;
- break;
- case ',':
- regex+= braces ? '|' : c;
- break;
- case '!':
- regex+= square_brace_open ? '^' : c;
- break;
- default:
- regex+=c;
- break;
- }
-
- escaped = ('\\' == c);
- square_brace_open = ('[' == c);
- }
-
- if (braces)
- {
- llerrs << "glob_to_regex: Unterminated brace expression: " << glob << llendl;
- }
-
- return regex;
-}
-
-LLDirIterator::LLDirIterator(const std::string &dirname, const std::string &mask)
-{
- mImpl = new Impl(dirname, mask);
-}
-
-LLDirIterator::~LLDirIterator()
-{
- delete mImpl;
-}
-
-bool LLDirIterator::next(std::string &fname)
-{
- return mImpl->next(fname);
-}