I noticed some oddities/problems with the stream mark/seek/reset functionality in svn_subst_stream_translated().
1. svn_subst_stream_translated() doesn't handle mark/seek properly. translated_stream_mark() saves and translated_stream_seek() restores only the source stream's position, and not the internal state of translation which it resets to "not in a translation". This will work properly only if the marked position is not inside a keyword or EOL. It needs to store (into the mark structure) the current state of translation as well. (An alternative could be to attach conditions to the use of mark/seek: "this only works if you do XXX" - but I think that would be a Bad Thing. The concept of streams works well precisely because we can layer arbitrary streams on top of each other and expect them to work without having to worry about such conditions.) 2. translated_stream_seek() first flushes the output buffer, but translated_stream_reset() doesn't. I think that's a bug in _reset. - Julian