summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2019-10-26 16:41:46 +0200
committerwm4 <wm4@nowhere>2019-10-31 11:05:45 +0100
commitc6b08d222fd62ac05657a77898e1d749dc3be72f (patch)
treecfaf1887a228b13190e70e928d28f3bf703e375f
parentbe4996e31231574ac2b044760fa2c3f4c4719256 (diff)
downloadmpv-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.
-rw-r--r--stream/stream.c23
-rw-r--r--stream/stream.h1
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);