Testing strings utils.



#include <stdlib.h>
#include <assert.h>
#include  <errno.h>
#include  <string.h>

static inline errno_t  wstr_reserve(wchar_t** pptext,
                                    size_t* capacity,
                                    size_t new_capacity)
{
    assert(pptext && capacity);
    assert(new_capacity > 0);

    if (new_capacity < *capacity)
    {
        return 0;
    }

    errno_t r = ENOMEM;
    wchar_t* ptemp = 0;

    if (*pptext == NULL)
    {
        ptemp = (wchar_t*)malloc(sizeof(wchar_t) * (new_capacity));
        if (ptemp)
        {
            ptemp[0] = '\0';
        }
    }
    else
    {
        ptemp = (wchar_t*)realloc(*pptext, sizeof(wchar_t) * (new_capacity));
    }

    if (ptemp)
    {
        *pptext = ptemp;
        *capacity = new_capacity;
        r = 0;
    }

    return r;
}

errno_t wstr_append(wchar_t **pptext,
                    size_t* capacity,
                    size_t* size,
                    const wchar_t* psource)
{
    errno_t r = 0;
    size_t s = wcslen(psource);
    r = wstr_reserve(pptext, capacity, *size + s + 1);
    if (r == 0)
    {
        r = wcscpy_s(*pptext + *size, *capacity - *size, psource);
        if (r == 0)
        {
            *size += s;
        }
    }
    return r;
}

errno_t wstr_set(wchar_t **pptext,
                 size_t* capacity,
                 size_t* size,
                 const wchar_t* psource)
{
    errno_t r = 0;
    size_t s = wcslen(psource);
    r = wstr_reserve(pptext, capacity, s + 1);
    if (r == 0)
    {
        r = wcscpy_s(*pptext, *capacity, psource);
        if (r == 0)
        {
            *size = s;
        }
    }
    return r;
}

void wstr_clear(wchar_t **pptext,
                size_t* size)
{
    (*pptext)[0] = 0;
    *size = 0;
}

void wstr_destroy(wchar_t **pptext,
                  size_t* capacity,
                  size_t* size)
{
    free(*pptext);
    *capacity = 0;
    *size = 0;
}

int main(int argc, char* argv[])
{
    wchar_t *ptext = 0;
    size_t capacity = 0;
    size_t size = 0;

    wstr_append(&ptext, &capacity, &size, L"teste");
    wstr_append(&ptext, &capacity, &size, L"2");
    wstr_set(&ptext, &capacity, &size, L"b");
    wstr_clear(&ptext, &size);
    wstr_destroy(&ptext, &capacity, &size);


    return 0;
}