]> mj.ucw.cz Git - libucw.git/blobdiff - ucw/fb-buffer.c
Build: Fixed few compilation warnings/errors.
[libucw.git] / ucw / fb-buffer.c
index 3c377e06aa6d8657d7bcf277ee531bb7cbd66959..c91dbaf4ddd425fbb5214be9c2d6094f2f0272ab 100644 (file)
  *     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
-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)
 {
-  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
+
+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