text: /*
   * 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;
  }
  