]> code.citadel.org Git - citadel.git/blobdiff - libcitadel/lib/stringbuf.c
* fix new wprintf backend to handle buffer increases
[citadel.git] / libcitadel / lib / stringbuf.c
index 87d6e3a7536bbc767e100f1a9d9680042d39e2ee..0e9fb0e504f626c67d5e37cbc5568721697d978b 100644 (file)
@@ -254,14 +254,18 @@ void StrBufVAppendPrintf(StrBuf *Buf, const char *format, va_list ap)
 {
        size_t nWritten = Buf->BufSize + 1;
        size_t Offset = Buf->BufUsed;
+       size_t newused = Offset + nWritten;
        
-       while (Offset + nWritten >= Buf->BufSize) {
+       while (newused >= Buf->BufSize) {
                nWritten = vsnprintf(Buf->buf + Offset, 
                                     Buf->BufSize - Offset, 
                                     format, ap);
-               Buf->BufUsed = Offset + nWritten ;
-               if (nWritten >= Buf->BufSize)
-                       IncreaseBuf(Buf, 0, 0);
+               newused = Offset + nWritten;
+               if (newused >= Buf->BufSize)
+                       IncreaseBuf(Buf, 1, 0);
+               else
+                       Buf->BufUsed = Offset + nWritten ;
+
        }
 }
 
@@ -673,3 +677,19 @@ int CompressBuffer(StrBuf *Buf)
 #endif /* HAVE_ZLIB */
        return 0;
 }
+
+int StrBufDecodeBase64(StrBuf *Buf)
+{
+       char *xferbuf;
+       size_t siz;
+       if (Buf == NULL) return -1;
+
+       xferbuf = (char*) malloc(Buf->BufSize);
+       siz = CtdlDecodeBase64(xferbuf,
+                              Buf->buf,
+                              Buf->BufUsed);
+       free(Buf->buf);
+       Buf->buf = xferbuf;
+       Buf->BufUsed = siz;
+       return siz;
+}