]> git.karo-electronics.de Git - karo-tx-uboot.git/blobdiff - tools/elftosb/common/ExcludesListMatcher.cpp
Added source of Freescale's 'elftosb' tool
[karo-tx-uboot.git] / tools / elftosb / common / ExcludesListMatcher.cpp
diff --git a/tools/elftosb/common/ExcludesListMatcher.cpp b/tools/elftosb/common/ExcludesListMatcher.cpp
new file mode 100644 (file)
index 0000000..56d67d6
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * 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;
+}
+