X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;ds=inline;f=ucw%2Ffb-buffer.c;h=c91dbaf4ddd425fbb5214be9c2d6094f2f0272ab;hb=f1149d882df3b1bfd12a33cef49430f559c3e0ee;hp=1888cd516b0d9bdced19b85cfe60d2c5f07d27f9;hpb=1cf8ac51f5495ccd5187dc220ffc69e95d6e0cfc;p=libucw.git diff --git a/ucw/fb-buffer.c b/ucw/fb-buffer.c index 1888cd51..c91dbaf4 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) { - 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) { - 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