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