diff options
| author | Jan Djärv | 2006-09-16 17:18:03 +0000 |
|---|---|---|
| committer | Jan Djärv | 2006-09-16 17:18:03 +0000 |
| commit | 241ad3cab7ffbeaf83e724f639750714af60b192 (patch) | |
| tree | 3b5833206d50530b1f9b3efa3adb8229ed5a9bea /src | |
| parent | b984fed926ff00c7468acc0f6f4b0fc1ad6c72be (diff) | |
| download | emacs-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/ChangeLog | 5 | ||||
| -rw-r--r-- | src/gtkutil.c | 58 |
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 @@ | |||
| 1 | 2006-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 | |||
| 1 | 2006-09-16 Richard Stallman <rms@gnu.org> | 6 | 2006-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 | ||