XBPS Library API
0.19
The X Binary Package System
Main Page
Modules
Data Structures
lib
compat
vasprintf.c
1
/* $NetBSD: asprintf.c,v 1.2 2007/07/20 00:10:06 tnn Exp $ */
2
3
/*-
4
* Copyright (c) 2007 Joerg Sonnenberger <joerg@NetBSD.org>.
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
*
11
* 1. Redistributions of source code must retain the above copyright
12
* notice, this list of conditions and the following disclaimer.
13
* 2. Redistributions in binary form must reproduce the above copyright
14
* notice, this list of conditions and the following disclaimer in
15
* the documentation and/or other materials provided with the
16
* distribution.
17
*
18
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22
* COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23
* INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
24
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
28
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29
* SUCH DAMAGE.
30
*/
31
32
#include <stdio.h>
33
#include <stdlib.h>
34
#include <stdarg.h>
35
36
int
HIDDEN
37
vasprintf(
char
**ret,
const
char
*fmt, va_list ap)
38
{
39
char
*buf, *new_buf;
40
size_t
len;
41
int
retval;
42
43
len = 128;
44
buf = malloc(len);
45
if
(buf == NULL) {
46
*ret = NULL;
47
return
-1;
48
}
49
50
retval = vsnprintf(buf, len, fmt, ap);
51
if
(retval < 0) {
52
free(buf);
53
*ret = NULL;
54
return
-1;
55
}
56
57
if
(retval < len) {
58
new_buf = realloc(buf, retval + 1);
59
if
(new_buf == NULL)
60
*ret = buf;
61
else
62
*ret = new_buf;
63
return
retval;
64
}
65
66
len = (size_t)retval + 1;
67
free(buf);
68
buf = malloc(len);
69
if
(buf == NULL) {
70
*ret = NULL;
71
return
-1;
72
}
73
retval = vsnprintf(buf, len, fmt, ap);
74
if
(retval != len - 1) {
75
free(buf);
76
*ret = NULL;
77
return
-1;
78
}
79
*ret = buf;
80
return
retval;
81
}
Generated on Wed Dec 19 2012 00:58:26 for XBPS Library API by
1.8.2