in win_unicode.c [674:729]
int ucs4_to_ucs2_lf(const unsigned int *ucs4str, SQLLEN ilen, SQLWCHAR *ucs2str, int bufcount, BOOL lfconv)
{
int outlen = 0, i;
UCHAR *ucdt;
SQLWCHAR *sqlwdt, dmy_wchar;
UCHAR * const udt = (UCHAR *) &dmy_wchar;
unsigned int uintdt;
MYLOG(MIN_LOG_LEVEL, " ilen=" FORMAT_LEN " bufcount=%d\n", ilen, bufcount);
if (ilen < 0)
ilen = ucs4strlen(ucs4str);
for (i = 0; i < ilen && (uintdt = ucs4str[i]); i++)
{
sqlwdt = (SQLWCHAR *)&uintdt;
ucdt = (UCHAR *)&uintdt;
if (0 == sqlwdt[1])
{
if (lfconv && PG_LINEFEED == ucdt[0] &&
(i == 0 ||
PG_CARRIAGE_RETURN != *((UCHAR *)&ucs4str[i - 1]))
)
{
if (outlen < bufcount)
{
udt[0] = PG_CARRIAGE_RETURN;
udt[1] = 0;
ucs2str[outlen] = *((SQLWCHAR *) udt);
}
outlen++;
}
if (outlen < bufcount)
ucs2str[outlen] = sqlwdt[0];
outlen++;
continue;
}
sqlwdt[1]--;
udt[0] = ((0xfc & ucdt[1]) >> 2) | ((0x3 & ucdt[2]) << 6);
// printf("%02x", udt[0]);
udt[1] = SURROG1_BYTE | ((0xc & ucdt[2]) >> 2);
// printf("%02x", udt[1]);
if (outlen < bufcount)
ucs2str[outlen] = *((SQLWCHAR *)udt);
outlen++;
udt[0] = ucdt[0];
// printf("%02x", udt[0]);
udt[1] = SURROG2_BYTE | (0x3 & ucdt[1]);
// printf("%02x\n", udt[1]);
if (outlen < bufcount)
ucs2str[outlen] = *((SQLWCHAR *)udt);
outlen++;
}
if (outlen < bufcount)
ucs2str[outlen] = 0;
return outlen;
}