110 lines
3.5 KiB
C++
110 lines
3.5 KiB
C++
/*
|
|
* 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 <iostream>
|
|
|
|
#include <memory> // allocator.
|
|
#include <boost/iostreams/char_traits.hpp>
|
|
#include <boost/iostreams/filter/line.hpp>
|
|
#include <boost/iostreams/pipeline.hpp>
|
|
#include <boost/regex.hpp>
|
|
|
|
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<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, 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<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 BOOST_IOSTREAMS_REGEX_FILTER_HPP_INCLUDED
|