diff --git a/subversion/libsvn_subr/subst.c b/subversion/libsvn_subr/subst.c index e32c253..5ad7ef9 100644 --- a/subversion/libsvn_subr/subst.c +++ b/subversion/libsvn_subr/subst.c @@ -1201,6 +1201,27 @@ translated_stream_read(void *baton, return SVN_NO_ERROR; } +/* Implements svn_skip_fn_t. */ +static svn_error_t * +translated_stream_skip(void *baton, + apr_size_t *count) +{ + apr_size_t total_bytes_read = 0; + apr_size_t bytes_read; + char buffer[SVN__STREAM_CHUNK_SIZE]; + svn_error_t *err = SVN_NO_ERROR; + + while ((total_bytes_read < *count) && !err) + { + bytes_read = sizeof(buffer) < *count ? sizeof(buffer) : *count; + err = translated_stream_read(baton, buffer, &bytes_read); + total_bytes_read += bytes_read; + } + + *count = total_bytes_read; + return err; +} + /* Implements svn_write_fn_t. */ static svn_error_t * translated_stream_write(void *baton, @@ -1312,6 +1333,14 @@ translated_stream_seek(void *baton, svn_stream_mark_t *mark) return SVN_NO_ERROR; } +/* Implements svn_io_buffered_fn_t. */ +static svn_boolean_t +translated_stream_buffered(void *baton) +{ + struct translated_stream_baton *b = baton; + return svn_stream_buffered(b->stream); +} + svn_error_t * svn_subst_read_specialfile(svn_stream_t **stream, const char *path, @@ -1409,10 +1438,12 @@ svn_subst_stream_translated(svn_stream_t *stream, /* Setup the stream methods */ svn_stream_set_read(s, translated_stream_read); + svn_stream_set_skip(s, translated_stream_skip); svn_stream_set_write(s, translated_stream_write); svn_stream_set_close(s, translated_stream_close); svn_stream_set_mark(s, translated_stream_mark); svn_stream_set_seek(s, translated_stream_seek); + svn_stream_set_buffered(s, translated_stream_buffered); return s; }