* of the GNU Lesser General Public License.
*/
-#include "ucw/lib.h"
-#include "ucw/fastbuf.h"
+#include <ucw/lib.h>
+#include <ucw/fastbuf.h>
#include <stdio.h>
#include <stdlib.h>
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
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