[gtk+] cssmatcher: Rewrite nth-child matcher



commit 59a7739fce02627e5e24b03d9e0837c8ce01aa7b
Author: Benjamin Otte <otte redhat com>
Date:   Thu May 28 17:12:57 2015 +0200

    cssmatcher: Rewrite nth-child matcher
    
    Instead of trying to be smart, be stupid but correct.
    
    Fixes nth-child reftest.

 gtk/gtkcssmatcher.c |   28 ++++++++++++----------------
 1 files changed, 12 insertions(+), 16 deletions(-)
---
diff --git a/gtk/gtkcssmatcher.c b/gtk/gtkcssmatcher.c
index c68f650..14597cc 100644
--- a/gtk/gtkcssmatcher.c
+++ b/gtk/gtkcssmatcher.c
@@ -356,27 +356,23 @@ gtk_css_matcher_node_nth_child (GtkCssNode *node,
                                 int         a,
                                 int         b)
 {
-  while (b-- > 0)
-    {
-      if (node == NULL)
-        return FALSE;
+  int pos, x;
 
-      node = prev_node_func (node);
-    }
+  /* count nodes */
+  for (pos = 0; node != NULL; pos++)
+    node = prev_node_func (node);
+
+  /* solve pos = a * X + b
+   * and return TRUE if X is integer >= 0 */
+  x = pos - b;
 
   if (a == 0)
-    return node == NULL;
-  else if (a == 1)
-    return TRUE;
+    return x == 0;
 
-  b = 0;
-  while (node)
-    {
-      b++;
-      node = prev_node_func (node);
-    }
+  if (x % a)
+    return FALSE;
 
-  return b % a == 0;
+  return x / a > 0;
 }
 
 static gboolean


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