From 9f3c90e0b5faaace66913de1300219b94662d2c1 Mon Sep 17 00:00:00 2001 From: Nicolas Pennequin Date: Fri, 12 Oct 2007 19:52:14 +0200 Subject: [PATCH] Correct bufseek --- apps/buffering.c | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/apps/buffering.c b/apps/buffering.c index 7e6b9dd5d..ba4f64454 100644 --- a/apps/buffering.c +++ b/apps/buffering.c @@ -742,17 +742,12 @@ int bufclose(int handle_id) /* Set reading index in handle (relatively to the start of the file). Access before the available data will trigger a rebuffer. - TODO: Make it behave like bufadvance - TODO: Maybe force an immediate rebuffer by calling buffer_handle() ? Return 0 for success and < 0 for failure: -1 if the handle wasn't found - -2 if there is no data available at the new position - (the reading index is still moved) - -3 if the new requested position was beyond the end of the file + -2 if the new requested position was beyond the end of the file */ int bufseek(int handle_id, size_t newpos) { - int ret = 0; struct memory_handle *h = find_handle(handle_id); if (!h) return -1; @@ -761,21 +756,14 @@ int bufseek(int handle_id, size_t newpos) /* access beyond the end of the file */ return -3; } - - else if (newpos < h->offset) { - /* access before what we currently have. A rebuffer is needed. */ - h->offset = newpos; - /* TODO: Add a reset_handle queue call here like in bufadvance. */ - ret = -2; + else if (newpos < h->offset || h->offset + h->available < newpos) { + /* access before or after buffered data. A rebuffer is needed. */ + rebuffer_handle(handle_id, newpos); } - - else if (newpos > h->offset + h->available) { - /* data isn't available yet. */ - ret = -2; + else { + h->ridx = RINGBUF_ADD(h->data, newpos - h->offset); } - - h->ridx = RINGBUF_ADD(h->data, newpos); - return ret; + return 0; } /* Advance the reading index in a handle (relatively to its current position). -- 2.11.4.GIT