| /* |
| * 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: ndnboost/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 NDNBOOST_IOSTREAMS_GREP_FILTER_HPP_INCLUDED |
| #define NDNBOOST_IOSTREAMS_GREP_FILTER_HPP_INCLUDED |
| |
| #if defined(_MSC_VER) && (_MSC_VER >= 1020) |
| # pragma once |
| #endif |
| |
| #include <iostream> |
| |
| #include <memory> // allocator. |
| #include <ndnboost/iostreams/char_traits.hpp> |
| #include <ndnboost/iostreams/filter/line.hpp> |
| #include <ndnboost/iostreams/pipeline.hpp> |
| #include <ndnboost/regex.hpp> |
| |
| namespace ndnboost { namespace iostreams { |
| |
| namespace grep { |
| |
| const int invert = 1; |
| const int whole_line = invert << 1; |
| |
| } // End namespace grep. |
| |
| template< typename Ch, |
| typename Tr = regex_traits<Ch>, |
| typename Alloc = std::allocator<Ch> > |
| class basic_grep_filter : public basic_line_filter<Ch, Alloc> { |
| private: |
| typedef basic_line_filter<Ch, Alloc> base_type; |
| public: |
| typedef typename base_type::char_type char_type; |
| typedef typename base_type::category category; |
| typedef char_traits<char_type> traits_type; |
| typedef typename base_type::string_type string_type; |
| typedef basic_regex<Ch, Tr> 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<typename Sink> |
| void close(Sink& snk, NDNBOOST_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_; |
| }; |
| NDNBOOST_IOSTREAMS_PIPABLE(basic_grep_filter, 3) |
| |
| typedef basic_grep_filter<char> grep_filter; |
| typedef basic_grep_filter<wchar_t> wgrep_filter; |
| |
| //------------------Implementation of basic_grep_filter-----------------------// |
| |
| template<typename Ch, typename Tr, typename Alloc> |
| basic_grep_filter<Ch, Tr, Alloc>::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 NDNBOOST_IOSTREAMS_REGEX_FILTER_HPP_INCLUDED |