From 8f05c1da81e240b9d838b807f2b87bad88d8019c Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 26 Aug 2006 03:44:45 +0000 Subject: [PATCH] Fix the pthread compiler flag detection. 2006-08-25 Matthias Clasen * configure.in: Fix the pthread compiler flag detection. * glib/gunicode.h: * glib/gutf8.c (_g_utf8_make_valid): Rename make_valid_utf8 from gconvert.c, move it to gutf8.c, and export it privately. * glib/gconvert.c (g_filename_display_name): Adjust callers. * glib/gkeyfile.c: Use _g_utf8_make_valid() in a number of places to ensure error messages are valid UTF-8. (#351853, Simon Budig) --- ChangeLog | 14 ++++++++++++++ configure.in | 7 +++++++ glib/gconvert.c | 41 ++--------------------------------------- glib/gkeyfile.c | 54 +++++++++++++++++++++++++++++++++++++++++++----------- glib/gunicode.h | 5 +++++ glib/gutf8.c | 40 ++++++++++++++++++++++++++++++++++++++++ 6 files changed, 111 insertions(+), 50 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8499c10..4dd1cee 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2006-08-25 Matthias Clasen + + * configure.in: Fix the pthread compiler flag detection. + + * glib/gunicode.h: + * glib/gutf8.c (_g_utf8_make_valid): Rename make_valid_utf8 + from gconvert.c, move it to gutf8.c, and export it privately. + + * glib/gconvert.c (g_filename_display_name): Adjust callers. + + * glib/gkeyfile.c: Use _g_utf8_make_valid() in a number of + places to ensure error messages are valid UTF-8. (#351853, + Simon Budig) + 2006-08-22 Matthias Clasen * Branch for 2.12 diff --git a/configure.in b/configure.in index 0625eb5..4f78684 100644 --- a/configure.in +++ b/configure.in @@ -856,6 +856,12 @@ AC_MSG_RESULT(unsigned $glib_size_type) # Check for some functions AC_CHECK_FUNCS(lstat strerror strsignal memmove vsnprintf stpcpy strcasecmp strncasecmp poll getcwd nanosleep vasprintf setenv unsetenv getc_unlocked readlink symlink) +AC_CHECK_FUNCS(clock_gettime, [], [ + AC_CHECK_LIB(rt, clock_gettime, [ + AC_DEFINE(HAVE_CLOCK_GETTIME, 1) + LIBS="$LIBS -lrt" + ]) +]) AC_CHECK_HEADERS(crt_externs.h) AC_CHECK_FUNCS(_NSGetEnviron) @@ -1539,6 +1545,7 @@ dnl dnl Test program for basic POSIX threads functionality dnl m4_define([glib_thread_test],[ +#include #include int check_me = 0; void* func(void* data) {check_me = 42; return &check_me;} diff --git a/glib/gconvert.c b/glib/gconvert.c index 3f562d1..c5e4f50 100644 --- a/glib/gconvert.c +++ b/glib/gconvert.c @@ -31,6 +31,7 @@ #include "glib.h" #include "gprintfint.h" #include "gthreadprivate.h" +#include "gunicode.h" #ifdef G_PLATFORM_WIN32 #define STRICT @@ -1972,44 +1973,6 @@ g_uri_list_extract_uris (const gchar *uri_list) return result; } -static gchar * -make_valid_utf8 (const gchar *name) -{ - GString *string; - const gchar *remainder, *invalid; - gint remaining_bytes, valid_bytes; - - string = NULL; - remainder = name; - remaining_bytes = strlen (name); - - while (remaining_bytes != 0) - { - if (g_utf8_validate (remainder, remaining_bytes, &invalid)) - break; - valid_bytes = invalid - remainder; - - if (string == NULL) - string = g_string_sized_new (remaining_bytes); - - g_string_append_len (string, remainder, valid_bytes); - /* append U+FFFD REPLACEMENT CHARACTER */ - g_string_append (string, "\357\277\275"); - - remaining_bytes -= valid_bytes + 1; - remainder = invalid + 1; - } - - if (string == NULL) - return g_strdup (name); - - g_string_append (string, remainder); - - g_assert (g_utf8_validate (string->str, -1, NULL)); - - return g_string_free (string, FALSE); -} - /** * g_filename_display_basename: * @filename: an absolute pathname in the GLib file name encoding @@ -2110,7 +2073,7 @@ g_filename_display_name (const gchar *filename) * by a question mark */ if (!display_name) - display_name = make_valid_utf8 (filename); + display_name = _g_utf8_make_valid (filename); return display_name; } diff --git a/glib/gkeyfile.c b/glib/gkeyfile.c index ef05dd0..3ab7823 100644 --- a/glib/gkeyfile.c +++ b/glib/gkeyfile.c @@ -690,10 +690,14 @@ g_key_file_parse_line (GKeyFile *key_file, &parse_error); else { + gchar *line_utf8 = _g_utf8_make_valid (line); g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_PARSE, _("Key file contains line '%s' which is not " - "a key-value pair, group, or comment"), line); + "a key-value pair, group, or comment"), + line_utf8); + g_free (line_utf8); + return; } @@ -801,9 +805,12 @@ g_key_file_parse_key_value_pair (GKeyFile *key_file, { if (g_ascii_strcasecmp (value, "UTF-8") != 0) { + gchar *value_utf8 = _g_utf8_make_valid (value); g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_UNKNOWN_ENCODING, - _("Key file contains unsupported encoding '%s'"), value); + _("Key file contains unsupported " + "encoding '%s'"), value_utf8); + g_free (value_utf8); g_free (key); g_free (value); @@ -1280,11 +1287,14 @@ g_key_file_get_string (GKeyFile *key_file, if (!g_utf8_validate (value, -1, NULL)) { + gchar *value_utf8 = _g_utf8_make_valid (value); g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_UNKNOWN_ENCODING, _("Key file contains key '%s' with value '%s' " - "which is not UTF-8"), key, value); + "which is not UTF-8"), key, value_utf8); + g_free (value_utf8); g_free (value); + return NULL; } @@ -1389,11 +1399,14 @@ g_key_file_get_string_list (GKeyFile *key_file, if (!g_utf8_validate (value, -1, NULL)) { + gchar *value_utf8 = _g_utf8_make_valid (value); g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_UNKNOWN_ENCODING, _("Key file contains key '%s' with value '%s' " - "which is not UTF-8"), key, value); + "which is not UTF-8"), key, value_utf8); + g_free (value_utf8); g_free (value); + return NULL; } @@ -1587,7 +1600,7 @@ g_key_file_get_locale_string (GKeyFile *key_file, candidate_key, NULL); g_free (candidate_key); - if (translated_value && g_utf8_validate (translated_value, -1, NULL)) + if (translated_value) break; g_free (translated_value); @@ -3432,19 +3445,27 @@ g_key_file_parse_value_as_integer (GKeyFile *key_file, if (*value == '\0' || *end_of_valid_int != '\0') { + gchar *value_utf8 = _g_utf8_make_valid (value); g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE, - _("Value '%s' cannot be interpreted as a number."), value); + _("Value '%s' cannot be interpreted " + "as a number."), value_utf8); + g_free (value_utf8); + return 0; } int_value = long_value; if (int_value != long_value || errno == ERANGE) { + gchar *value_utf8 = _g_utf8_make_valid (value); g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE, - _("Integer value '%s' out of range"), value); + _("Integer value '%s' out of range"), + value_utf8); + g_free (value_utf8); + return 0; } @@ -3470,9 +3491,15 @@ g_key_file_parse_value_as_double (GKeyFile *key_file, double_value = g_ascii_strtod (value, &end_of_valid_d); if (*end_of_valid_d != '\0' || end_of_valid_d == value) - g_set_error (error, G_KEY_FILE_ERROR, - G_KEY_FILE_ERROR_INVALID_VALUE, - _("Value '%s' cannot be interpreted as a float number."), value); + { + gchar *value_utf8 = _g_utf8_make_valid (value); + g_set_error (error, G_KEY_FILE_ERROR, + G_KEY_FILE_ERROR_INVALID_VALUE, + _("Value '%s' cannot be interpreted " + "as a float number."), + value_utf8); + g_free (value_utf8); + } return double_value; } @@ -3482,6 +3509,8 @@ g_key_file_parse_value_as_boolean (GKeyFile *key_file, const gchar *value, GError **error) { + gchar *value_utf8; + if (value) { if (strcmp (value, "true") == 0 || strcmp (value, "1") == 0) @@ -3490,9 +3519,12 @@ g_key_file_parse_value_as_boolean (GKeyFile *key_file, return FALSE; } + value_utf8 = _g_utf8_make_valid (value); g_set_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_INVALID_VALUE, - _("Value '%s' cannot be interpreted as a boolean."), value); + _("Value '%s' cannot be interpreted " + "as a boolean."), value_utf8); + g_free (value_utf8); return FALSE; } diff --git a/glib/gunicode.h b/glib/gunicode.h index 35e2d1d..a358dc1 100644 --- a/glib/gunicode.h +++ b/glib/gunicode.h @@ -292,6 +292,11 @@ gchar *g_utf8_collate_key_for_filename (const gchar *str, gboolean g_unichar_get_mirror_char (gunichar ch, gunichar *mirrored_ch); +/* private */ + +gchar *_g_utf8_make_valid (const gchar *name); + + G_END_DECLS #endif /* __G_UNICODE_H__ */ diff --git a/glib/gutf8.c b/glib/gutf8.c index e9c70c7..84d3552 100644 --- a/glib/gutf8.c +++ b/glib/gutf8.c @@ -1799,5 +1799,45 @@ g_utf8_strreverse (const gchar *str, return result; } + +gchar * +_g_utf8_make_valid (const gchar *name) +{ + GString *string; + const gchar *remainder, *invalid; + gint remaining_bytes, valid_bytes; + + string = NULL; + remainder = name; + remaining_bytes = strlen (name); + + while (remaining_bytes != 0) + { + if (g_utf8_validate (remainder, remaining_bytes, &invalid)) + break; + valid_bytes = invalid - remainder; + + if (string == NULL) + string = g_string_sized_new (remaining_bytes); + + g_string_append_len (string, remainder, valid_bytes); + /* append U+FFFD REPLACEMENT CHARACTER */ + g_string_append (string, "\357\277\275"); + + remaining_bytes -= valid_bytes + 1; + remainder = invalid + 1; + } + + if (string == NULL) + return g_strdup (name); + + g_string_append (string, remainder); + + g_assert (g_utf8_validate (string->str, -1, NULL)); + + return g_string_free (string, FALSE); +} + + #define __G_UTF8_C__ #include "galiasdef.c" -- 2.7.4