summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main/snprintf.c24
-rw-r--r--main/snprintf.h6
2 files changed, 30 insertions, 0 deletions
diff --git a/main/snprintf.c b/main/snprintf.c
index 81998cf970..dbe7b10023 100644
--- a/main/snprintf.c
+++ b/main/snprintf.c
@@ -1268,6 +1268,30 @@ PHPAPI int ap_php_vsnprintf(char *buf, size_t len, const char *format, va_list a
}
/* }}} */
+PHPAPI int ap_php_vasprintf(char **buf, const char *format, va_list ap) /* {{{ */
+{
+ va_list ap2;
+ int cc;
+
+ va_copy(ap2, ap);
+ cc = ap_php_vsnprintf(NULL, 0, format, ap2);
+ va_end(ap2);
+
+ *buf = NULL;
+
+ if (cc >= 0) {
+ if ((*buf = emalloc(++cc)) != NULL) {
+ if ((cc = ap_php_vsnprintf(*buf, cc, format, ap)) < 0) {
+ efree(*buf);
+ *buf = NULL;
+ }
+ }
+ }
+
+ return cc;
+}
+/* }}} */
+
/*
* Local variables:
* tab-width: 4
diff --git a/main/snprintf.h b/main/snprintf.h
index 3ba50259ff..c55d5cb35a 100644
--- a/main/snprintf.h
+++ b/main/snprintf.h
@@ -82,6 +82,7 @@ PHPAPI int ap_php_slprintf(char *buf, size_t len, const char *format,...);
PHPAPI int ap_php_vslprintf(char *buf, size_t len, const char *format, va_list ap);
PHPAPI int ap_php_snprintf(char *, size_t, const char *, ...);
PHPAPI int ap_php_vsnprintf(char *, size_t, const char *, va_list ap);
+PHPAPI int ap_php_vasprintf(char **buf, const char *format, va_list ap);
PHPAPI int php_sprintf (char* s, const char* format, ...) PHP_ATTRIBUTE_FORMAT(printf, 2, 3);
PHPAPI char * php_gcvt(double value, int ndigit, char dec_point, char exponent, char *buf);
PHPAPI char * php_conv_fp(register char format, register double num,
@@ -109,6 +110,11 @@ END_EXTERN_C()
#endif
#define vsnprintf ap_php_vsnprintf
+#ifdef vasprintf
+#undef vasprintf
+#endif
+#define vasprintf ap_php_vasprintf
+
#ifdef sprintf
#undef sprintf
#endif