asprintf.c - vx32 - Local 9vx git repository for patches.
 (HTM) git clone git://r-36.net/vx32
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       asprintf.c (2574B)
       ---
            1 /*        $OpenBSD: asprintf.c,v 1.5 1998/08/14 21:39:39 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: asprintf.c,v 1.5 1998/08/14 21:39:39 deraadt Exp $";
           32 #endif /* LIBC_SCCS and not lint */
           33 
           34 #include <stdio.h>
           35 #include <stdlib.h>
           36 #include <errno.h>
           37 #if __STDC__
           38 #include <stdarg.h>
           39 #else
           40 #include <varargs.h>
           41 #endif
           42 
           43 int
           44 #if __STDC__
           45 asprintf(char **str, char const *fmt, ...)
           46 #else
           47 asprintf(str, fmt, va_alist)
           48         char **str;
           49         const char *fmt;
           50         va_dcl
           51 #endif
           52 {
           53         int ret;
           54         va_list ap;
           55         FILE f;
           56         unsigned char *_base;
           57 
           58 #if __STDC__
           59         va_start(ap, fmt);
           60 #else
           61         va_start(ap);
           62 #endif
           63         f._file = -1;
           64         f._flags = __SWR | __SSTR | __SALC;
           65         f._bf._base = f._p = (unsigned char *)malloc(128);
           66         if (f._bf._base == NULL) {
           67                 *str = NULL;
           68                 errno = ENOMEM;
           69                 return (-1);
           70         }
           71         f._bf._size = f._w = 127;                /* Leave room for the NULL */
           72         ret = vfprintf(&f, fmt, ap);
           73         *f._p = '\0';
           74         va_end(ap);
           75         _base = realloc(f._bf._base, f._bf._size + 1);
           76         if (_base == NULL) {
           77                 errno = ENOMEM;
           78                 ret = -1;
           79         }
           80         f._bf._base = _base;
           81         *str = (char *)f._bf._base;
           82         return (ret);
           83 }