X-Git-Url: http://git.tuebingen.mpg.de/?p=adu.git;a=blobdiff_plain;f=string.c;h=fb23d93b29081eb549e4112d0c60f2600c93e9ed;hp=13555550efb6e1e567f66ca6f03158b79645ed7e;hb=560d397a66ba141f18e13557feae78ca94a25f98;hpb=1136bdfc82272850474eacba37cf87d01f6a1b7f diff --git a/string.c b/string.c index 1355555..fb23d93 100644 --- a/string.c +++ b/string.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2008 Andre Noll + * Copyright (C) 2004-2008 Andre Noll * * Licensed under the GPL v2. For licencing details see COPYING. */ @@ -123,10 +123,28 @@ __must_check __malloc char *adu_strdup(const char *s) */ __must_check __printf_1_2 __malloc char *make_message(const char *fmt, ...) { - char *msg; + char *p; + int n; + size_t size = 100; - VSPRINTF(fmt, msg); - return msg; + p = adu_malloc(size); + while (1) { + va_list ap; + /* 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 */ + p = adu_realloc(p, size); + } + return p; } /** @@ -202,16 +220,16 @@ __must_check int atoi64(const char *str, int64_t *result) * \param argv_ptr Pointer to the list of substrings. * \param delim Delimiter. * - * This function modifies \a args by replacing each occurance of \a delim by + * This function modifies \a args by replacing each occurrence of \a delim by * zero. A \p NULL terminated array of pointers to char* is allocated dynamically * and these pointers are initialized to point to the broken-up substrings * within \a args. A pointer to this array is returned via \a argv_ptr. * * \return The number of substrings found in \a args. */ -__must_check unsigned split_args(char *args, char *** const argv_ptr, const char *delim) +unsigned split_args(char *args, char *** const argv_ptr, const char *delim) { - char *p = args; + char *p; char **argv; size_t n = 0, i, j;