Blob Blame History Raw
From ada3e0f4277028621d10d01fd6460b0dcc215f60 Mon Sep 17 00:00:00 2001
From: Christian Hergert <chergert@redhat.com>
Date: Sat, 20 Apr 2019 16:52:04 -0700
Subject: [PATCH] contextengine: clear invalid ranges if BOM is found

If we came across a BOM at the beginning of a buffer, then we will have
an invalid range before we check for BOM. In that case, we need to to
clear it before we proceed or some assertions (such as invalid range == 1)
will not be met.

Fixes #30
---
 gtksourceview/gtksourcecontextengine.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/gtksourceview/gtksourcecontextengine.c b/gtksourceview/gtksourcecontextengine.c
index f74ec78e..062cca65 100644
--- a/gtksourceview/gtksourcecontextengine.c
+++ b/gtksourceview/gtksourcecontextengine.c
@@ -5354,60 +5354,62 @@ update_syntax (GtkSourceContextEngine *ce,
 	}
 
 	gtk_text_buffer_get_iter_at_offset (buffer, &start_iter, start_offset);
 	gtk_text_buffer_get_iter_at_offset (buffer, &end_iter, end_offset);
 
 	if (!gtk_text_iter_starts_line (&start_iter))
 	{
 		gtk_text_iter_set_line_offset (&start_iter, 0);
 		start_offset = gtk_text_iter_get_offset (&start_iter);
 	}
 
 	if (!gtk_text_iter_starts_line (&end_iter))
 	{
 		gtk_text_iter_forward_line (&end_iter);
 		end_offset = gtk_text_iter_get_offset (&end_iter);
 	}
 
 	if (0 == start_offset)
 	{
 		gunichar c;
 
 		first_line = TRUE;
 
 		/* If it is the first line and it starts with BOM, skip it
 		 * since regexes in lang files do not take it into account */
 		c = gtk_text_iter_get_char (&start_iter);
 		if (IS_BOM (c))
 		{
 			gtk_text_iter_forward_char (&start_iter);
 			start_offset = gtk_text_iter_get_offset (&start_iter);
+			segment_remove (ce, invalid);
+			CHECK_TREE (ce);
 		}
 	}
 
 	/* This happens after deleting all text on last line. */
 	if (start_offset == end_offset)
 	{
 		g_assert (end_offset == gtk_text_buffer_get_char_count (buffer));
 		g_assert (g_slist_length (ce->priv->invalid) == 1);
 		segment_remove (ce, invalid);
 		CHECK_TREE (ce);
 		goto out;
 	}
 
 
 	/* Main loop */
 
 	line_start = start_iter;
 	line_start_offset = start_offset;
 	line_end = line_start;
 	gtk_text_iter_forward_line (&line_end);
 	line_end_offset = gtk_text_iter_get_offset (&line_end);
 	analyzed_end = line_end_offset;
 
 	timer = g_timer_new ();
 
 	while (TRUE)
 	{
 		LineInfo line;
 		gboolean next_line_invalid = FALSE;
 		gboolean need_invalidate_next = FALSE;
-- 
2.25.1