]> mj.ucw.cz Git - libucw.git/blobdiff - ucw/fastbuf.c
tableprinter: header option now parsed by xtypes
[libucw.git] / ucw / fastbuf.c
index 4cd8bdfd1ccb467cce5bd37d61f75b1d47aa61d5..22501f43ed87cba8ff3e1529da0ebe2b57038b8c 100644 (file)
@@ -1,7 +1,7 @@
 /*
  *     UCW Library -- Fast Buffered I/O
  *
- *     (c) 1997--2007 Martin Mares <mj@ucw.cz>
+ *     (c) 1997--2011 Martin Mares <mj@ucw.cz>
  *
  *     This software may be freely distributed and used according to the terms
  *     of the GNU Lesser General Public License.
@@ -9,11 +9,11 @@
 
 #undef LOCAL_DEBUG
 
-#include "ucw/lib.h"
-#include "ucw/fastbuf.h"
-#include "ucw/respool.h"
-#include "ucw/trans.h"
-#include "ucw/stkstring.h"
+#include <ucw/lib.h>
+#include <ucw/fastbuf.h>
+#include <ucw/resource.h>
+#include <ucw/trans.h>
+#include <ucw/stkstring.h>
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -23,11 +23,7 @@ void bclose(struct fastbuf *f)
   if (f)
     {
       bflush(f);
-      if (f->res)
-       {
-         res_drop(f->res);
-         f->res = NULL;
-       }
+      res_detach(f->res);
       DBG("FB: closing", f);
       if (f->close)
        f->close(f); /* Should always free all internal resources, even if it throws an exception */
@@ -36,15 +32,17 @@ void bclose(struct fastbuf *f)
 
 void NONRET bthrow(struct fastbuf *f, const char *id, const char *fmt, ...)
 {
+  DBG("FB: throwing %s", full_id);
+  char full_id[16];
+  snprintf(full_id, sizeof(full_id), "ucw.fb.%s", id);
   ASSERT(!(f->flags & FB_DEAD)); /* Only one bthrow() is allowed before bclose() */
-  DBG("FB: throwing %s", id);
   va_list args;
   va_start(args, fmt);
   if (!f->res)
     die("Fastbuf %s error: %s", f->name ? : "<fb>", stk_vprintf(fmt, args));
   f->flags |= FB_DEAD;
   f->bptr = f->bstop = f->bufend; /* Reset the buffer to guard consecutive seek/read/write */
-  trans_vthrow(id, f, fmt, args);
+  trans_vthrow(full_id, f, fmt, args);
 }
 
 int brefill(struct fastbuf *f, int allow_eof)
@@ -52,7 +50,7 @@ int brefill(struct fastbuf *f, int allow_eof)
   DBG("FB: refill");
   ASSERT(!(f->flags & FB_DEAD) && f->buffer <= f->bstop && f->bstop <= f->bptr && f->bptr <= f->bufend);
   if (!f->refill)
-    bthrow(f, "fb.read", "Stream not readable");
+    bthrow(f, "read", "Stream not readable");
   if (f->refill(f))
     {
       ASSERT(f->buffer <= f->bptr && f->bptr < f->bstop && f->bstop <= f->bufend);
@@ -62,7 +60,7 @@ int brefill(struct fastbuf *f, int allow_eof)
     {
       ASSERT(f->buffer <= f->bptr && f->bptr == f->bstop && f->bstop <= f->bufend);
       if (!allow_eof && (f->flags & FB_DIE_ON_EOF))
-       bthrow(f, "fb.eof", "Unexpected EOF");
+       bthrow(f, "eof", "Unexpected EOF");
       return 0;
     }
 }
@@ -72,7 +70,7 @@ static void do_spout(struct fastbuf *f)
   DBG("FB: spout");
   ASSERT(!(f->flags & FB_DEAD) && f->buffer <= f->bstop && f->bstop <= f->bptr && f->bptr <= f->bufend); /* Check write mode possibly with unflushed data */
   if (!f->spout)
-    bthrow(f, "fb.write", "Stream not writeable");
+    bthrow(f, "write", "Stream not writeable");
   f->spout(f);
   ASSERT(f->buffer <= f->bstop && f->bstop <= f->bptr && f->bptr <= f->bufend);
 }
@@ -101,7 +99,7 @@ static void do_seek(struct fastbuf *f, ucw_off_t pos, int whence)
   bflush(f);
   DBG("FB: seeking to pos=%lld whence=%d %p %p %p %p", (long long)pos, whence, f->buffer, f->bstop, f->bptr, f->bufend);
   if (!f->seek || !f->seek(f, pos, whence))
-    bthrow(f, "fb.seek", "Stream not seekable");
+    bthrow(f, "seek", "Stream not seekable");
   DBG("FB: seeked %p %p %p %p", f->buffer, f->bstop, f->bptr, f->bufend);
   ASSERT(f->buffer <= f->bstop && f->bstop <= f->bptr && f->bptr <= f->bufend);
   if (whence == SEEK_SET)
