in src/strings.c [573:645]
int STRING_sprintf(STRING_HANDLE handle, const char* format, ...)
{
int result;
#ifdef STRINGS_C_SPRINTF_BUFFER_SIZE
size_t maxBufSize = STRINGS_C_SPRINTF_BUFFER_SIZE;
char buf[STRINGS_C_SPRINTF_BUFFER_SIZE];
#else
size_t maxBufSize = 0;
char* buf = NULL;
#endif
if (handle == NULL || format == NULL)
{
/* Codes_SRS_STRING_07_042: [if the parameters s1 or format are NULL then STRING_sprintf shall return non zero value.] */
LogError("Invalid arg (NULL)");
result = MU_FAILURE;
}
else
{
va_list arg_list;
int s2Length;
va_start(arg_list, format);
va_list arg_list_clone;
va_copy(arg_list_clone, arg_list);
s2Length = vsnprintf(buf, maxBufSize, format, arg_list);
va_end(arg_list);
if (s2Length < 0)
{
/* Codes_SRS_STRING_07_043: [If any error is encountered STRING_sprintf shall return a non zero value.] */
LogError("Failure vsnprintf return < 0");
result = MU_FAILURE;
}
else if (s2Length == 0)
{
// Don't need to reallocate and nothing should be added
result = 0;
}
else
{
STRING* s1 = handle;
char* temp;
size_t s1Length = strlen(s1->s);
temp = realloc_flex(s1->s, s1Length, s2Length + (size_t)1, 1);
if (temp != NULL)
{
s1->s = temp;
if (vsnprintf(s1->s + s1Length, s1Length + s2Length + 1, format, arg_list_clone) < 0)
{
/* Codes_SRS_STRING_07_043: [If any error is encountered STRING_sprintf shall return a non zero value.] */
LogError("Failure vsnprintf formatting error");
s1->s[s1Length] = '\0';
result = MU_FAILURE;
}
else
{
/* Codes_SRS_STRING_07_044: [On success STRING_sprintf shall return 0.]*/
result = 0;
}
}
else
{
/* Codes_SRS_STRING_07_043: [If any error is encountered STRING_sprintf shall return a non zero value.] */
LogError("Failure unable to reallocate memory");
result = MU_FAILURE;
}
}
va_end(arg_list_clone);
}
return result;
}