From 47627840908ed07795da69036128f53ef6315441 Mon Sep 17 00:00:00 2001 From: Simon McVittie <smcv@collabora.com> Date: Tue, 27 Oct 2020 18:16:27 +0000 Subject: [PATCH] glib-backports: Add a backport of g_utf8_make_valid() Signed-off-by: Simon McVittie <smcv@collabora.com> --- steam-runtime-tools/glib-backports-internal.h | 6 +++ steam-runtime-tools/glib-backports.c | 47 +++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/steam-runtime-tools/glib-backports-internal.h b/steam-runtime-tools/glib-backports-internal.h index 805f2ef09..21420ba50 100644 --- a/steam-runtime-tools/glib-backports-internal.h +++ b/steam-runtime-tools/glib-backports-internal.h @@ -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 diff --git a/steam-runtime-tools/glib-backports.c b/steam-runtime-tools/glib-backports.c index 2d637a3e6..8b2a5103f 100644 --- a/steam-runtime-tools/glib-backports.c +++ b/steam-runtime-tools/glib-backports.c @@ -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 -- GitLab