1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <stdarg.h>
4 
5 #ifndef HAVE_VASPRINTF
6 /* Workaround for the lack of vasprintf()
7  * As found on: http://unixpapa.com/incnote/stdio.html
8  * Seems to be Public Domain
9  */
10 int
vasprintf(char ** ret,const char * format,va_list ap)11 vasprintf(char **ret, const char *format, va_list ap)
12 {
13 	va_list ap2;
14 	int len = 100;        /* First guess at the size */
15 	if ((*ret = (char *) malloc(len)) == NULL)
16 	{
17 		return -1;
18 	}
19 	while (1)
20 	{
21 		int nchar;
22 		va_copy(ap2, ap);
23 		nchar= vsnprintf(*ret, len, format, ap2);
24 		if (nchar > -1 && nchar < len)
25 		{
26 			return nchar;
27 		}
28 		if (nchar > len)
29 		{
30 			len= nchar+1;
31 		} else
32 		{
33 			len*= 2;
34 		}
35 		if ((*ret = (char *) realloc(*ret, len)) == NULL)
36 		{
37 			free(*ret);
38 			return -1;
39 		}
40 	}
41 }
42 #endif
43 
44