X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=lib%2Ffb-buffer.c;h=09c7429357e6c518e9630b418067037e4986a43f;hb=1e346d26a03735f09bba33ddbaba4cc9b268d381;hp=2f52665f1bfbb879d69b9adaec550499b99a09e7;hpb=61da975c346c50ccf9bb9cb7271ef538dc15ab32;p=libucw.git diff --git a/lib/fb-buffer.c b/lib/fb-buffer.c index 2f52665f..09c74293 100644 --- a/lib/fb-buffer.c +++ b/lib/fb-buffer.c @@ -1,8 +1,7 @@ /* - * Sherlock Library -- Fast Buffered I/O on Static Buffers + * UCW Library -- Fast Buffered I/O on Static Buffers * - * (c) 2003 Martin Mares - * (c) 2004 Robert Spalek + * (c) 2003--2006 Martin Mares * * This software may be freely distributed and used according to the terms * of the GNU Lesser General Public License. @@ -11,18 +10,7 @@ #include "lib/lib.h" #include "lib/fastbuf.h" -static int -fbbuf_config(struct fastbuf *f UNUSED, uns item, int value UNUSED) -{ - switch (item) - { - case BCONFIG_CAN_OVERWRITE: - // XXX: should we enable changing the value? - return 1; - default: - return -1; - } -} +#include static int fbbuf_refill(struct fastbuf *f UNUSED) @@ -30,8 +18,21 @@ fbbuf_refill(struct fastbuf *f UNUSED) return 0; } +static void +fbbuf_seek(struct fastbuf *f, sh_off_t pos, int whence) +{ + /* Somebody might want to seek to the end of buffer, try to be nice to him. */ + sh_off_t len = f->bufend - f->buffer; + if (whence == SEEK_END) + pos += len; + ASSERT(pos >= 0 && pos <= len); + f->bptr = f->buffer + pos; + f->bstop = f->bufend; + f->pos = len; +} + void -fbbuf_init_read(struct fastbuf *f, byte *buf, uns size) +fbbuf_init_read(struct fastbuf *f, byte *buf, uns size, uns can_overwrite) { f->buffer = f->bptr = buf; f->bstop = f->bufend = buf + size; @@ -39,9 +40,10 @@ fbbuf_init_read(struct fastbuf *f, byte *buf, uns size) f->pos = size; f->refill = fbbuf_refill; f->spout = NULL; - f->seek = NULL; + f->seek = fbbuf_seek; f->close = NULL; - f->config = fbbuf_config; + f->config = NULL; + f->can_overwrite_buffer = can_overwrite; } static void @@ -61,5 +63,6 @@ fbbuf_init_write(struct fastbuf *f, byte *buf, uns size) f->spout = fbbuf_spout; f->seek = NULL; f->close = NULL; - f->config = fbbuf_config; + f->config = NULL; + f->can_overwrite_buffer = 0; }