diff options
author | wm4 <wm4@nowhere> | 2019-10-26 16:41:46 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2019-10-31 11:05:45 +0100 |
commit | c6b08d222fd62ac05657a77898e1d749dc3be72f (patch) | |
tree | cfaf1887a228b13190e70e928d28f3bf703e375f /stream | |
parent | be4996e31231574ac2b044760fa2c3f4c4719256 (diff) | |
download | mpv-c6b08d222fd62ac05657a77898e1d749dc3be72f.tar.bz2 mpv-c6b08d222fd62ac05657a77898e1d749dc3be72f.tar.xz |
stream: stop accessing buffer internals in stream_read_line()
Getting this out of the way in preparation for reworking stream
internals.
Diffstat (limited to 'stream')
-rw-r--r-- | stream/stream.c | 23 | ||||
-rw-r--r-- | stream/stream.h | 1 |
2 files changed, 16 insertions, 8 deletions
diff --git a/stream/stream.c b/stream/stream.c index 36b08803b3..6dfbfa31a7 100644 --- a/stream/stream.c +++ b/stream/stream.c @@ -496,6 +496,16 @@ struct bstr stream_peek(stream_t *s, int len) return (bstr){.start = &s->buffer[s->buf_pos], .len = MPMIN(len, avail)}; } +// Peek the current buffer. This will return at least 1 byte, unless EOF was +// reached. If data is returned, the length is essentially random. +struct bstr stream_peek_buffer(stream_t *s) +{ + if (s->buf_len - s->buf_pos < 1) + stream_fill_buffer(s); + return (bstr){.start = &s->buffer[s->buf_pos], + .len = s->buf_len - s->buf_pos}; +} + int stream_write_buffer(stream_t *s, unsigned char *buf, int len) { if (!s->write_buffer) @@ -676,16 +686,13 @@ static int read_characters(stream_t *s, uint8_t *dst, int dstsize, int utf16) } return cur - dst; } else { - if (s->buf_pos >= s->buf_len) - stream_fill_buffer(s); - uint8_t *src = s->buffer + s->buf_pos; - int src_len = s->buf_len - s->buf_pos; - uint8_t *end = memchr(src, '\n', src_len); - int len = end ? end - src + 1 : src_len; + bstr buf = stream_peek_buffer(s); + uint8_t *end = memchr(buf.start, '\n', buf.len); + int len = end ? end - buf.start + 1 : buf.len; if (len > dstsize) return -1; // line too long - memcpy(dst, src, len); - s->buf_pos += len; + memcpy(dst, buf.start, len); + stream_skip(s, len); return len; } } diff --git a/stream/stream.h b/stream/stream.h index dcea82dace..71a7011fef 100644 --- a/stream/stream.h +++ b/stream/stream.h @@ -180,6 +180,7 @@ bool stream_seek(stream_t *s, int64_t pos); int stream_read(stream_t *s, char *mem, int total); int stream_read_partial(stream_t *s, char *buf, int buf_size); struct bstr stream_peek(stream_t *s, int len); +struct bstr stream_peek_buffer(stream_t *s); void stream_drop_buffers(stream_t *s); int64_t stream_get_size(stream_t *s); |