[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] Changes to emacs/src/gtkutil.c,v
From: |
Jan Djärv |
Subject: |
[Emacs-diffs] Changes to emacs/src/gtkutil.c,v |
Date: |
Sat, 16 Sep 2006 17:18:04 +0000 |
CVSROOT: /cvsroot/emacs
Module name: emacs
Changes by: Jan Djärv <jhd> 06/09/16 17:18:03
Index: gtkutil.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/gtkutil.c,v
retrieving revision 1.90
retrieving revision 1.91
diff -u -b -r1.90 -r1.91
--- gtkutil.c 10 Sep 2006 12:17:19 -0000 1.90
+++ gtkutil.c 16 Sep 2006 17:18:03 -0000 1.91
@@ -507,10 +507,66 @@
{
char *utf8_str = str;
+ if (!str) return NULL;
+
/* If not UTF-8, try current locale. */
- if (str && !g_utf8_validate (str, -1, NULL))
+ if (!g_utf8_validate (str, -1, NULL))
utf8_str = g_locale_to_utf8 (str, -1, 0, 0, 0);
+ if (!utf8_str)
+ {
+ /* Probably some control characters in str. Escape them. */
+ size_t nr_bad = 0;
+ gsize bytes_read;
+ gsize bytes_written;
+ unsigned char *p = (unsigned char *)str;
+ char *cp, *up;
+ GError *error = NULL;
+
+ while (! (cp = g_locale_to_utf8 (p, -1, &bytes_read,
+ &bytes_written, &error))
+ && error->code == G_CONVERT_ERROR_ILLEGAL_SEQUENCE)
+ {
+ ++nr_bad;
+ p += bytes_written+1;
+ g_error_free (error);
+ error = NULL;
+ }
+
+ if (error)
+ {
+ g_error_free (error);
+ error = NULL;
+ }
+ if (cp) g_free (cp);
+
+ up = utf8_str = xmalloc (strlen (str) + nr_bad * 4 + 1);
+ p = str;
+
+ while (! (cp = g_locale_to_utf8 (p, -1, &bytes_read,
+ &bytes_written, &error))
+ && error->code == G_CONVERT_ERROR_ILLEGAL_SEQUENCE)
+ {
+ strncpy (up, p, bytes_written);
+ sprintf (up + bytes_written, "\\%03o", p[bytes_written]);
+ up[bytes_written+4] = '\0';
+ up += bytes_written+4;
+ p += bytes_written+1;
+ g_error_free (error);
+ error = NULL;
+ }
+
+ if (cp)
+ {
+ strcat (utf8_str, cp);
+ g_free (cp);
+ }
+ if (error)
+ {
+ g_error_free (error);
+ error = NULL;
+ }
+ }
return utf8_str;
}
- [Emacs-diffs] Changes to emacs/src/gtkutil.c,v, Jan Djärv, 2006/09/02
- [Emacs-diffs] Changes to emacs/src/gtkutil.c,v, Jan Djärv, 2006/09/04
- [Emacs-diffs] Changes to emacs/src/gtkutil.c,v, Jan Djärv, 2006/09/10
- [Emacs-diffs] Changes to emacs/src/gtkutil.c,v,
Jan Djärv <=
- [Emacs-diffs] Changes to emacs/src/gtkutil.c,v, Jan Djärv, 2006/09/16
- [Emacs-diffs] Changes to emacs/src/gtkutil.c,v, Jan Djärv, 2006/09/18
- [Emacs-diffs] Changes to emacs/src/gtkutil.c,v, Jan Djärv, 2006/09/18
- [Emacs-diffs] Changes to emacs/src/gtkutil.c,v, Jan Djärv, 2006/09/22
- [Emacs-diffs] Changes to emacs/src/gtkutil.c,v, Richard M. Stallman, 2006/09/22