|
Boost : |
From: Peter Dimov (pdimov_at_[hidden])
Date: 2005-03-04 07:59:41
Peter Dimov wrote:
> Time for a contest. "Write the best non-blocking comment skipping
> filter". :-)
Here's my entry.
struct filter
{
char comment_char_;
bool in_comment_;
filter(): comment_char_( '#' ), in_comment_( false )
{
}
template< class Source > int get( Source & src )
{
int c;
for( ;; )
{
if( in_comment_ )
{
for( ;; )
{
c = src.get();
if( c == eof || c == eagain ) return c;
if( c == '\n' ) break;
}
in_comment_ = false;
}
c = src.get();
if( c != comment_char_ ) return c;
in_comment_ = true;
}
}
};
struct filter2
{
char comment_char_;
bool in_comment_;
filter2(): comment_char_( '#' ), in_comment_( false )
{
}
template< class Source > int read( Source & src, char * s, int n )
{
int m = src.read( s, n );
if( m <= 0 ) return m;
int r = 0; // dest: [s, s + r)
char const * p = s; // src: [p, p + m)
for( ;; )
{
if( in_comment_ )
{
char const * q = static_cast<char const *>( memchr( p, '\n',
m ) );
if( q == 0 )
{
return r;
}
m -= q - p + 1;
p = q + 1;
in_comment_ = false;
}
char const * q = static_cast<char const *>( memchr( p,
comment_char_, m ) );
if( q == 0 )
{
memmove( s + r, p, m );
return r + m;
}
memmove( s + r, p, q - p );
r += q - p;
m -= q - p + 1;
p = q + 1;
in_comment_ = true;
}
}
};
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk