История изменений
Исправление Archer73, (текущая версия) :
В итоге сделал так.
#define _GNU_SOURCE
#include <stdio.h>
...
cl_String *StringCreateF(const char *format, ...){
va_list argptr1;
cl_String *result = malloc(sizeof(cl_String));
va_start(argptr1, format);
#ifdef __GNUC__
result->length = vasprintf(&result->str, format, argptr1);
if(result->length < 0){
free(result);
va_end(argptr1);
return NULL;
}
#else
va_list argptr2;
va_copy(argptr2, argptr1);
result->length = vsnprintf(NULL, 0, format, argptr1);
if(result->length < 0){
perror("StringCreateF ERROR");
errno = 0;
free(result);
va_end(argptr1);
va_end(argptr2);
return NULL;
}
result->str = malloc(result->length + 1);
vsnprintf(result->str, result->length + 1, format, argptr2);
va_end(argptr2);
#endif
va_end(argptr1);
return result;
}
Исходная версия Archer73, :
В итоге сделал так.
#define _GNU_SOURCE
#include <stdio.h>
...
cl_String *StringCreateF(const char *format, ...){
va_list argptr1;
cl_String *result = malloc(sizeof(cl_String));
va_start(argptr1, format);
#ifdef __GNUC__
result->length = vasprintf(&result->str, format, argptr1);
if(result->length < 0){
free(result);
va_end(argptr1);
return NULL;
}
#else
va_list argptr2;
va_copy(argptr2, argptr1);
result->length = vsnprintf(NULL, 0, format, argptr1);
if(result->length < 0){
perror("StringCreateF ERROR");
errno = 0;
free(result);
va_end(argptr1);
va_end(argptr2);
return NULL;
}
result->str = malloc(result->length + 1);
vsnprintf(result->str, result->length + 1, format, argptr2);
va_end(argptr2);
#endif
va_end(argptr1);
return result;
}