]> mj.ucw.cz Git - libucw.git/blobdiff - lib/ff-printf.c
tried parametrized fastbuf for most of indexing I/O
[libucw.git] / lib / ff-printf.c
index 395e04b2155529c2610eb59f610544c851c096a5..8825a2880437dff93a19e29b5e947d68b294a64b 100644 (file)
@@ -1,7 +1,7 @@
 /*
- *     Sherlock Library -- Printf on Fastbuf Streams
+ *     UCW Library -- Printf on Fastbuf Streams
  *
- *     (c) 2002 Martin Mares <mj@ucw.cz>
+ *     (c) 2002--2005 Martin Mares <mj@ucw.cz>
  *
  *     This software may be freely distributed and used according to the terms
  *     of the GNU Lesser General Public License.
 #include "lib/lib.h"
 #include "lib/fastbuf.h"
 
+#include <stdio.h>
 #include <alloca.h>
 
 int
-vbprintf(struct fastbuf *b, byte *msg, va_list args)
+vbprintf(struct fastbuf *b, char *msg, va_list args)
 {
   byte *buf;
-  int r, len = 256;
+  int len, r;
+  va_list args2;
+
+  len = bdirect_write_prepare(b, &buf);
+  if (len >= 16)
+    {
+      va_copy(args2, args);
+      r = vsnprintf(buf, len, msg, args2);
+      va_end(args2);
+      if (r < 0)
+       len = 256;
+      else if (r < len)
+       {
+         bdirect_write_commit(b, buf+r);
+         return r;
+       }
+      else
+       len = r+1;
+    }
+  else
+    len = 256;
 
   while (1)
     {
       buf = alloca(len);
-      r = vsnprintf(buf, len, msg, args);
+      va_copy(args2, args);
+      r = vsnprintf(buf, len, msg, args2);
+      va_end(args2);
       if (r < 0)
        len += len;
       else if (r < len)
@@ -35,7 +58,7 @@ vbprintf(struct fastbuf *b, byte *msg, va_list args)
 }
 
 int
-bprintf(struct fastbuf *b, byte *msg, ...)
+bprintf(struct fastbuf *b, char *msg, ...)
 {
   va_list args;
   int res;
@@ -51,7 +74,8 @@ bprintf(struct fastbuf *b, byte *msg, ...)
 int main(void)
 {
   struct fastbuf *b = bfdopen_shared(1, 65536);
-  bprintf(b, "13=%d str=<%s> msg=%m\n", 13, "str");
+  for (int i=0; i<10000; i++)
+    bprintf(b, "13=%d str=<%s> msg=%m\n", 13, "str");
   bclose(b);
   return 0;
 }