]> mj.ucw.cz Git - libucw.git/blobdiff - ucw/fb-grow.c
FbGrow: Fixed assertion error after a refill of empty fastbuf.
[libucw.git] / ucw / fb-grow.c
index 19880ed36fd8f299559eae7479b1c5ba79b90097..2c458e838c0fb386771cafdc1e85c7fc5aeb9103 100644 (file)
@@ -7,9 +7,9 @@
  *     of the GNU Lesser General Public License.
  */
 
  *     of the GNU Lesser General Public License.
  */
 
-#include "ucw/lib.h"
-#include "ucw/fastbuf.h"
-#include "ucw/mempool.h"
+#include <ucw/lib.h>
+#include <ucw/fastbuf.h>
+#include <ucw/mempool.h>
 
 #include <stdio.h>
 #include <stdlib.h>
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -19,7 +19,7 @@ struct fb_gbuf {
   struct mempool *mp;
   byte *end;
 };
   struct mempool *mp;
   byte *end;
 };
-#define FB_GBUF(f) ((struct fb_gbuf *)(f)->is_fastbuf)
+#define FB_GBUF(f) ((struct fb_gbuf *)(f))
 
 static int fbgrow_refill(struct fastbuf *b)
 {
 
 static int fbgrow_refill(struct fastbuf *b)
 {
@@ -32,7 +32,7 @@ static void fbgrow_spout(struct fastbuf *b)
 {
   if (b->bptr == b->bufend)
     {
 {
   if (b->bptr == b->bufend)
     {
-      uns len = b->bufend - b->buffer;
+      uint len = b->bufend - b->buffer;
       if (FB_GBUF(b)->mp)
        {
          byte *old = b->buffer;
       if (FB_GBUF(b)->mp)
        {
          byte *old = b->buffer;
@@ -56,7 +56,7 @@ static int fbgrow_seek(struct fastbuf *b, ucw_off_t pos, int whence)
   if (whence == SEEK_END)
     pos += len;
   if (pos < 0 || pos > len)
   if (whence == SEEK_END)
     pos += len;
   if (pos < 0 || pos > len)
-    bthrow(b, "fb.seek", "Seek out of range");
+    bthrow(b, "seek", "Seek out of range");
   b->bptr = b->buffer + pos;
   b->bstop = b->buffer;
   b->pos = 0;
   b->bptr = b->buffer + pos;
   b->bstop = b->buffer;
   b->pos = 0;
@@ -69,7 +69,7 @@ static void fbgrow_close(struct fastbuf *b)
   xfree(b);
 }
 
   xfree(b);
 }
 
-struct fastbuf *fbgrow_create_mp(struct mempool *mp, unsigned basic_size)
+struct fastbuf *fbgrow_create_mp(struct mempool *mp, uint basic_size)
 {
   ASSERT(basic_size);
   struct fastbuf *b;
 {
   ASSERT(basic_size);
   struct fastbuf *b;
@@ -87,15 +87,16 @@ struct fastbuf *fbgrow_create_mp(struct mempool *mp, unsigned basic_size)
     }
   b->bufend = b->buffer + basic_size;
   b->bptr = b->bstop = b->buffer;
     }
   b->bufend = b->buffer + basic_size;
   b->bptr = b->bstop = b->buffer;
+  FB_GBUF(b)->end = b->buffer;
   b->name = "<fbgbuf>";
   b->refill = fbgrow_refill;
   b->spout = fbgrow_spout;
   b->seek = fbgrow_seek;
   b->can_overwrite_buffer = 1;
   b->name = "<fbgbuf>";
   b->refill = fbgrow_refill;
   b->spout = fbgrow_spout;
   b->seek = fbgrow_seek;
   b->can_overwrite_buffer = 1;
-  return fb_tie(b);
+  return b;
 }
 
 }
 
-struct fastbuf *fbgrow_create(unsigned basic_size)
+struct fastbuf *fbgrow_create(uint basic_size)
 {
   return fbgrow_create_mp(NULL, basic_size);
 }
 {
   return fbgrow_create_mp(NULL, basic_size);
 }
@@ -111,15 +112,24 @@ void fbgrow_rewind(struct fastbuf *b)
   brewind(b);
 }
 
   brewind(b);
 }
 
+uint fbgrow_get_buf(struct fastbuf *b, byte **buf)
+{
+  byte *end = FB_GBUF(b)->end;
+  end = MAX(end, b->bptr);
+  if (buf)
+    *buf = b->buffer;
+  return end - b->buffer;
+}
+
 #ifdef TEST
 
 int main(void)
 {
   struct fastbuf *f;
 #ifdef TEST
 
 int main(void)
 {
   struct fastbuf *f;
-  uns t;
+  uint t;
 
   f = fbgrow_create(3);
 
   f = fbgrow_create(3);
-  for (uns i=0; i<5; i++)
+  for (uint i=0; i<5; i++)
     {
       fbgrow_reset(f);
       bwrite(f, "12345", 5);
     {
       fbgrow_reset(f);
       bwrite(f, "12345", 5);