CVSROOT:        /cvsroot/lilypond
Module name:    lilypond
Branch:         
Changes by:     Han-Wen Nienhuys <[EMAIL PROTECTED]>    05/05/09 09:19:52

Modified files:
        .              : ChangeLog 
        lily           : general-scheme.cc 

Log message:
        (LY_DEFINE): hand-convert utf8 to 32
        bits. Patch by Matthias Neeracher.

CVSWeb URLs:
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/ChangeLog.diff?tr1=1.3576&tr2=1.3577&r1=text&r2=text
http://savannah.gnu.org/cgi-bin/viewcvs/lilypond/lilypond/lily/general-scheme.cc.diff?tr1=1.18&tr2=1.19&r1=text&r2=text

Patches:
Index: lilypond/ChangeLog
diff -u lilypond/ChangeLog:1.3576 lilypond/ChangeLog:1.3577
--- lilypond/ChangeLog:1.3576   Mon May  9 08:41:15 2005
+++ lilypond/ChangeLog  Mon May  9 09:19:51 2005
@@ -1,3 +1,8 @@
+2005-05-09  Han-Wen Nienhuys  <[EMAIL PROTECTED]>
+
+       * lily/general-scheme.cc (LY_DEFINE): hand-convert utf8 to 32
+       bits. Patch by Matthias Neeracher.
+
 2005-05-09  Mats Bengtsson  <[EMAIL PROTECTED]>
 
        * scripts/convert-ly.py: In the conversion to version 1.9.0, 
Index: lilypond/lily/general-scheme.cc
diff -u lilypond/lily/general-scheme.cc:1.18 
lilypond/lily/general-scheme.cc:1.19
--- lilypond/lily/general-scheme.cc:1.18        Mon May  2 12:39:28 2005
+++ lilypond/lily/general-scheme.cc     Mon May  9 09:19:52 2005
@@ -12,11 +12,6 @@
 #include <math.h>  /* isinf */
 #include <stdio.h>
 #include <string.h>  /* memset */
-#if HAVE_UTF8_WCHAR_H
-#include <utf8/wchar.h>  /* wcrtomb */
-#else
-#include <wchar.h> /* wcrtomb */
-#endif
 
 #include "international.hh"
 #include "libc-extension.hh"
@@ -249,17 +244,29 @@
           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);
+  unsigned wide_char = (unsigned) scm_to_int (wc);
+  char * p = buf;
 
-  mbstate_t state;
-  memset (&state, '\0', sizeof (state));
-  memset (buf, '\0', sizeof (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);
 }
          


_______________________________________________
Lilypond-cvs mailing list
Lilypond-cvs@gnu.org
http://lists.gnu.org/mailman/listinfo/lilypond-cvs

Reply via email to