in win_unicode.c [932:984]
SQLLEN c16tombs(char *c8dt, const char16_t *c16dt, size_t n)
{
int i;
SQLLEN result = 0;
size_t brtn;
char *cdt, c4byte[4];
mbstate_t mbst = initial_state;
MYLOG(MIN_LOG_LEVEL, " c8dt=%p size=" FORMAT_SIZE_T "u\n", c8dt, n);
if (!c8dt)
n = 0;
for (i = 0, cdt = c8dt; c16dt[i] && (result < n || (!cdt)); i++)
{
if (NULL != cdt && result + 4 < n)
brtn = c16rtomb(cdt, c16dt[i], &mbst);
else
{
brtn = c16rtomb(c4byte, c16dt[i], &mbst);
if (brtn < 5)
{
SQLLEN result_n = result + brtn;
if (result_n < n)
memcpy(cdt, c4byte, brtn);
else
{
if (cdt && n > 0)
{
c8dt[result] = '\0'; /* truncate */
return result_n;
}
}
}
}
/*
printf("c16dt=%04X brtn=%lu result=%ld cdt=%02X%02X%02X%02X\n",
c16dt[i], brtn, result, (UCHAR) cdt[0], (UCHAR) cdt[1], (UCHAR) cdt[2], (UCHAR) cdt[3]);
*/
if (brtn == (size_t) -1)
{
if (n > 0)
c8dt[n - 1] = '\0';
return -1;
}
if (cdt)
cdt += brtn;
result += brtn;
}
if (cdt)
*cdt = '\0';
return result;
}