mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-21 12:32:40 +02:00
51 lines
885 B
C
51 lines
885 B
C
#include "switch/types.h"
|
|
#include "switch/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;
|
|
}
|