1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
|
#include "config.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#ifndef HAVE_ASPRINTF
int asprintf(char **sptr, const char *fmt, ...)
{
// Guess we need no more than 100 bytes.
int n, size = 64;
char *p;
va_list ap;
if ((p = malloc (size)) == NULL)
{
*sptr=0;
return -1;
}
while (1)
{
// Try to print in the allocated space.
va_start(ap, fmt);
n = vsnprintf (p, size, fmt, ap);
va_end(ap);
// If that worked, return the string.
if (n > -1 && n < size)
{
*sptr=p;
return n;
}
// Else try again with more space.
if (n > -1) // glibc 2.1
size = n+1; // precisely what is needed
else // glibc 2.0
size *= 2; // twice the old size
if ((p = realloc (p, size)) == NULL)
{
*sptr=0;
return -1;
}
}
}
int vasprintf(char **sptr, const char *fmt, va_list ap)
{
// Guess we need no more than 100 bytes.
int n, size = 64;
char *p;
if ((p = malloc (size)) == NULL)
{
*sptr=0;
return -1;
}
while (1)
{
// Try to print in the allocated space.
n = vsnprintf (p, size, fmt, ap);
// If that worked, return the string.
if (n > -1 && n < size)
{
*sptr=p;
return n;
}
// Else try again with more space.
if (n > -1) // glibc 2.1
size = n+1; // precisely what is needed
else // glibc 2.0
size *= 2; // twice the old size
if ((p = realloc (p, size)) == NULL)
{
*sptr=0;
return -1;
}
}
}
#endif
|