diff options
author | Wojciech Polak <polak@gnu.org> | 2007-07-10 20:25:50 +0000 |
---|---|---|
committer | Wojciech Polak <polak@gnu.org> | 2007-07-10 20:25:50 +0000 |
commit | 270683d99c534cf13ab0f9a3976b711390103a6d (patch) | |
tree | 775c2bea9a07bd36118eeb3b4099b23a71d7e6dd /mailbox | |
parent | 63ae1355cc7e973b5f511677404c7d03997c62f5 (diff) | |
download | mailutils-270683d99c534cf13ab0f9a3976b711390103a6d.tar.gz mailutils-270683d99c534cf13ab0f9a3976b711390103a6d.tar.bz2 |
(mu_stream_vprintf)
(mu_stream_printf, mu_stream_sequential_vprintf)
(mu_stream_sequential_printf): New functions.
Diffstat (limited to 'mailbox')
-rw-r--r-- | mailbox/stream.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/mailbox/stream.c b/mailbox/stream.c index cd8720617..1b24c15ff 100644 --- a/mailbox/stream.c +++ b/mailbox/stream.c @@ -36,6 +36,7 @@ #include <stdlib.h> #include <stdio.h> #include <string.h> +#include <stdarg.h> #include <mailutils/property.h> #include <mailutils/errno.h> @@ -490,6 +491,92 @@ mu_stream_write (mu_stream_t os, const char *buf, size_t count, } int +mu_stream_vprintf (mu_stream_t os, mu_off_t *poff, const char *fmt, va_list ap) +{ + char *buf, *p; + size_t buflen = 512; + size_t n; + int done = 0; + int rc; + + buf = calloc (1, buflen); + if (buf == NULL) + return ENOMEM; + + do + { + n = vsnprintf (buf, buflen, fmt, ap); + if (n < 0 || n >= buflen || !memchr (buf, '\0', n + 1)) + { + char *newbuf; + size_t newlen = buflen * 2; + if (newlen < buflen) + { + free (buf); + return ENOMEM; + } + newbuf = realloc (buf, buflen); + if (newbuf == NULL) + { + free (buf); + return ENOMEM; + } + buflen = newlen; + buf = newbuf; + } + else + done = 1; + } + while (!done); + + p = buf; + do + { + size_t wrs; + + rc = mu_stream_write (os, p, n, *poff, &wrs); + if (rc || wrs == 0) + break; + p += wrs; + *poff += wrs; + n -= wrs; + } + while (n > 0); + free (buf); + return rc; +} + +int +mu_stream_printf (mu_stream_t os, mu_off_t *poff, const char *fmt, ...) +{ + va_list ap; + int rc; + + va_start (ap, fmt); + rc = mu_stream_vprintf (os, poff, fmt, ap); + va_end (ap); + return rc; +} + +int +mu_stream_sequential_vprintf (mu_stream_t os, const char *fmt, va_list ap) +{ + return mu_stream_vprintf (os, &os->offset, fmt, ap); +} + +int +mu_stream_sequential_printf (mu_stream_t os, const char *fmt, ...) +{ + va_list ap; + int rc; + + va_start (ap, fmt); + rc = mu_stream_sequential_vprintf (os, fmt, ap); + va_end (ap); + return rc; +} + +int mu_stream_get_transport2 (mu_stream_t stream, mu_transport_t *p1, mu_transport_t *p2) { |