1
0
mirror of https://github.com/weechat/weechat.git synced 2026-06-12 14:14:48 +02:00

plugins: refactor macro weechat_va_format with the same behavior as string_asprintf

This commit is contained in:
miko
2024-06-16 12:41:22 +02:00
committed by Sébastien Helleu
parent d3ca619526
commit e4e0b9764d
+22 -19
View File
@@ -203,29 +203,32 @@ enum t_weechat_hdata
/* macro to format string with variable args, using dynamic buffer size */
#define weechat_va_format(__format) \
va_list argptr; \
int vaa_size, vaa_num; \
char *vbuffer, *vaa_buffer2; \
vaa_size = 1024; \
vbuffer = malloc (vaa_size); \
if (vbuffer) \
va_list __argptr; \
int __num_bytes; \
size_t __size; \
char *vbuffer = NULL; \
\
if (__format) \
{ \
while (1) \
va_start (__argptr, __format); \
__num_bytes = vsnprintf (NULL, 0, __format, __argptr); \
va_end (__argptr); \
if (__num_bytes >= 0) \
{ \
va_start (argptr, __format); \
vaa_num = vsnprintf (vbuffer, vaa_size, __format, argptr); \
va_end (argptr); \
if ((vaa_num >= 0) && (vaa_num < vaa_size)) \
break; \
vaa_size = (vaa_num >= 0) ? vaa_num + 1 : vaa_size * 2; \
vaa_buffer2 = realloc (vbuffer, vaa_size); \
if (!vaa_buffer2) \
__size = (size_t)__num_bytes + 1; \
vbuffer = malloc(__size); \
if (vbuffer) \
{ \
free (vbuffer); \
vbuffer = NULL; \
break; \
va_start (__argptr, __format); \
__num_bytes = vsnprintf (vbuffer, __size, \
__format, __argptr); \
va_end (__argptr); \
if (__num_bytes < 0) \
{ \
free (vbuffer); \
vbuffer = NULL; \
} \
} \
vbuffer = vaa_buffer2; \
} \
}