diff options
-rw-r--r-- | main/snprintf.c | 24 | ||||
-rw-r--r-- | main/snprintf.h | 6 |
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 |