summaryrefslogtreecommitdiffstats
path: root/lib/Utils/xfuncs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Utils/xfuncs.cpp')
-rw-r--r--lib/Utils/xfuncs.cpp45
1 files changed, 19 insertions, 26 deletions
diff --git a/lib/Utils/xfuncs.cpp b/lib/Utils/xfuncs.cpp
index 583171f..b1941f7 100644
--- a/lib/Utils/xfuncs.cpp
+++ b/lib/Utils/xfuncs.cpp
@@ -141,28 +141,22 @@ off_t xlseek(int fd, off_t offset, int whence)
return off;
}
-// Die with an error message if we can't malloc() enough space and do an
-// sprintf() into that space.
-char* xasprintf(const char *format, ...)
+char* xvasprintf(const char *format, va_list p)
{
- va_list p;
int r;
char *string_ptr;
#if 1
// GNU extension
- va_start(p, format);
r = vasprintf(&string_ptr, format, p);
- va_end(p);
#else
// Bloat for systems that haven't got the GNU extension.
- va_start(p, format);
+ va_list p2;
r = vsnprintf(NULL, 0, format, p);
- va_end(p);
+ va_copy(p2, p);
string_ptr = xmalloc(r+1);
- va_start(p, format);
- r = vsnprintf(string_ptr, r+1, format, p);
- va_end(p);
+ r = vsnprintf(string_ptr, r+1, format, p2);
+ va_end(p2);
#endif
if (r < 0)
@@ -170,30 +164,29 @@ char* xasprintf(const char *format, ...)
return string_ptr;
}
-std::string ssprintf(const char *format, ...)
+// Die with an error message if we can't malloc() enough space and do an
+// sprintf() into that space.
+char* xasprintf(const char *format, ...)
{
va_list p;
- int r;
char *string_ptr;
-#if 1
- // GNU extension
- va_start(p, format);
- r = vasprintf(&string_ptr, format, p);
- va_end(p);
-#else
- // Bloat for systems that haven't got the GNU extension.
va_start(p, format);
- r = vsnprintf(NULL, 0, format, p);
+ string_ptr = xvasprintf(format, p);
va_end(p);
- string_ptr = xmalloc(r+1);
+
+ return string_ptr;
+}
+
+std::string ssprintf(const char *format, ...)
+{
+ va_list p;
+ char *string_ptr;
+
va_start(p, format);
- r = vsnprintf(string_ptr, r+1, format, p);
+ string_ptr = xvasprintf(format, p);
va_end(p);
-#endif
- if (r < 0)
- die_out_of_memory();
std::string res = string_ptr;
free(string_ptr);
return res;