Skip to content

Commit

Permalink
util: Add xasprintf portable asprintf variant
Browse files Browse the repository at this point in the history
Include a portable asprintf variant that works on any C99
conforming platform.

Signed-off-by: Pantelis Antoniou <pantelis.antoniou@konsulko.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
  • Loading branch information
pantoniou authored and dgibson committed May 25, 2016
1 parent beef80b commit 9dc4049
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 0 deletions.
30 changes: 30 additions & 0 deletions util.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,36 @@ char *xstrdup(const char *s)
return d;
}

/* based in part from (3) vsnprintf */
int xasprintf(char **strp, const char *fmt, ...)
{
int n, size = 128; /* start with 128 bytes */
char *p;
va_list ap;

/* initial pointer is NULL making the fist realloc to be malloc */
p = NULL;
while (1) {
p = xrealloc(p, size);

/* 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)
break;
/* 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 */
}
*strp = p;
return strlen(p);
}

char *join_path(const char *path, const char *name)
{
int lenp = strlen(path);
Expand Down
1 change: 1 addition & 0 deletions util.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ static inline void *xrealloc(void *p, size_t len)
}

extern char *xstrdup(const char *s);
extern int xasprintf(char **strp, const char *fmt, ...);
extern char *join_path(const char *path, const char *name);

/**
Expand Down

0 comments on commit 9dc4049

Please sign in to comment.