diff options
Diffstat (limited to 'Utilities/cmcurl/lib/mprintf.c')
-rw-r--r-- | Utilities/cmcurl/lib/mprintf.c | 57 |
1 files changed, 34 insertions, 23 deletions
diff --git a/Utilities/cmcurl/lib/mprintf.c b/Utilities/cmcurl/lib/mprintf.c index 80735be..c681248 100644 --- a/Utilities/cmcurl/lib/mprintf.c +++ b/Utilities/cmcurl/lib/mprintf.c @@ -9,7 +9,7 @@ * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms - * are also available at https://curl.haxx.se/docs/copyright.html. + * are also available at https://curl.se/docs/copyright.html. * * You may opt to use, copy, modify, merge, publish, distribute and/or sell * copies of the Software, and permit persons to whom the Software is @@ -99,12 +99,12 @@ static const char lower_digits[] = "0123456789abcdefghijklmnopqrstuvwxyz"; /* Upper-case digits. */ static const char upper_digits[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; -#define OUTCHAR(x) \ - do{ \ +#define OUTCHAR(x) \ + do { \ if(stream((unsigned char)(x), (FILE *)data) != -1) \ - done++; \ - else \ - return done; /* return immediately on failure */ \ + done++; \ + else \ + return done; /* return immediately on failure */ \ } while(0) /* Data type to read from the arglist */ @@ -169,7 +169,7 @@ struct nsprintf { }; struct asprintf { - struct dynbuf b; + struct dynbuf *b; bool fail; /* if an alloc has failed and thus the output is not the complete data */ }; @@ -878,7 +878,7 @@ static int dprintf_formatf( OUTCHAR(' '); for(point = strnil; *point != '\0'; ++point) OUTCHAR(*point); - if(! (p->flags & FLAGS_LEFT)) + if(!(p->flags & FLAGS_LEFT)) while(width-- > 0) OUTCHAR(' '); } @@ -1042,50 +1042,61 @@ static int alloc_addbyter(int output, FILE *data) struct asprintf *infop = (struct asprintf *)data; unsigned char outc = (unsigned char)output; - if(Curl_dyn_addn(&infop->b, &outc, 1)) { + if(Curl_dyn_addn(infop->b, &outc, 1)) { infop->fail = 1; return -1; /* fail */ } return outc; /* fputc() returns like this on success */ } -char *curl_maprintf(const char *format, ...) +extern int Curl_dyn_vprintf(struct dynbuf *dyn, + const char *format, va_list ap_save); + +/* appends the formatted string, returns 0 on success, 1 on error */ +int Curl_dyn_vprintf(struct dynbuf *dyn, const char *format, va_list ap_save) { - va_list ap_save; /* argument pointer */ int retcode; struct asprintf info; - Curl_dyn_init(&info.b, DYN_APRINTF); + info.b = dyn; info.fail = 0; - va_start(ap_save, format); retcode = dprintf_formatf(&info, alloc_addbyter, format, ap_save); - va_end(ap_save); if((-1 == retcode) || info.fail) { - Curl_dyn_free(&info.b); - return NULL; + Curl_dyn_free(info.b); + return 1; } - if(Curl_dyn_len(&info.b)) - return Curl_dyn_ptr(&info.b); - return strdup(""); + return 0; } char *curl_mvaprintf(const char *format, va_list ap_save) { int retcode; struct asprintf info; - Curl_dyn_init(&info.b, DYN_APRINTF); + struct dynbuf dyn; + info.b = &dyn; + Curl_dyn_init(info.b, DYN_APRINTF); info.fail = 0; retcode = dprintf_formatf(&info, alloc_addbyter, format, ap_save); if((-1 == retcode) || info.fail) { - Curl_dyn_free(&info.b); + Curl_dyn_free(info.b); return NULL; } - if(Curl_dyn_len(&info.b)) - return Curl_dyn_ptr(&info.b); + if(Curl_dyn_len(info.b)) + return Curl_dyn_ptr(info.b); return strdup(""); } +char *curl_maprintf(const char *format, ...) +{ + va_list ap_save; + char *s; + va_start(ap_save, format); + s = curl_mvaprintf(format, ap_save); + va_end(ap_save); + return s; +} + static int storebuffer(int output, FILE *data) { char **buffer = (char **)data; |