diff options
author | jeremy <jeremy@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-01-14 06:35:01 +0000 |
---|---|---|
committer | jeremy <jeremy@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-01-14 06:35:01 +0000 |
commit | 83b6878794a51a1694157171d2ceac2c3386c5b6 (patch) | |
tree | be59a9a808f8f08a11acfdd5435be61ca1ebea72 | |
parent | e42e59d30fee9b39ff3f6b5fae75c5d88b19ae1b (diff) |
add a vasprintf replacement. Bug #839
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@2030 f38db490-d61c-443f-a65b-d21fe96a405b
-rwxr-xr-x | astmm.c | 20 | ||||
-rwxr-xr-x | include/asterisk/astmm.h | 6 |
2 files changed, 26 insertions, 0 deletions
@@ -32,6 +32,7 @@ #define FUNC_REALLOC 3 #define FUNC_STRDUP 4 #define FUNC_STRNDUP 5 +#define FUNC_VASPRINTF 6 /* Undefine all our macros */ #undef malloc @@ -40,6 +41,7 @@ #undef strdup #undef strndup #undef free +#undef vasprintf static FILE *mmlog; @@ -217,6 +219,24 @@ char *__ast_strndup(const char *s, size_t n, const char *file, int lineno, const return ptr; } +int __ast_vasprintf(char **strp, const char *fmt, va_list ap, const char *file, int lineno, const char *func) +{ + int n, size = strlen(fmt) + 1; + if ((*strp = __ast_alloc_region(size, FUNC_VASPRINTF, file, lineno, func)) == NULL) + return -1; + for (;;) { + n = vsnprintf(*strp, size, fmt, ap); + if (n > -1 && n < size) + return n; + if (n > -1) /* glibc 2.1 */ + size = n+1; + else /* glibc 2.0 */ + size *= 2; + if ((*strp = __ast_realloc(*strp, size, file, lineno, func)) == NULL) + return -1; + } +} + static int handle_show_memory(int fd, int argc, char *argv[]) { char *fn = NULL; diff --git a/include/asterisk/astmm.h b/include/asterisk/astmm.h index 83f786121..88dd5486b 100755 --- a/include/asterisk/astmm.h +++ b/include/asterisk/astmm.h @@ -21,6 +21,7 @@ #include <sys/types.h> #include <stdlib.h> #include <string.h> +#include <stdio.h> /* Undefine any macros */ #undef malloc @@ -28,6 +29,7 @@ #undef realloc #undef strdup #undef strndup +#undef vasprintf void *__ast_calloc(size_t nmemb, size_t size, const char *file, int lineno, const char *func); void *__ast_malloc(size_t size, const char *file, int lineno, const char *func); @@ -35,6 +37,7 @@ void __ast_free(void *ptr, const char *file, int lineno, const char *func); void *__ast_realloc(void *ptr, size_t size, const char *file, int lineno, const char *func); char *__ast_strdup(const char *s, const char *file, int lineno, const char *func); char *__ast_strndup(const char *s, size_t n, const char *file, int lineno, const char *func); +int __ast_vasprintf(char **strp, const char *format, va_list ap, const char *file, int lineno, const char *func); void __ast_mm_init(void); @@ -58,6 +61,9 @@ void __ast_mm_init(void); #define strndup(a,b) \ __ast_strndup(a,b,__FILE__, __LINE__, __PRETTY_FUNCTION__) +#define vasprintf(a,b,c) \ + __ast_vasprintf(a,b,c,__FILE__, __LINE__, __PRETTY_FUNCTION__) + #else #error "NEVER INCLUDE astmm.h DIRECTLY!!" #endif |