From: hanwen Date: Mon, 9 May 2005 09:19:52 +0000 (+0000) Subject: (LY_DEFINE): hand-convert utf8 to 32 X-Git-Tag: release/2.5.32^2~245 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=89ac036a0f64970b47536ff7262990cadb47791f;p=lilypond.git (LY_DEFINE): hand-convert utf8 to 32 bits. Patch by Matthias Neeracher. --- diff --git a/ChangeLog b/ChangeLog index 6118eea170..f94a1b5712 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2005-05-09 Han-Wen Nienhuys + + * lily/general-scheme.cc (LY_DEFINE): hand-convert utf8 to 32 + bits. Patch by Matthias Neeracher. + 2005-05-09 Mats Bengtsson * scripts/convert-ly.py: In the conversion to version 1.9.0, diff --git a/lily/general-scheme.cc b/lily/general-scheme.cc index 7b9233fd10..ffe6875d63 100644 --- a/lily/general-scheme.cc +++ b/lily/general-scheme.cc @@ -12,11 +12,6 @@ #include /* isinf */ #include #include /* memset */ -#if HAVE_UTF8_WCHAR_H -#include /* wcrtomb */ -#else -#include /* wcrtomb */ -#endif #include "international.hh" #include "libc-extension.hh" @@ -249,17 +244,29 @@ LY_DEFINE (ly_wchar_to_utf_8, "ly:wide-char->utf-8", 1, 0, 0, (SCM wc), "Encode the Unicode codepoint @var{wc} as UTF-8") { - char buf[100]; + char buf[5]; SCM_ASSERT_TYPE (scm_is_integer (wc), wc, SCM_ARG1, __FUNCTION__, "integer"); - wchar_t wide_char = (wchar_t) scm_to_int (wc); - - mbstate_t state; - memset (&state, '\0', sizeof (state)); - memset (buf, '\0', sizeof (buf)); + unsigned wide_char = (unsigned) scm_to_int (wc); + char * p = buf; + + if (wide_char < 0x0080) { + *p++ = (char)wide_char; + } else if (wide_char < 0x0800) { + *p++ = (char)(((wide_char >> 6) ) | 0xC0); + *p++ = (char)(((wide_char ) & 0x3F) | 0x80); + } else if (wide_char < 0x10000) { + *p++ = (char)(((wide_char >> 12) ) | 0xE0); + *p++ = (char)(((wide_char >> 6) & 0x3F) | 0x80); + *p++ = (char)(((wide_char ) & 0x3F) | 0x80); + } else { + *p++ = (char)(((wide_char >> 18) ) | 0xF0); + *p++ = (char)(((wide_char >> 12) & 0x3F) | 0x80); + *p++ = (char)(((wide_char >> 6) & 0x3F) | 0x80); + *p++ = (char)(((wide_char ) & 0x3F) | 0x80); + } + *p = 0; - wcrtomb (buf, wide_char, &state); - return scm_makfrom0str (buf); }