// Copyright 2019 Joe Drago. All rights reserved.
// SPDX-License-Identifier: BSD-2-Clause

#include "avif/internal.h"

#include <string.h>

avifResult avifRWDataRealloc(avifRWData * raw, size_t newSize)
{
    if (raw->size != newSize) {
        if (newSize == 0) {
            // avifAlloc(0) returns NULL, so handle the shrink-to-zero case by freeing the buffer.
            avifRWDataFree(raw);
            return AVIF_RESULT_OK;
        }
        uint8_t * newData = (uint8_t *)avifAlloc(newSize);
        AVIF_CHECKERR(newData, AVIF_RESULT_OUT_OF_MEMORY);
        if (raw->size) {
            memcpy(newData, raw->data, AVIF_MIN(raw->size, newSize));
        }
        avifFree(raw->data);
        raw->data = newData;
        raw->size = newSize;
    }
    return AVIF_RESULT_OK;
}

avifResult avifRWDataSet(avifRWData * raw, const uint8_t * data, size_t len)
{
    if (len) {
        AVIF_CHECKRES(avifRWDataRealloc(raw, len));
        memcpy(raw->data, data, len);
    } else {
        avifRWDataFree(raw);
    }
    return AVIF_RESULT_OK;
}

void avifRWDataFree(avifRWData * raw)
{
    avifFree(raw->data);
    raw->data = NULL;
    raw->size = 0;
}
