[gnome-builder] auto-indent: skip past c89 comments when looking for matching brackets



commit 27c411d214ebfc2caff4132ce36d2dfc6b6e76d3
Author: Christian Hergert <christian hergert me>
Date:   Thu Oct 16 18:22:45 2014 -0700

    auto-indent: skip past c89 comments when looking for matching brackets

 src/auto-indent/gb-source-auto-indenter-c.c |   98 ++++++++++++++++-----------
 1 files changed, 58 insertions(+), 40 deletions(-)
---
diff --git a/src/auto-indent/gb-source-auto-indenter-c.c b/src/auto-indent/gb-source-auto-indenter-c.c
index 5e55082..8c7e1c7 100644
--- a/src/auto-indent/gb-source-auto-indenter-c.c
+++ b/src/auto-indent/gb-source-auto-indenter-c.c
@@ -112,6 +112,23 @@ build_indent (GbSourceAutoIndenterC *c,
 }
 
 static gboolean
+iter_ends_c89_comment (const GtkTextIter *iter)
+{
+  if (gtk_text_iter_get_char (iter) == '/')
+    {
+      GtkTextIter tmp;
+
+      tmp = *iter;
+
+      if (gtk_text_iter_backward_char (&tmp) &&
+          ('*' == gtk_text_iter_get_char (&tmp)))
+        return TRUE;
+    }
+
+  return FALSE;
+}
+
+static gboolean
 non_space_predicate (gunichar ch,
                      gpointer user_data)
 {
@@ -211,6 +228,42 @@ backward_last_word (GtkTextIter *iter,
 }
 
 static gboolean
+backward_before_c89_comment (GtkTextIter *iter)
+{
+  GtkTextIter copy;
+  GtkTextIter match_start;
+  GtkTextIter match_end;
+  gunichar ch;
+
+  gtk_text_iter_assign (&copy, iter);
+
+  while (g_unichar_isspace (gtk_text_iter_get_char (iter)))
+    if (!gtk_text_iter_backward_char (iter))
+      GOTO (cleanup);
+
+  if (!(ch = gtk_text_iter_get_char (iter)) ||
+      (ch != '/') ||
+      !gtk_text_iter_backward_char (iter) ||
+      !(ch = gtk_text_iter_get_char (iter)) ||
+      (ch != '*') ||
+      !gtk_text_iter_backward_search (iter, "/*",
+                                      GTK_TEXT_SEARCH_TEXT_ONLY,
+                                      &match_start, &match_end, NULL) ||
+      !gtk_text_iter_backward_find_char (&match_start, non_space_predicate,
+                                         NULL, NULL))
+    GOTO (cleanup);
+
+  gtk_text_iter_assign (iter, &match_start);
+
+  return TRUE;
+
+cleanup:
+  gtk_text_iter_assign (iter, &copy);
+
+  return FALSE;
+}
+
+static gboolean
 backward_find_matching_char (GtkTextIter *iter,
                              gunichar     ch)
 {
@@ -234,10 +287,6 @@ backward_find_matching_char (GtkTextIter *iter,
     break;
   }
 
-  /*
-   * TODO: Make this skip past comment blocks!
-   */
-
   gtk_text_iter_assign (&copy, iter);
 
   while (gtk_text_iter_backward_char (iter))
@@ -267,6 +316,11 @@ backward_find_matching_char (GtkTextIter *iter,
           if (strcur != cur)
             break;
         }
+      else if ((cur == '/') && iter_ends_c89_comment (iter))
+        {
+          if (!backward_before_c89_comment (iter))
+            break;
+        }
 
       if (cur == match)
         {
@@ -355,42 +409,6 @@ backward_to_line_first_char (GtkTextIter *iter)
 }
 
 static gboolean
-backward_before_c89_comment (GtkTextIter *iter)
-{
-  GtkTextIter copy;
-  GtkTextIter match_start;
-  GtkTextIter match_end;
-  gunichar ch;
-
-  gtk_text_iter_assign (&copy, iter);
-
-  while (g_unichar_isspace (gtk_text_iter_get_char (iter)))
-    if (!gtk_text_iter_backward_char (iter))
-      GOTO (cleanup);
-
-  if (!(ch = gtk_text_iter_get_char (iter)) ||
-      (ch != '/') ||
-      !gtk_text_iter_backward_char (iter) ||
-      !(ch = gtk_text_iter_get_char (iter)) ||
-      (ch != '*') ||
-      !gtk_text_iter_backward_search (iter, "/*",
-                                      GTK_TEXT_SEARCH_TEXT_ONLY,
-                                      &match_start, &match_end, NULL) ||
-      !gtk_text_iter_backward_find_char (&match_start, non_space_predicate,
-                                         NULL, NULL))
-    GOTO (cleanup);
-
-  gtk_text_iter_assign (iter, &match_start);
-
-  return TRUE;
-
-cleanup:
-  gtk_text_iter_assign (iter, &copy);
-
-  return FALSE;
-}
-
-static gboolean
 in_c89_comment (GtkTextIter *iter,
                 GtkTextIter *match_begin)
 {


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