vasprintf的实现
有些系统,例如AIX,没有vasprintf和asprintf ,如果是做porting,有时需要写一个简单的代替。
代码如下:
1 #if !defined(HAVE_VASPRINTF) 2 #if defined(WINDOWS) 3 int 4 vasprintf (char **ptr, const char *format, va_list ap) 5 { 6 int len; 7 8 len = _vscprintf_p (format, ap) + 1; 9 *ptr = (char *) malloc (len * sizeof (char)); 10 if (!*ptr) 11 { 12 return -1; 13 } 14 15 return _vsprintf_p (*ptr, len, format, ap); 16 } 17 #else 18 int 19 vasprintf (char **ptr, const char *format, va_list ap) 20 { 21 va_list ap_copy; 22 23 /* Make sure it is determinate, despite manuals indicating otherwise */ 24 *ptr = 0; 25 26 va_copy(ap_copy, ap); 27 int count = vsnprintf(NULL, 0, format, ap); 28 if (count >= 0) 29 { 30 char* buffer = malloc(count + 1); 31 if (buffer != NULL) 32 { 33 count = vsnprintf(buffer, count + 1, format, ap_copy); 34 if (count < 0) 35 free(buffer); 36 else 37 *ptr = buffer; 38 } 39 } 40 va_end(ap_copy); 41 42 return count; 43 44 } 45 #endif 46 #endif /* !HAVE_VASPRINTF */ 47 48 #if !defined(HAVE_ASPRINTF) 49 int 50 asprintf (char **ptr, const char *format, ...) 51 { 52 va_list ap; 53 int ret; 54 55 *ptr = NULL; 56 57 va_start (ap, format); 58 ret = vasprintf (ptr, format, ap); 59 va_end (ap); 60 61 return ret; 62 } 63 #endif /* !HAVE_ASPRINTF */
下面是一个完整的例子:
1 #include <stdio.h> 2 #include <stdarg.h> 3 #include <stdlib.h> 4 #include <string.h> 5 6 int 7 myvasprintf (char **ptr, const char *format, va_list ap) 8 { 9 va_list ap_copy; 10 11 /* Make sure it is determinate, despite manuals indicating otherwise */ 12 *ptr = 0; 13 14 va_copy(ap_copy, ap); 15 int count = vsnprintf(NULL, 0, format, ap); 16 if (count >= 0) 17 { 18 char* buffer = malloc(count + 1); 19 if (buffer != NULL) 20 { 21 count = vsnprintf(buffer, count + 1, format, ap_copy); 22 if (count < 0) 23 free(buffer); 24 else 25 *ptr = buffer; 26 } 27 } 28 va_end(ap_copy); 29 30 return count; 31 32 } 33 34 void 35 print_warning (char **buffer, const char *fmt, ...) 36 { 37 va_list ap; 38 va_start (ap, fmt); 39 myvasprintf (buffer, fmt, ap); 40 va_end (ap); 41 } 42 43 int main() 44 { 45 char *buffer; 46 int a = 99999; 47 int b = 9; 48 print_warning(&buffer, "hello, world, %d * %d = %d, %s\n", a, b, a * b, "finished!!" ); 49 50 printf(buffer); 51 return 0; 52 }
上述代码的执行结果如下:
hello, world, 99999 * 9 = 899991, finished!!