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