[Thunar-workers] CVS: design/analysis/mime dump-globs-by-type.c, 1.2, 1.3

Benedikt Meurer benny at xfce.org
Sun Mar 27 21:42:42 CEST 2005


Update of /var/cvs/thunar/design/analysis/mime
In directory espresso.foo-projects.org:/tmp/cvs-serv21241/mime

Modified Files:
	dump-globs-by-type.c 
Log Message:
2005-03-27	Benedikt Meurer <benny at xfce.org>

	* mime/dump-globs-by-type.c: Use only patterns in the form '*.ext' as
	  simple patterns, the other '*ext' patterns are considered complex
	  patterns. This allows for easier tree lookup.
	* mime/dump-globs-by-type.c: Print the number of required tree nodes
	  for the simple patterns.




Index: dump-globs-by-type.c
===================================================================
RCS file: /var/cvs/thunar/design/analysis/mime/dump-globs-by-type.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- dump-globs-by-type.c	7 Mar 2005 00:37:45 -0000	1.2
+++ dump-globs-by-type.c	27 Mar 2005 19:42:40 -0000	1.3
@@ -103,13 +103,21 @@
       *p++ = '\0';
 
       /* determine the pattern type */
-      pattern_type = (*p == '*') ? PATTERN_SIMPLE : PATTERN_LITERAL;
+      if (p[0] == '*' && p[1] == '.')
+        pattern_type = PATTERN_SIMPLE;
+      else if (*p == '*' || *p == '?' || *p == '[' || *p == '\\')
+        pattern_type = PATTERN_COMPLEX;
+      else
+        pattern_type = PATTERN_LITERAL;
       for (pattern = p, ++p; !isspace (*p) && *p != '\0'; ++p)
-        if (*p == '*' || *p == '?' || *p == ']')
+        if (*p == '*' || *p == '?' || *p == '[' || *p == '\\')
           pattern_type = PATTERN_COMPLEX;
 
       *p = '\0';
 
+      if (pattern_type == PATTERN_SIMPLE)
+        pattern += 2;
+
       /* check if this pattern is already listed for our type */
       for (lp = loader->parsed_patterns[pattern_type]; lp != NULL; lp = lp->next)
         {
@@ -130,13 +138,21 @@
 
 
 static gint
-ppcmp (gconstpointer a, gconstpointer b)
+ppcmp_length (gconstpointer a, gconstpointer b)
 {
   return strlen (((struct ParsedPattern *) b)->pattern)
        - strlen (((struct ParsedPattern *) a)->pattern);
 }
 
 
+static gint
+ppcmp_string (gconstpointer a, gconstpointer b)
+{
+  return strcmp (((struct ParsedPattern *) a)->pattern,
+                 ((struct ParsedPattern *) b)->pattern);
+}
+
+
 static void
 globs_loader_init (GlobsLoader *loader)
 {
@@ -153,8 +169,9 @@
     globs_loader_parse_file (loader, files[n]);
   g_strfreev (files);
 
-  for (n = 0; n < NUM_PATTERNS; ++n)
-    loader->parsed_patterns[n] = g_slist_sort (loader->parsed_patterns[n], ppcmp);
+  loader->parsed_patterns[PATTERN_LITERAL] = g_slist_sort (loader->parsed_patterns[PATTERN_LITERAL], ppcmp_length);
+  loader->parsed_patterns[PATTERN_SIMPLE] = g_slist_sort (loader->parsed_patterns[PATTERN_SIMPLE], ppcmp_string);
+  loader->parsed_patterns[PATTERN_COMPLEX] = g_slist_sort (loader->parsed_patterns[PATTERN_COMPLEX], ppcmp_length);
 }
 
 
@@ -179,6 +196,25 @@
       g_print ("\n");
     }
 
+  guint count_nodes = 0;
+  const gchar *previous_pattern = "";
+  for (lp = loader.parsed_patterns[PATTERN_SIMPLE]; lp != NULL; lp = lp->next)
+    {
+      pp = lp->data;
+
+      int length = strlen (pp->pattern);
+
+      int i;
+      for (i = 0; pp->pattern[i] != '\0' && pp->pattern[i] == previous_pattern[i]; ++i)
+        ;
+
+      count_nodes += length - i;
+
+      previous_pattern = pp->pattern;
+    }
+
+  g_print ("Number of nodes for Simple Patterns: %d (%d Bytes)\n\n", count_nodes, count_nodes * 16);
+
   return 0;
 }
 




More information about the Thunar-workers mailing list