#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;
}