tThe GTK+2 client now checks all strings on startup to ensure that they are valid UTF-8. If running in a non-UTF8 locale, the strings are converted from the locale's charset; if running in a UTF8 locale, invalid strings are truncated at the first invalid character. - vaccinewars - be a doctor and try to vaccinate the world
(HTM) git clone git://src.adamsgaard.dk/vaccinewars
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
(DIR) commit d16c72301fc42e813bc8500815d96ec6f4f23a48
(DIR) parent 8c3a199c9f24b70a92eb4ca83b5499d25840d45e
(HTM) Author: Ben Webb <ben@salilab.org>
Date: Mon, 29 Apr 2002 10:32:28 +0000
The GTK+2 client now checks all strings on startup to ensure that they are
valid UTF-8. If running in a non-UTF8 locale, the strings are converted
from the locale's charset; if running in a UTF8 locale, invalid strings
are truncated at the first invalid character.
Diffstat:
M src/gui_client/gtk_client.c | 59 +++++++++++++++++++++++++++++++
1 file changed, 59 insertions(+), 0 deletions(-)
---
(DIR) diff --git a/src/gui_client/gtk_client.c b/src/gui_client/gtk_client.c
t@@ -2106,6 +2106,63 @@ static void SetIcon(GtkWidget *window, gchar **xpmdata)
#endif
}
+#ifdef HAVE_GLIB2
+/*
+ * Converts a single string from the locale's codeset (e.g. ISO-8859-1)
+ * to UTF8. (If the locale codeset is already UTF8, and the string is
+ * invalid, truncate it at the first invalid character.)
+ */
+static void ConvertString(gchar **str)
+{
+ gchar *utf8str;
+ const gchar *end;
+
+ if (str && *str && **str) {
+ if (g_get_charset(NULL)) {
+ if (!g_utf8_validate(*str, strlen(*str), &end) && end) {
+ *((gchar *)end) = '\0';
+ }
+ } else {
+ utf8str = g_locale_to_utf8(*str, strlen(*str), NULL, NULL, NULL);
+ if (utf8str) {
+ AssignName(str, utf8str);
+ g_free(utf8str);
+ }
+ }
+ }
+}
+
+/*
+ * Converts all configuration file strings from the locale's encoding to
+ * UTF-8. This is a bit of a hack, as ideally all strings would be in
+ * UTF-8 anyway, but we need to support old GTK+1 and curses builds,
+ * which are not Unicode-aware. (N.B. As the default location names, etc.
+ * are set before bind_text_domain_codeset is called
+ */
+static void ConvertToUTF8(void)
+{
+ int i, j;
+ struct GLOBALS *gvar;
+
+ for (i = 0; i < NUMGLOB; i++) {
+ gvar = &Globals[i];
+ if (gvar->StringVal) {
+ if (gvar->StructListPt) {
+ for (j = 1; j <= *gvar->MaxIndex; j++) {
+ ConvertString(GetGlobalString(i, j));
+ }
+ } else {
+ ConvertString(GetGlobalString(i, 0));
+ }
+ } else if (gvar->StringList) {
+ for (j = 0; j < *gvar->MaxIndex; j++) {
+ ConvertString((*gvar->StringList) + j);
+ }
+ }
+ }
+}
+#endif
+
static void make_tags(GtkTextView *textview)
{
#ifdef HAVE_GLIB2
t@@ -2146,6 +2203,8 @@ gboolean GtkLoop(int *argc, char **argv[], gboolean ReturnOnFail)
/* GTK+2 expects all strings to be UTF-8, so we force gettext to return
* all translations in this encoding here. */
bind_textdomain_codeset(PACKAGE, "UTF-8");
+
+ ConvertToUTF8();
#endif
/* Set up message handlers */