[gnome-builder] messages: fix recoding of \r\n in messages
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder] messages: fix recoding of \r\n in messages
- Date: Mon, 1 Mar 2021 00:31:30 +0000 (UTC)
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]