X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=ucw%2Ffb-buffer.c;h=c91dbaf4ddd425fbb5214be9c2d6094f2f0272ab;hb=ecf11d9c9949a6e9323a4f18c2418532d7f77b8f;hp=35dd638118c841a36465d21510a4dd9f3571a4cd;hpb=1a4af940b4b3af2e928b82835741be6a3649b83c;p=libucw.git diff --git a/ucw/fb-buffer.c b/ucw/fb-buffer.c index 35dd6381..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 @@ -97,7 +97,7 @@ int main(int argc, char *argv[]) char buff[20]; fbbuf_init_write(&fb, buff, 20); bputs(&fb, "Hello world\n"); - bputc(&fb, '\0'); + bputc(&fb, 0); fputs(buff, stdout); break; } @@ -107,7 +107,7 @@ int main(int argc, char *argv[]) char buff[4]; fbbuf_init_write(&fb, buff, 4); bputs(&fb, "Hello"); - bputc(&fb, '\0'); + bputc(&fb, 0); fputs(buff, stdout); break; }