aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJan Djärv2006-09-16 17:18:03 +0000
committerJan Djärv2006-09-16 17:18:03 +0000
commit241ad3cab7ffbeaf83e724f639750714af60b192 (patch)
tree3b5833206d50530b1f9b3efa3adb8229ed5a9bea /src
parentb984fed926ff00c7468acc0f6f4b0fc1ad6c72be (diff)
downloademacs-241ad3cab7ffbeaf83e724f639750714af60b192.tar.gz
emacs-241ad3cab7ffbeaf83e724f639750714af60b192.zip
* gtkutil.c (get_utf8_string): Try harder to convert to UTF8. Gtk+
will simply crash if we fail.
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog5
-rw-r--r--src/gtkutil.c58
2 files changed, 62 insertions, 1 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index f1c5996121b..1a6f6edeb33 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,8 @@
12006-09-16 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
2
3 * gtkutil.c (get_utf8_string): Try harder to convert to UTF8. Gtk+
4 will simply crash if we fail.
5
12006-09-16 Richard Stallman <rms@gnu.org> 62006-09-16 Richard Stallman <rms@gnu.org>
2 7
3 * regex.c (re_compile_pattern): Set gl_state.current_syntax_table. 8 * regex.c (re_compile_pattern): Set gl_state.current_syntax_table.
diff --git a/src/gtkutil.c b/src/gtkutil.c
index cf6caafa942..35c2cc0ba18 100644
--- a/src/gtkutil.c
+++ b/src/gtkutil.c
@@ -507,10 +507,66 @@ get_utf8_string (str)
507{ 507{
508 char *utf8_str = str; 508 char *utf8_str = str;
509 509
510 if (!str) return NULL;
511
510 /* If not UTF-8, try current locale. */ 512 /* If not UTF-8, try current locale. */
511 if (str && !g_utf8_validate (str, -1, NULL)) 513 if (!g_utf8_validate (str, -1, NULL))
512 utf8_str = g_locale_to_utf8 (str, -1, 0, 0, 0); 514 utf8_str = g_locale_to_utf8 (str, -1, 0, 0, 0);
513 515
516 if (!utf8_str)
517 {
518 /* Probably some control characters in str. Escape them. */
519 size_t nr_bad = 0;
520 gsize bytes_read;
521 gsize bytes_written;
522 unsigned char *p = (unsigned char *)str;
523 char *cp, *up;
524 GError *error = NULL;
525
526 while (! (cp = g_locale_to_utf8 (p, -1, &bytes_read,
527 &bytes_written, &error))
528 && error->code == G_CONVERT_ERROR_ILLEGAL_SEQUENCE)
529 {
530 ++nr_bad;
531 p += bytes_written+1;
532 g_error_free (error);
533 error = NULL;
534 }
535
536 if (error)
537 {
538 g_error_free (error);
539 error = NULL;
540 }
541 if (cp) g_free (cp);
542
543 up = utf8_str = xmalloc (strlen (str) + nr_bad * 4 + 1);
544 p = str;
545
546 while (! (cp = g_locale_to_utf8 (p, -1, &bytes_read,
547 &bytes_written, &error))
548 && error->code == G_CONVERT_ERROR_ILLEGAL_SEQUENCE)
549 {
550 strncpy (up, p, bytes_written);
551 sprintf (up + bytes_written, "\\%03o", p[bytes_written]);
552 up[bytes_written+4] = '\0';
553 up += bytes_written+4;
554 p += bytes_written+1;
555 g_error_free (error);
556 error = NULL;
557 }
558
559 if (cp)
560 {
561 strcat (utf8_str, cp);
562 g_free (cp);
563 }
564 if (error)
565 {
566 g_error_free (error);
567 error = NULL;
568 }
569 }
514 return utf8_str; 570 return utf8_str;
515} 571}
516 572