diff options
Diffstat (limited to 'scripts/dtc/util.c')
| -rw-r--r-- | scripts/dtc/util.c | 30 | 
1 files changed, 30 insertions, 0 deletions
diff --git a/scripts/dtc/util.c b/scripts/dtc/util.c index fb124eea4919..3550f86bd6df 100644 --- a/scripts/dtc/util.c +++ b/scripts/dtc/util.c @@ -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);  | 
