]> git.tuebingen.mpg.de Git - adu.git/blobdiff - string.c
Simplify and rename mmap_full_file().
[adu.git] / string.c
index 13555550efb6e1e567f66ca6f03158b79645ed7e..fb23d93b29081eb549e4112d0c60f2600c93e9ed 100644 (file)
--- a/string.c
+++ b/string.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2004-2008 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2004-2008 Andre Noll <maan@tuebingen.mpg.de>
  *
  * 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;