1240116Smarcel// 2240116Smarcel// Automated Testing Framework (atf) 3240116Smarcel// 4240116Smarcel// Copyright (c) 2007 The NetBSD Foundation, Inc. 5240116Smarcel// All rights reserved. 6240116Smarcel// 7240116Smarcel// Redistribution and use in source and binary forms, with or without 8240116Smarcel// modification, are permitted provided that the following conditions 9240116Smarcel// are met: 10240116Smarcel// 1. Redistributions of source code must retain the above copyright 11240116Smarcel// notice, this list of conditions and the following disclaimer. 12240116Smarcel// 2. Redistributions in binary form must reproduce the above copyright 13240116Smarcel// notice, this list of conditions and the following disclaimer in the 14240116Smarcel// documentation and/or other materials provided with the distribution. 15240116Smarcel// 16240116Smarcel// THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND 17240116Smarcel// CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 18240116Smarcel// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 19240116Smarcel// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20240116Smarcel// IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY 21240116Smarcel// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22240116Smarcel// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 23240116Smarcel// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 24240116Smarcel// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 25240116Smarcel// IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 26240116Smarcel// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 27240116Smarcel// IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28240116Smarcel// 29240116Smarcel 30240116Smarcel#if !defined(_ATF_CXX_EXPAND_HPP_) 31240116Smarcel#define _ATF_CXX_EXPAND_HPP_ 32240116Smarcel 33240116Smarcel#include <string> 34240116Smarcel#include <vector> 35240116Smarcel 36240116Smarcelnamespace atf { 37240116Smarcelnamespace expand { 38240116Smarcel 39240116Smarcel// ------------------------------------------------------------------------ 40240116Smarcel// Free functions. 41240116Smarcel// ------------------------------------------------------------------------ 42240116Smarcel 43240116Smarcel//! 44240116Smarcel//! \brief Checks if the given string is a glob pattern. 45240116Smarcel//! 46240116Smarcel//! Returns true if the given string is a glob pattern; i.e. if it contains 47240116Smarcel//! any character that will be expanded by expand_glob. 48240116Smarcel//! 49240116Smarcelbool is_glob(const std::string&); 50240116Smarcel 51240116Smarcel//! 52240116Smarcel//! \brief Checks if a given string matches a glob pattern. 53240116Smarcel//! 54240116Smarcel//! Given a glob pattern and a string, checks whether the former matches 55240116Smarcel//! the latter. Returns a boolean indicating this condition. 56240116Smarcel//! 57240116Smarcelbool matches_glob(const std::string&, const std::string&); 58240116Smarcel 59240116Smarcel//! 60240116Smarcel//! \brief Expands a glob pattern among multiple candidates. 61240116Smarcel//! 62240116Smarcel//! Given a glob pattern and a set of candidate strings, checks which of 63240116Smarcel//! those strings match the glob pattern and returns them. 64240116Smarcel//! 65240116Smarceltemplate< class T > 66240116Smarcelstd::vector< std::string > expand_glob(const std::string& glob, 67240116Smarcel const T& candidates) 68240116Smarcel{ 69240116Smarcel std::vector< std::string > exps; 70240116Smarcel 71240116Smarcel for (typename T::const_iterator iter = candidates.begin(); 72240116Smarcel iter != candidates.end(); iter++) 73240116Smarcel if (matches_glob(glob, *iter)) 74240116Smarcel exps.push_back(*iter); 75240116Smarcel 76240116Smarcel return exps; 77240116Smarcel} 78240116Smarcel 79240116Smarcel} // namespace expand 80240116Smarcel} // namespace atf 81240116Smarcel 82240116Smarcel#endif // !defined(_ATF_CXX_EXPAND_HPP_) 83