int STRING_sprintf()

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;
}