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

Annotation of mandoc/compat_vasprintf.c, Revision 1.4

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

CVSweb