libnx/nx/source/runtime/util/utf/utf16_to_utf8.c
2018-01-22 20:11:55 +01:00

50 lines
852 B
C

#include "runtime/util/utf.h"
ssize_t
utf16_to_utf8(uint8_t *out,
const uint16_t *in,
size_t len)
{
ssize_t rc = 0;
ssize_t units;
uint32_t code;
uint8_t encoded[4];
do
{
units = decode_utf16(&code, in);
if(units == -1)
return -1;
if(code > 0)
{
in += units;
units = encode_utf8(encoded, code);
if(units == -1)
return -1;
if(out != NULL)
{
if(rc + units <= len)
{
*out++ = encoded[0];
if(units > 1)
*out++ = encoded[1];
if(units > 2)
*out++ = encoded[2];
if(units > 3)
*out++ = encoded[3];
}
}
if(SSIZE_MAX - units >= rc)
rc += units;
else
return -1;
}
} while(code > 0);
return rc;
}