LINUX.ORG.RU

История изменений

Исправление 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;
}