#include "samd51j18a.h"
#include "string.h"
#include "usb_util.h"

char digit(int d, int radix) {
    if (d < 10) {
        return d + '0';
    } else {
        return d - 10 + 'A';
    }
}

int UTIL_ltoa_radix(int64_t value, char *dest, int radix) {
    int64_t original = value;  // save original value
    char    buf[25]  = "";
    int     c        = sizeof(buf) - 1;
    int     last     = c;
    int     d;
    int     size;

    if (value < 0)  // if it's negative, take the absolute value
        value = -value;

    do  // write least significant digit of value that's left
    {
        d        = (value % radix);
        buf[--c] = digit(d, radix);
        value /= radix;
    } while (value);

    if (original < 0) buf[--c] = '-';

    size = last - c + 1;  // includes null at end
    memcpy(dest, &buf[c], last - c + 1);

    return (size - 1);  // without null termination
}

int UTIL_ltoa(int64_t value, char *dest) { return UTIL_ltoa_radix(value, dest, 10); }

int UTIL_itoa(int value, char *dest) { return UTIL_ltoa_radix((int64_t)value, dest, 10); }

int UTIL_utoa(uint32_t value, char *dest) { return UTIL_ltoa_radix((int64_t)value, dest, 10); }