#include <stdlib.h>
#include <string.h>
#include <swis.h>
#include "error.h"
#include "globals.h"

/* implementation suggested by Stewart Brodie */
char *strdup(const char *a)
{
    if (a == NULL)
    {
        return NULL;
    }
    else
    {
        const size_t length = strlen(a) + 1;
        char *const p = malloc(length);

        if (p == NULL)
        {
            return NULL;
        }
        return memcpy(p, a, length);
    }
}

char *gstrans(const char *old)
{
    int size = 256, last;
    char *buf, *tmp;

    buf = malloc(size);

    while (_C & _swi(OS_GSTrans,
                     _INR(0,2) | _OUT(2) | _RETURN(_FLAGS),

                     old,
                     buf,
                     size,

                     &last))
    {

        size += 256;
        tmp = realloc(buf, size);
        if (!tmp)
        {
            err_fatal(&EMALLOC);
        }
        buf = tmp;
    }

    buf[last] = '\0';
    tmp = realloc(buf, last + 1);
    if (!tmp)
    {
        err_fatal(&EMALLOC);
    }

    return tmp;
}
