From cf41cc2ec21d67fefb0a0e362312b7f0dd18f720 Mon Sep 17 00:00:00 2001 From: Jeremy McNamara <jj@nufone.net> Date: Wed, 14 Jan 2004 06:35:01 +0000 Subject: [PATCH] add a vasprintf replacement. Bug #839 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@2030 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- astmm.c | 20 ++++++++++++++++++++ include/asterisk/astmm.h | 6 ++++++ 2 files changed, 26 insertions(+) diff --git a/astmm.c b/astmm.c index 4d6d3023f7..6e507aaacf 100755 --- a/astmm.c +++ b/astmm.c @@ -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 83f7861217..88dd5486b3 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 -- GitLab