@@ -110,7 +108,7 @@ static void do_seek(struct fastbuf *f, ucw_off_t pos, int whence)
     ASSERT(btell(f) >= 0);
 }
 
-inline void bsetpos(struct fastbuf *f, ucw_off_t pos)
+void bsetpos(struct fastbuf *f, ucw_off_t pos)
 {
   /* We can optimize seeks only when reading */
   if (f->bptr < f->bstop && pos <= f->pos && pos >= f->pos - (f->bstop - f->buffer)) /* If bptr == bstop, then [buffer, bstop] may be undefined */
@@ -118,7 +116,7 @@ inline void bsetpos(struct fastbuf *f, ucw_off_t pos)
   else if (pos != btell(f))
     {
       if (pos < 0)
-       bthrow(f, "fb.seek", "Seek out of range");
+       bthrow(f, "seek", "Seek out of range");
       do_seek(f, pos, SEEK_SET);
     }
 }
@@ -135,7 +133,7 @@ void bseek(struct fastbuf *f, ucw_off_t pos, int whence)
       break;
     case SEEK_END:
       if (pos > 0)
-       bthrow(f, "fb.seek", "Seek out of range");
+       bthrow(f, "seek", "Seek out of range");
       do_seek(f, pos, SEEK_END);
       break;
     default:
@@ -166,19 +164,19 @@ int beof_slow(struct fastbuf *f)
   return f->bptr >= f->bstop && !brefill(f, 1);
 }
 
-void bputc_slow(struct fastbuf *f, uns c)
+void bputc_slow(struct fastbuf *f, uint c)
 {
   if (f->bptr >= f->bufend)
     bspout(f);
   *f->bptr++ = c;
 }
 
-uns bread_slow(struct fastbuf *f, void *b, uns l, uns check)
+uint bread_slow(struct fastbuf *f, void *b, uint l, uint check)
 {
-  uns total = 0;
+  uint total = 0;
   while (l)
     {
-      uns k = f->bstop - f->bptr;
+      uint k = f->bstop - f->bptr;
 
       if (!k)
        {
@@ -196,15 +194,15 @@ uns bread_slow(struct fastbuf *f, void *b, uns l, uns check)
       total += k;
     }
   if (check && total && l)
-    bthrow(f, "fb.read", "breadb: short read");
+    bthrow(f, "eof", "breadb: short read");
   return total;
 }
 
-void bwrite_slow(struct fastbuf *f, const void *b, uns l)
+void bwrite_slow(struct fastbuf *f, const void *b, uint l)
 {
   while (l)
     {
-      uns k = f->bufend - f->bptr;
+      uint k = f->bufend - f->bptr;
 
       if (!k)
        {
@@ -220,19 +218,19 @@ void bwrite_slow(struct fastbuf *f, const void *b, uns l)
     }
 }
 
-void bbcopy_slow(struct fastbuf *f, struct fastbuf *t, uns l)
+void bbcopy_slow(struct fastbuf *f, struct fastbuf *t, uint l)
 {
   while (l)
     {
       byte *fptr, *tptr;
-      uns favail, tavail, n;
+      uint favail, tavail, n;
 
       favail = bdirect_read_prepare(f, &fptr);
       if (!favail)
        {
          if (l == ~0U)
            return;
-         bthrow(f, "fb.read", "bbcopy: source exhausted");
+         bthrow(f, "eof", "bbcopy: source exhausted");
        }
       tavail = bdirect_write_prepare(t, &tptr);
       n = MIN(l, favail);
@@ -245,7 +243,7 @@ void bbcopy_slow(struct fastbuf *f, struct fastbuf *t, uns l)
     }
 }
 
-int bconfig(struct fastbuf *f, uns item, int value)
+int bconfig(struct fastbuf *f, uint item, int value)
 {
   return (f->config && !(f->flags & FB_DEAD)) ? f->config(f, item, value) : -1;
 }
@@ -256,12 +254,12 @@ void brewind(struct fastbuf *f)
   bsetpos(f, 0);
 }
 
-int bskip_slow(struct fastbuf *f, uns len)
+int bskip_slow(struct fastbuf *f, uint len)
 {
   while (len)
     {
       byte *buf;
-      uns l = bdirect_read_prepare(f, &buf);
+      uint l = bdirect_read_prepare(f, &buf);
       if (!l)
        return 0;
       l = MIN(l, len);
@@ -301,10 +299,10 @@ static void fb_res_free(struct resource *r)
   bclose(f);
 }
 
-static void fb_res_dump(struct resource *r)
+static void fb_res_dump(struct resource *r, uint indent UNUSED)
 {
   struct fastbuf *f = r->priv;
-  printf(" name=%s", f->name);
+  printf(" name=%s\n", f->name);
 }
 
 static const struct res_class fb_res_class = {
@@ -314,7 +312,8 @@ static const struct res_class fb_res_class = {
   .free = fb_res_free,
 };
 
-void fb_tie(struct fastbuf *f)
+struct fastbuf *fb_tie(struct fastbuf *f)
 {
   f->res = res_new(&fb_res_class, f);
+  return f;
 }