@@@ man wip
[mLib] / utils / gprintf.c
index 602698c..9964d18 100644 (file)
@@ -48,6 +48,7 @@
 #include "darray.h"
 #include "dstr.h"
 #include "gprintf.h"
+#include "growbuf.h"
 #include "macros.h"
 
 /*----- Tunable constants -------------------------------------------------*/
@@ -408,8 +409,8 @@ int vgprintf(const struct gprintf_ops *ops, void *out,
     /* --- Output the literal portion --- */
 
     if (fs->n) {
-      if (ops->putm(out, fs->p, fs->n)) return (-1);
-      tot += fs->n;
+      n = ops->putm(out, fs->p, fs->n); if (n < 0) return (-1);
+      tot += n;
     }
 
     /* --- And now the variable portion --- */
@@ -419,8 +420,8 @@ int vgprintf(const struct gprintf_ops *ops, void *out,
        case 0:
          break;
        case '%':
-         if (ops->putch(out, '%')) return (-1);
-         tot++; break;
+         n = ops->putch(out, '%'); if (n < 0) return (-1);
+         tot += n; break;
        default:
          abort();
       }
@@ -500,8 +501,8 @@ int vgprintf(const struct gprintf_ops *ops, void *out,
        break;
 #else
 #  define MSG "<no float support>"
-       if (ops->putm(out, MSG, sizeof(MSG) - 1)) return (-1);
-       tot += sizeof(MSG) - 1; continue;
+       n = ops->putm(out, MSG, sizeof(MSG) - 1); if (n < 0) return (-1);
+       tot += n; continue;
 #  undef MSG
 #endif
       case 's':
@@ -526,14 +527,14 @@ int vgprintf(const struct gprintf_ops *ops, void *out,
     switch (fs->fmt) {
 #define CASE(code, ty)                                                 \
        case fmt_##code:                                                \
-         i = ops->nputf(out, sz, dd.buf, fa[fs->arg].u.code);          \
+         n = ops->nputf(out, sz, dd.buf, fa[fs->arg].u.code);          \
          break;
       OUTPUT_FMTTYPES(CASE)
 #undef CASE
       default: abort();
     }
-    if (i < 0) return (-1);
-    tot += i;
+    if (n < 0) return (-1);
+    tot += n;
   }
 
   /* --- We're done --- */
@@ -595,21 +596,13 @@ int gprintf(const struct gprintf_ops *ops, void *out, const char *p, ...)
 size_t gprintf_memputf(char **buf_inout, size_t *sz_inout,
                    size_t maxsz, const char *p, va_list ap)
 {
-  char *buf = *buf_inout;
-  size_t sz = *sz_inout;
   int n;
 
-  if (sz <= maxsz) {
-    if (!sz) sz = 32;
-    while (sz <= maxsz) sz *= 2;
-    if (buf) xfree(buf);
-    buf = xmalloc(sz); *buf_inout = buf; *sz_inout = sz;
-  }
-
+  GROWBUF_REPLACE(&arena_stdlib, *buf_inout, *sz_inout, maxsz, 64, 1);
 #ifdef HAVE_SNPRINTF
-  n = vsnprintf(buf, maxsz + 1, p, ap);
+  n = vsnprintf(*buf_inout, maxsz + 1, p, ap);
 #else
-  n = vsprintf(buf, p, ap);
+  n = vsprintf(*buf_inout, p, ap);
 #endif
   assert(0 <= n && n <= maxsz);
   return (n);