int BUFFER_append()

in src/buffer.c [469:521]


int BUFFER_append(BUFFER_HANDLE handle1, BUFFER_HANDLE handle2)
{
    int result;
    if ( (handle1 == NULL) || (handle2 == NULL) || (handle1 == handle2) )
    {
        /* Codes_SRS_BUFFER_07_023: [BUFFER_append shall return a nonzero upon any error that is encountered.] */
        result = MU_FAILURE;
    }
    else
    {
        BUFFER* b1 = handle1;
        BUFFER* b2 = handle2;
        if (b1->buffer == NULL)
        {
            /* Codes_SRS_BUFFER_07_023: [BUFFER_append shall return a nonzero upon any error that is encountered.] */
            result = MU_FAILURE;
        }
        else if (b2->buffer == NULL)
        {
            /* Codes_SRS_BUFFER_07_023: [BUFFER_append shall return a nonzero upon any error that is encountered.] */
            result = MU_FAILURE;
        }
        else
        {
            if (b2->size ==0)
            {
                // b2->size = 0, whatever b1->size is, do nothing
                result = 0;
            }
            else
            {
                // b2->size != 0, whatever b1->size is
                unsigned char* temp = realloc_flex(b1->buffer, b1->size, b2->size, 1);
                if (temp == NULL)
                {
                    /* Codes_SRS_BUFFER_07_023: [BUFFER_append shall return a nonzero upon any error that is encountered.] */
                    LogError("Failure in realloc_flex(b1->buffer=%p, b1->size=%zu, b2->size=%zu, 1)", b1->buffer, b1->size, b2->size);
                    result = MU_FAILURE;
                }
                else
                {
                    /* Codes_SRS_BUFFER_07_024: [BUFFER_append concatenates b2 onto b1 without modifying b2 and shall return zero on success.]*/
                    b1->buffer = temp;
                    // Append the BUFFER
                    (void)memcpy(&b1->buffer[b1->size], b2->buffer, b2->size);
                    b1->size += b2->size;
                    result = 0;
                }
            }
        }
    }
    return result;
}