[gnome-builder] messages: fix recoding of \r\n in messages



commit 8c6a8313ec89d274a52e04a332c15a94b808935c
Author: Christian Hergert <chergert redhat com>
Date:   Sun Feb 28 16:31:24 2021 -0800

    messages: fix recoding of \r\n in messages

 src/plugins/messages/gbp-messages-panel.c | 48 ++++++++++++++-----------------
 1 file changed, 21 insertions(+), 27 deletions(-)
---
diff --git a/src/plugins/messages/gbp-messages-panel.c b/src/plugins/messages/gbp-messages-panel.c
index fb3438a3c..8bf63ac5b 100644
--- a/src/plugins/messages/gbp-messages-panel.c
+++ b/src/plugins/messages/gbp-messages-panel.c
@@ -38,38 +38,31 @@ struct _GbpMessagesPanel
 G_DEFINE_TYPE (GbpMessagesPanel, gbp_messages_panel, DZL_TYPE_DOCK_WIDGET)
 
 static char *
-ensure_crlf (const char *in_s)
+ensure_crlf (const char *message)
 {
   GString *s = g_string_new (NULL);
-  const char *p = in_s;
-  const char *prev_p = in_s;
 
-  g_assert (in_s != NULL);
+  g_assert (message != NULL);
 
-  while ((p = strchr (p, '\n')) != NULL)
+  for (const char *iter = message;
+       *iter;
+       iter = g_utf8_next_char (iter))
     {
-      /* This is to avoid a segfault that would occur if trying to deref in_s - 1. */
-      if (p == in_s)
-        {
-          g_string_append (s, "\r\n");
-          ++p;
-        }
-      else
+      gunichar ch = g_utf8_get_char (iter);
+
+      switch (ch)
         {
-          if (p[-1] == '\r')
-            {
-              ++p;
-              g_string_append_len (s, prev_p, (gssize)(p - prev_p));
-            }
-          else
-            {
-              g_string_append_len (s, prev_p, (gssize)(p - prev_p));
-              g_string_append (s, "\r\n");
-              ++p;
-            }
-        }
+        case '\r':
+          break;
+
+        case '\n':
+          g_string_append_len (s, "\r\n", 2);
+          break;
 
-      prev_p = p;
+        default:
+          g_string_append_unichar (s, ch);
+          break;
+        }
     }
 
   return g_string_free (s, FALSE);
@@ -88,9 +81,10 @@ gbp_messages_panel_log_cb (GbpMessagesPanel *self,
   g_assert (message != NULL);
   g_assert (IDE_IS_CONTEXT (context));
 
-  out_message = ensure_crlf (message);
+  if G_UNLIKELY (strchr (message, '\n') != NULL)
+    message = out_message = ensure_crlf (message);
 
-  vte_terminal_feed (VTE_TERMINAL (self->terminal), out_message, -1);
+  vte_terminal_feed (VTE_TERMINAL (self->terminal), message, -1);
   vte_terminal_feed (VTE_TERMINAL (self->terminal), "\r\n", 2);
   dzl_dock_item_needs_attention (DZL_DOCK_ITEM (&self->parent_instance));
   gtk_widget_show (GTK_WIDGET (self));


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]