X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=ucw%2Ffb-buffer.c;h=c69234725e0d26901e780fca0d63ec394369b3af;hb=a6368763d08042207963c941b1c52b5fafcb0cb3;hp=1888cd516b0d9bdced19b85cfe60d2c5f07d27f9;hpb=a4fe009d3366b0a3e119713b0ecc7fc0070efdfa;p=libucw.git diff --git a/ucw/fb-buffer.c b/ucw/fb-buffer.c index 1888cd51..c6923472 100644 --- a/ucw/fb-buffer.c +++ b/ucw/fb-buffer.c @@ -7,16 +7,18 @@ * of the GNU Lesser General Public License. */ -#include "ucw/lib.h" -#include "ucw/fastbuf.h" +#include +#include #include #include static int -fbbuf_refill(struct fastbuf *f UNUSED) +fbbuf_refill(struct fastbuf *f) { - return 0; + f->bstop = f->bufend; + f->pos = f->bstop - f->buffer; + return f->bptr < f->bstop; } static int @@ -26,47 +28,45 @@ fbbuf_seek(struct fastbuf *f, ucw_off_t pos, int whence) ucw_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; + if (pos < 0 || pos > len) + bthrow(f, "seek", "Seek out of range"); + f->bstop = f->bptr = f->buffer + pos; + f->pos = pos; return 1; } void -fbbuf_init_read(struct fastbuf *f, byte *buf, uns size, uns can_overwrite) +fbbuf_init_read(struct fastbuf *f, byte *buf, uint size, uint can_overwrite) { - f->buffer = f->bptr = buf; - f->bstop = f->bufend = buf + size; - f->name = "fbbuf-read"; - f->pos = size; - f->refill = fbbuf_refill; - f->spout = NULL; - f->seek = fbbuf_seek; - f->close = NULL; - f->config = NULL; - f->can_overwrite_buffer = can_overwrite; + *f = (struct fastbuf) { + .buffer = buf, + .bptr = buf, + .bstop = buf + size, + .bufend = buf + size, + .name = "fbbuf-read", + .pos = size, + .refill = fbbuf_refill, + .seek = fbbuf_seek, + .can_overwrite_buffer = can_overwrite }; } static void -fbbuf_spout(struct fastbuf *f UNUSED) +fbbuf_spout(struct fastbuf *f) { - die("fbbuf: buffer overflow on write"); + bthrow(f, "write", "fbbuf: buffer overflow on write"); } void -fbbuf_init_write(struct fastbuf *f, byte *buf, uns size) +fbbuf_init_write(struct fastbuf *f, byte *buf, uint size) { - f->buffer = f->bstop = f->bptr = buf; - f->bufend = buf + size; - f->name = "fbbuf-write"; - f->pos = size; - f->refill = NULL; - f->spout = fbbuf_spout; - f->seek = NULL; - f->close = NULL; - f->config = NULL; - f->can_overwrite_buffer = 0; + *f = (struct fastbuf) { + .buffer = buf, + .bstop = buf, + .bptr = buf, + .bufend = buf + size, + .name = "fbbuf-write", + .spout = fbbuf_spout, + }; } #ifdef TEST