--- /dev/null
+/*
+ * File: ExcludesListMatcher.cpp
+ *
+ * Copyright (c) Freescale Semiconductor, Inc. All rights reserved.
+ * See included license file for license details.
+ */
+
+#include "ExcludesListMatcher.h"
+
+using namespace elftosb;
+
+ExcludesListMatcher::ExcludesListMatcher()
+: GlobMatcher("")
+{
+}
+
+ExcludesListMatcher::~ExcludesListMatcher()
+{
+}
+
+//! \param isInclude True if this pattern is an include, false if it is an exclude.
+//! \param pattern String containing the glob pattern.
+void ExcludesListMatcher::addPattern(bool isInclude, const std::string & pattern)
+{
+ glob_list_item_t item;
+ item.m_isInclude = isInclude;
+ item.m_glob = pattern;
+
+ // add to end of list
+ m_patterns.push_back(item);
+}
+
+//! If there are no entries in the match list, the match fails.
+//!
+//! \param testValue The string to match against the pattern list.
+//! \retval true The \a testValue argument matches.
+//! \retval false No match was made against the argument.
+bool ExcludesListMatcher::match(const std::string & testValue)
+{
+ if (!m_patterns.size())
+ {
+ return false;
+ }
+
+ // Iterate over the match list. Includes act as an OR operator, while
+ // excludes act as an AND operator.
+ bool didMatch = false;
+ bool isFirstItem = true;
+ glob_list_t::iterator it = m_patterns.begin();
+ for (; it != m_patterns.end(); ++it)
+ {
+ glob_list_item_t & item = *it;
+
+ // if this pattern is an include and it doesn't match, or
+ // if this pattern is an exclude and it does match, then the match fails
+ bool didItemMatch = globMatch(testValue.c_str(), item.m_glob.c_str());
+
+ if (item.m_isInclude)
+ {
+ // Include
+ if (isFirstItem)
+ {
+ didMatch = didItemMatch;
+ }
+ else
+ {
+ didMatch = didMatch || didItemMatch;
+ }
+ }
+ else
+ {
+ // Exclude
+ if (isFirstItem)
+ {
+ didMatch = !didItemMatch;
+ }
+ else
+ {
+ didMatch = didMatch && !didItemMatch;
+ }
+ }
+
+ isFirstItem = false;
+ }
+
+ return didMatch;
+}
+