static ya_result buffer_input_stream_skip(input_stream* stream, u32 len) { ya_result ret; buffer_input_stream_data* data = (buffer_input_stream_data*)stream->data; u32 remaining = data->buffer_size - data->buffer_offset; if(len <= remaining) { data->buffer_offset += len; return len; } len -= remaining; data->buffer_offset = data->buffer_size; if(FAIL(ret = input_stream_skip(&data->filtered, len))) { // 'remaining' bytes may have been skipped already, if so, return that before the error return (remaining > 0)?remaining:ret; } return remaining + ret; }
static ya_result buffer_skip(input_stream* stream, u32 len) { ya_result return_code; u32 total_len = len; buffer_input_stream_data* data = (buffer_input_stream_data*)stream->data; u32 remaining = data->buffer_size - data->buffer_offset; if(remaining > len) { data->buffer_offset += len; return len; } len -= remaining; data->buffer_offset = data->buffer_size; if(FAIL(return_code = input_stream_skip(&data->filtered, len))) { return return_code; } return total_len; }