int BUFFER_prepend()

in src/buffer.c [523:579]


int BUFFER_prepend(BUFFER_HANDLE handle1, BUFFER_HANDLE handle2)
{
    int result;
    if ((handle1 == NULL) || (handle2 == NULL) || (handle1 == handle2))
    {
        /* Codes_SRS_BUFFER_01_005: [ BUFFER_prepend shall return a non-zero upon value any error that is encountered. ]*/
        result = MU_FAILURE;
    }
    else
    {
        BUFFER* b1 = handle1;
        BUFFER* b2 = handle2;
        if (b1->buffer == NULL)
        {
            /* Codes_SRS_BUFFER_01_005: [ BUFFER_prepend shall return a non-zero upon value any error that is encountered. ]*/
            result = MU_FAILURE;
        }
        else if (b2->buffer == NULL)
        {
            /* Codes_SRS_BUFFER_01_005: [ BUFFER_prepend shall return a non-zero upon value any error that is encountered. ]*/
            result = MU_FAILURE;
        }
        else
        {
            //put b2 ahead of b1: [b2][b1], return b1
            if (b2->size ==0)
            {
                // do nothing
                result = 0;
            }
            else
            {
                // b2->size != 0
                unsigned char* temp = malloc_flex(b1->size, b2->size, 1);
                if (temp == NULL)
                {
                    /* Codes_SRS_BUFFER_01_005: [ BUFFER_prepend shall return a non-zero upon value any error that is encountered. ]*/
                    LogError("failure in malloc_flex(b1->size=%zu, b2->size=%zu, 1);", b1->size, b2->size);
                    result = MU_FAILURE;
                }
                else
                {
                    /* Codes_SRS_BUFFER_01_004: [ BUFFER_prepend concatenates handle1 onto handle2 without modifying handle1 and shall return zero on success. ]*/
                    // Append the BUFFER
                    (void)memcpy(temp, b2->buffer, b2->size);
                    // start from b1->size to append b1
                    (void)memcpy(&temp[b2->size], b1->buffer, b1->size);
                    free(b1->buffer);
                    b1->buffer = temp;
                    b1->size += b2->size;
                    result = 0;
                }
            }
        }
    }
    return result;
}