convert Unicode glyphs to multibyte sequences.
Added multibyte_strlen to calculate string lengths correctly when dealing with multibyte strings.
git-svn-id: https://crawl-ref.svn.sourceforge.net/svnroot/crawl-ref/trunk@1560 c06c8d41-db1a-0410-9941-cceddc491573
CVC5FFFLGVRR3KPYDNB6RF4FNACV3LI3HPSR4MCUNZ4C3FSQYBDAC
PL6I2CMSTHY5ZHWVMIQE5YTM5S5VPKBNZM6QJVHZSSKOJGIJ5W4AC
X3RDT655FEYO6XEVPIUAPEPJZAFE55KZBH2AZOLK3NGHINMVIGFQC
77H4BWWPPGLM3PLZH4QTAJRXIZTSDVNCOKZE223I437FN2UJ34RQC
K2CS6TCX2NDVL2ASEHGP4J4K4IJ6FP3ANNKTSIWVG43HPYSBX6ZQC
RPOZZWKG5GLPHVZZ7ZKMKS64ZMV2LDCQSARBJFJ6FZOTOKCQO7FAC
7NDXS36TE7QVXTXJWMYSVG5UHCCLPIO4VL6NXFGTDK3ZNKE3A2IAC
XRZPPYWPWUOM4SFNI6BHKH2UKJQNLKOV6Y7XIEPEZXE5QYRT26PAC
6HQB2N6N75R2RGKJFWRUN7WAC2PNGWQFXTII5DTRLTHZ2BOTMTVAC
ID2OZJTHFXL74RVUCS3JCMDQEUHAXCQFZU7235VU6IEVAAUWD2FAC
GCIZIUXO5TYROKDUYB3HAY7H7MRDTJNM7HR7DGSH7KXDIZC2LCDAC
YRY2TC3VHOYE47M23UJGUWDGF7H7WGU7WLWI4SUNM4EDNTGUPHGAC
ODNAIEJW732NG7USKQKCIP4R4DAEYXXJQX6LY7TIN32NKE75454QC
std::string stringize_glyph(unsigned glyph)
{
if (crawl_state.glyph2strfn)
return (*crawl_state.glyph2strfn)(glyph);
return std::string(1, glyph);
}
int multibyte_strlen(const std::string &s)
{
if (crawl_state.multibyte_strlen)
return (*crawl_state.multibyte_strlen)(s);
return (s.length());
}
#ifdef UNICODE_GLYPHS
static std::string unix_glyph2string(unsigned gly)
{
char buf[50]; // Overkill, I know.
wchar_t wcbuf[2];
wcbuf[0] = gly;
wcbuf[1] = 0;
if (wcstombs(buf, wcbuf, sizeof buf) != (size_t) -1)
return (buf);
return std::string(1, gly);
}
static int unix_multibyte_strlen(const std::string &s)
{
const char *cs = s.c_str();
size_t len = mbsrtowcs(NULL, &cs, 0, NULL);
return (len == (size_t) -1? s.length() : len);
}
#endif