/* * Distributed under the Boost Software License, Version 1.0.(See accompanying * file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.) * * See http://www.boost.org/libs/iostreams for documentation. * File: boost/iostreams/filter/grep.hpp * Date: Mon May 26 17:48:45 MDT 2008 * Copyright: 2008 CodeRage, LLC * Author: Jonathan Turkanis * Contact: turkanis at coderage dot com * * Defines the class template basic_grep_filter and its specializations * grep_filter and wgrep_filter. */ #ifndef BOOST_IOSTREAMS_GREP_FILTER_HPP_INCLUDED #define BOOST_IOSTREAMS_GREP_FILTER_HPP_INCLUDED #if defined(_MSC_VER) && (_MSC_VER >= 1020) # pragma once #endif #include #include // allocator. #include #include #include #include namespace boost { namespace iostreams { namespace grep { const int invert = 1; const int whole_line = invert << 1; } // End namespace grep. template< typename Ch, typename Tr = regex_traits, typename Alloc = std::allocator > class basic_grep_filter : public basic_line_filter { private: typedef basic_line_filter base_type; public: typedef typename base_type::char_type char_type; typedef typename base_type::category category; typedef char_traits traits_type; typedef typename base_type::string_type string_type; typedef basic_regex regex_type; typedef regex_constants::match_flag_type match_flag_type; basic_grep_filter( const regex_type& re, match_flag_type match_flags = regex_constants::match_default, int options = 0 ); int count() const { return count_; } template void close(Sink& snk, BOOST_IOS::openmode which) { base_type::close(snk, which); options_ &= ~f_initialized; } private: virtual string_type do_filter(const string_type& line) { if ((options_ & f_initialized) == 0) { options_ |= f_initialized; count_ = 0; } bool matches = (options_ & grep::whole_line) ? regex_match(line, re_, match_flags_) : regex_search(line, re_, match_flags_); if (options_ & grep::invert) matches = !matches; if (matches) ++count_; return matches ? line + traits_type::newline() : string_type(); } // Private flags bitwise OR'd with constants from namespace grep enum flags_ { f_initialized = 65536 }; regex_type re_; match_flag_type match_flags_; int options_; int count_; }; BOOST_IOSTREAMS_PIPABLE(basic_grep_filter, 3) typedef basic_grep_filter grep_filter; typedef basic_grep_filter wgrep_filter; //------------------Implementation of basic_grep_filter-----------------------// template basic_grep_filter::basic_grep_filter (const regex_type& re, match_flag_type match_flags, int options) : base_type(true), re_(re), match_flags_(match_flags), options_(options), count_(0) { } } } // End namespaces iostreams, boost. #endif // #ifndef BOOST_IOSTREAMS_REGEX_FILTER_HPP_INCLUDED