[BACK]Return to compat_vasprintf.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Annotation of mandoc/compat_vasprintf.c, Revision 1.3

1.1       schwarze    1: #include "config.h"
                      2:
                      3: #if HAVE_VASPRINTF
                      4:
                      5: int dummy;
                      6:
                      7: #else
                      8:
1.3     ! schwarze    9: /*     $Id: compat_vasprintf.c,v 1.2 2015/03/20 15:25:12 schwarze Exp $        */
1.1       schwarze   10: /*
                     11:  * Copyright (c) 2015 Ingo Schwarze <schwarze@openbsd.org>
                     12:  *
                     13:  * Permission to use, copy, modify, and distribute this software for any
                     14:  * purpose with or without fee is hereby granted, provided that the above
                     15:  * copyright notice and this permission notice appear in all copies.
                     16:  *
                     17:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
                     18:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
                     19:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
                     20:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
                     21:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
                     22:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
                     23:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
                     24:  *
                     25:  * This fallback implementation is not efficient:
                     26:  * It does the formatting twice.
                     27:  * Short of fiddling with the unknown internals of the system's
                     28:  * printf(3) or completely reimplementing printf(3), i can't think
                     29:  * of another portable solution.
                     30:  */
                     31:
                     32: #include <stdarg.h>
                     33: #include <stdio.h>
                     34: #include <stdlib.h>
                     35:
                     36: int
                     37: vasprintf(char **ret, const char *format, va_list ap)
                     38: {
                     39:        char     buf[2];
1.2       schwarze   40:        va_list  ap2;
1.1       schwarze   41:        int      sz;
                     42:
1.2       schwarze   43:        va_copy(ap2, ap);
                     44:        sz = vsnprintf(buf, sizeof(buf), format, ap2);
                     45:        va_end(ap2);
                     46:
                     47:        if (sz != -1 && (*ret = malloc(sz + 1)) != NULL) {
1.1       schwarze   48:                if (vsnprintf(*ret, sz + 1, format, ap) == sz)
1.3     ! schwarze   49:                        return sz;
1.1       schwarze   50:                free(*ret);
                     51:        }
                     52:        *ret = NULL;
1.3     ! schwarze   53:        return -1;
1.1       schwarze   54: }
                     55:
                     56: #endif

CVSweb