X-Git-Url: http://mj.ucw.cz/gitweb/?a=blobdiff_plain;f=ucw%2Ffb-buffer.c;h=c69234725e0d26901e780fca0d63ec394369b3af;hb=a6368763d08042207963c941b1c52b5fafcb0cb3;hp=3c377e06aa6d8657d7bcf277ee531bb7cbd66959;hpb=031256ad2e123eec58521f8e3eb9496c197641d2;p=libucw.git diff --git a/ucw/fb-buffer.c b/ucw/fb-buffer.c index 3c377e06..c6923472 100644 --- a/ucw/fb-buffer.c +++ b/ucw/fb-buffer.c @@ -7,64 +7,112 @@ * 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 -fbbuf_seek(struct fastbuf *f, sh_off_t pos, int whence) +fbbuf_seek(struct fastbuf *f, ucw_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; + 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 + +int main(int argc, char *argv[]) +{ + if (argc < 2) + { + fprintf(stderr, "You must specify a test (r, w, o)\n"); + return 1; + } + switch (*argv[1]) + { + case 'r': + { + struct fastbuf fb; + char *data = "Two\nlines\n"; + fbbuf_init_read(&fb, data, strlen(data), 0); + char buffer[10]; + while (bgets(&fb, buffer, 10)) + puts(buffer); + bclose(&fb); + break; + } + case 'w': + { + struct fastbuf fb; + char buff[20]; + fbbuf_init_write(&fb, buff, 20); + bputs(&fb, "Hello world\n"); + bputc(&fb, 0); + fputs(buff, stdout); + break; + } + case 'o': + { + struct fastbuf fb; + char buff[4]; + fbbuf_init_write(&fb, buff, 4); + bputs(&fb, "Hello"); + bputc(&fb, 0); + fputs(buff, stdout); + break; + } + } + return 0; +} + +#endif