aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2009-09-30 15:22:36 +0200
committerMax Kellermann <max@duempel.org>2009-09-30 15:22:36 +0200
commitefb290073bfecfb051a9839ec30fb5c57524640d (patch)
tree5310da5082c17fa47fbc03454392d463b484aab7 /src
parent82c6c137808264cc84220274f8ab57e8c47d7772 (diff)
decoder_buffer: added function decoder_buffer_skip()
Diffstat (limited to 'src')
-rw-r--r--src/decoder_buffer.c26
-rw-r--r--src/decoder_buffer.h10
2 files changed, 36 insertions, 0 deletions
diff --git a/src/decoder_buffer.c b/src/decoder_buffer.c
index 76e9126e..b6fa9000 100644
--- a/src/decoder_buffer.c
+++ b/src/decoder_buffer.c
@@ -138,3 +138,29 @@ decoder_buffer_consume(struct decoder_buffer *buffer, size_t nbytes)
assert(buffer->consumed <= buffer->length);
}
+
+bool
+decoder_buffer_skip(struct decoder_buffer *buffer, size_t nbytes)
+{
+ size_t length;
+ const void *data;
+ bool success;
+
+ /* this could probably be optimized by seeking */
+
+ while (true) {
+ data = decoder_buffer_read(buffer, &length);
+ if (data != NULL) {
+ if (length > nbytes)
+ length = nbytes;
+ decoder_buffer_consume(buffer, length);
+ nbytes -= length;
+ if (nbytes == 0)
+ return true;
+ }
+
+ success = decoder_buffer_fill(buffer);
+ if (!success)
+ return false;
+ }
+}
diff --git a/src/decoder_buffer.h b/src/decoder_buffer.h
index d951a405..411e3bd8 100644
--- a/src/decoder_buffer.h
+++ b/src/decoder_buffer.h
@@ -93,4 +93,14 @@ decoder_buffer_read(const struct decoder_buffer *buffer, size_t *length_r);
void
decoder_buffer_consume(struct decoder_buffer *buffer, size_t nbytes);
+/**
+ * Skips the specified number of bytes, discarding its data.
+ *
+ * @param buffer the decoder_buffer object
+ * @param nbytes the number of bytes to skip
+ * @return true on success, false on error
+ */
+bool
+decoder_buffer_skip(struct decoder_buffer *buffer, size_t nbytes);
+
#endif