Added [v]asprintf()
authorMichael Brown <mcb30@etherboot.org>
Sun, 3 Jun 2007 01:50:03 +0000 (01:50 +0000)
committerMichael Brown <mcb30@etherboot.org>
Sun, 3 Jun 2007 01:50:03 +0000 (01:50 +0000)
src/core/asprintf.c [new file with mode: 0644]
src/include/stdio.h

diff --git a/src/core/asprintf.c b/src/core/asprintf.c
new file mode 100644 (file)
index 0000000..94d7e7c
--- /dev/null
@@ -0,0 +1,47 @@
+#include <stdint.h>
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+
+/**
+ * Write a formatted string to newly allocated memory.
+ *
+ * @v strp             Pointer to hold allocated string
+ * @v fmt              Format string
+ * @v args             Arguments corresponding to the format string
+ * @ret        len             Length of formatted string
+ */
+int vasprintf ( char **strp, const char *fmt, va_list args ) {
+       size_t len;
+       va_list args_tmp;
+
+       /* Calculate length needed for string */
+       va_copy ( args_tmp, args );
+       len = ( vsnprintf ( NULL, 0, fmt, args_tmp ) + 1 );
+       va_end ( args_tmp );
+
+       /* Allocate and fill string */
+       *strp = malloc ( len );
+       if ( ! *strp )
+               return -ENOMEM;
+       return vsnprintf ( *strp, len, fmt, args );
+}
+
+/**
+ * Write a formatted string to newly allocated memory.
+ *
+ * @v strp             Pointer to hold allocated string
+ * @v fmt              Format string
+ * @v ...              Arguments corresponding to the format string
+ * @ret        len             Length of formatted string
+ */
+int asprintf ( char **strp, const char *fmt, ... ) {
+       va_list args;
+       int len;
+
+       va_start ( args, fmt );
+       len = vasprintf ( strp, fmt, args );
+       va_end ( args );
+       return len;
+}
index 169cfd9..82077e2 100644 (file)
@@ -10,10 +10,15 @@ printf ( const char *fmt, ... );
 extern int __attribute__ (( format ( printf, 3, 4 ) ))
 snprintf ( char *buf, size_t size, const char *fmt, ... );
 
+extern int __attribute__ (( format ( printf, 2, 3 ) ))
+asprintf ( char **strp, const char *fmt, ... );
+
 extern int vprintf ( const char *fmt, va_list args );
 
 extern int vsnprintf ( char *buf, size_t size, const char *fmt, va_list args );
 
+extern int vasprintf ( char **strp, const char *fmt, va_list args );
+
 /**
  * Write a formatted string to a buffer
  *