vasprintf.c - vx32 - Local 9vx git repository for patches.
 (HTM) git clone git://r-36.net/vx32
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       vasprintf.c (2422B)
       ---
            1 /*        $OpenBSD: vasprintf.c,v 1.5 1998/08/14 21:39:41 deraadt Exp $        */
            2 
            3 /*
            4  * Copyright (c) 1997 Todd C. Miller <Todd.Miller@courtesan.com>
            5  * All rights reserved.
            6  *
            7  * Redistribution and use in source and binary forms, with or without
            8  * modification, are permitted provided that the following conditions
            9  * are met:
           10  * 1. Redistributions of source code must retain the above copyright
           11  *    notice, this list of conditions and the following disclaimer.
           12  * 2. Redistributions in binary form must reproduce the above copyright
           13  *    notice, this list of conditions and the following disclaimer in the
           14  *    documentation and/or other materials provided with the distribution.
           15  * 3. The name of the author may not be used to endorse or promote products
           16  *    derived from this software without specific prior written permission.
           17  *
           18  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
           19  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
           20  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
           21  * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
           22  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
           23  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
           24  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
           25  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
           26  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
           27  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
           28  */
           29 
           30 #if defined(LIBC_SCCS) && !defined(lint)
           31 static char rcsid[] = "$OpenBSD: vasprintf.c,v 1.5 1998/08/14 21:39:41 deraadt Exp $";
           32 #endif /* LIBC_SCCS and not lint */
           33 
           34 #include <stdio.h>
           35 #include <stdlib.h>
           36 #include <errno.h>
           37 
           38 int
           39 vasprintf(str, fmt, ap)
           40         char **str;
           41         const char *fmt;
           42         _BSD_VA_LIST_ ap;
           43 {
           44         int ret;
           45         FILE f;
           46         unsigned char *_base;
           47 
           48         f._file = -1;
           49         f._flags = __SWR | __SSTR | __SALC;
           50         f._bf._base = f._p = (unsigned char *)malloc(128);
           51         if (f._bf._base == NULL) {
           52                 *str = NULL;
           53                 errno = ENOMEM;
           54                 return (-1);
           55         }
           56         f._bf._size = f._w = 127;                /* Leave room for the NULL */
           57         ret = vfprintf(&f, fmt, ap);
           58         *f._p = '\0';
           59         _base = realloc(f._bf._base, f._bf._size + 1);
           60         if (_base == NULL) {
           61                 if (f._bf._base)
           62                         free(f._bf._base);
           63                 f._bf._base = NULL;
           64                 errno = ENOMEM;
           65                 ret = -1;
           66         }
           67         f._bf._base = _base;
           68         *str = (char *)f._bf._base;
           69         return (ret);
           70 }