Add xasprintf() and xvasprintf().
[oweals/tinc.git] / lib / xmalloc.c
index e1ab3140b79e08c5b2c0077deb564afe041b2c2d..51356e460b71b45c48d08cf9e6b3e0436b28db50 100644 (file)
@@ -22,6 +22,8 @@
 #include <sys/types.h>
 #include <stdio.h>
 #include <string.h>
+#include <stdarg.h>
+#include <errno.h>
 
 #if STDC_HEADERS
 # include <stdlib.h>
@@ -32,15 +34,7 @@ void *realloc ();
 void free ();
 #endif
 
-#if ENABLE_NLS
-# include <libintl.h>
-# define _(Text) gettext (Text)
-#else
-# define textdomain(Domain)
-# define _(Text) Text
-#endif
-#define N_(Text) Text
-
+#include "gettext.h"
 #include "xalloc.h"
 
 #ifndef EXIT_FAILURE
@@ -54,14 +48,6 @@ void *xcalloc (size_t n, size_t s);
 void *xrealloc (void *p, size_t n);
 #endif
 
-#ifndef HAVE_DONE_WORKING_MALLOC_CHECK
-#error you must run the autoconf test for a properly working malloc -- see malloc.m4
-#endif
-
-#ifndef HAVE_DONE_WORKING_REALLOC_CHECK
-#error you must run the autoconf test for a properly working realloc -- see realloc.m4
-#endif
-
 /* Exit value when the requested amount of memory is not available.
    The caller may set it to some other value.  */
 int xalloc_exit_failure = EXIT_FAILURE;
@@ -154,3 +140,21 @@ xcalloc (n, s)
 }
 
 #endif /* NOT_USED */
+
+int xasprintf(char **strp, const char *fmt, ...) {
+       int result;
+       va_list ap;
+       va_start(ap, fmt);
+       result = xvasprintf(strp, fmt, ap);
+       va_end(ap);
+       return result;
+}
+
+int xvasprintf(char **strp, const char *fmt, va_list ap) {
+       int result = vasprintf(strp, fmt, ap);
+       if(result < 0) {
+               fprintf(stderr, "vasprintf() failed: %s\n", strerror(errno));
+               exit(xalloc_exit_failure);
+       }
+       return result;
+}