Skip to content
Snippets Groups Projects
Commit 47627840 authored by Simon McVittie's avatar Simon McVittie
Browse files

glib-backports: Add a backport of g_utf8_make_valid()

parent b54b939b
No related branches found
No related tags found
1 merge request!164Preparation for !158
......@@ -114,3 +114,9 @@ gpointer *my_g_hash_table_get_keys_as_array (GHashTable *hash,
#define G_DBUS_METHOD_INVOCATION_HANDLED TRUE
#define G_DBUS_METHOD_INVOCATION_UNHANDLED FALSE
#endif
#if !GLIB_CHECK_VERSION(2, 52, 0)
#define g_utf8_make_valid(s,l) my_g_utf8_make_valid (s, l)
gchar *my_g_utf8_make_valid (const gchar *str,
gssize len);
#endif
......@@ -510,3 +510,50 @@ my_g_hash_table_get_keys_as_array (GHashTable *hash,
return g_ptr_array_free (arr, FALSE);
}
#endif
#if !GLIB_CHECK_VERSION(2, 52, 0)
gchar *
my_g_utf8_make_valid (const gchar *str,
gssize len)
{
GString *string;
const gchar *remainder, *invalid;
gsize remaining_bytes, valid_bytes;
g_return_val_if_fail (str != NULL, NULL);
if (len < 0)
len = strlen (str);
string = NULL;
remainder = str;
remaining_bytes = len;
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_strndup (str, len);
g_string_append_len (string, remainder, remaining_bytes);
g_string_append_c (string, '\0');
g_assert (g_utf8_validate (string->str, -1, NULL));
return g_string_free (string, FALSE);
}
#endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment