SF.net SVN: geany: [2544] branches/custom-filetypes

ntrel at users.sourceforge.net ntrel at xxxxx
Thu May 1 14:30:25 UTC 2008


Revision: 2544
          http://geany.svn.sourceforge.net/geany/?rev=2544&view=rev
Author:   ntrel
Date:     2008-05-01 07:30:20 -0700 (Thu, 01 May 2008)

Log Message:
-----------
Add filetypes_find() that calls a predicate function for each
filetype in filetypes_hash until TRUE is returned.
Make filetypes_detect_from_extension() work for all filetypes
in filetypes_hash.

Modified Paths:
--------------
    branches/custom-filetypes/ChangeLog
    branches/custom-filetypes/src/filetypes.c
    branches/custom-filetypes/src/filetypes.h

Modified: branches/custom-filetypes/ChangeLog
===================================================================
--- branches/custom-filetypes/ChangeLog	2008-05-01 12:10:46 UTC (rev 2543)
+++ branches/custom-filetypes/ChangeLog	2008-05-01 14:30:20 UTC (rev 2544)
@@ -3,6 +3,11 @@
  * src/plugindata.h, src/keyfile.c, src/filetypes.c, src/filetypes.h:
    Store filetype::name instead of unique ID when saving sessions.
    Remove all filetype UID code.
+ * src/filetypes.c, src/filetypes.h:
+   Add filetypes_find() that calls a predicate function for each
+   filetype in filetypes_hash until TRUE is returned.
+   Make filetypes_detect_from_extension() work for all filetypes
+   in filetypes_hash.
 
 
 2008-04-29  Nick Treleaven  <nick(dot)treleaven(at)btinternet(dot)com>

Modified: branches/custom-filetypes/src/filetypes.c
===================================================================
--- branches/custom-filetypes/src/filetypes.c	2008-05-01 12:10:46 UTC (rev 2543)
+++ branches/custom-filetypes/src/filetypes.c	2008-05-01 14:30:20 UTC (rev 2544)
@@ -508,38 +508,53 @@
 }
 
 
+static gboolean match_basename(G_GNUC_UNUSED const gchar *ft_name, filetype *ft,
+		gpointer user_data)
+{
+	gboolean ret = FALSE;
+	const gchar *base_filename = user_data;
+	gint j;
+
+	/* Don't match '*' because it comes before any custom filetypes */
+	if (ft->id == GEANY_FILETYPES_ALL)
+		return FALSE;
+
+	for (j = 0; ft->pattern[j] != NULL; j++)
+	{
+		GPatternSpec *pattern = g_pattern_spec_new(ft->pattern[j]);
+
+		if (g_pattern_match_string(pattern, base_filename))
+		{
+			ret = TRUE;
+			g_pattern_spec_free(pattern);
+			break;
+		}
+		g_pattern_spec_free(pattern);
+	}
+	return ret;
+}
+
+
 /* Detect filetype only based on the filename extension.
  * utf8_filename can include the full path. */
 filetype *filetypes_detect_from_extension(const gchar *utf8_filename)
 {
-	GPatternSpec *pattern;
 	gchar *base_filename;
-	gint i, j;
+	filetype *ft;
 
-	/* to match against the basename of the file(because of Makefile*) */
+	/* to match against the basename of the file (because of Makefile*) */
 	base_filename = g_path_get_basename(utf8_filename);
 #ifdef G_OS_WIN32
 	/* use lower case basename */
 	setptr(base_filename, g_utf8_strdown(base_filename, -1));
 #endif
 
-	for(i = 0; i < GEANY_MAX_FILE_TYPES; i++)
-	{
-		for (j = 0; filetypes[i]->pattern[j] != NULL; j++)
-		{
-			pattern = g_pattern_spec_new(filetypes[i]->pattern[j]);
-			if (g_pattern_match_string(pattern, base_filename))
-			{
-				g_free(base_filename);
-				g_pattern_spec_free(pattern);
-				return filetypes[i];
-			}
-			g_pattern_spec_free(pattern);
-		}
-	}
+	ft = filetypes_find(match_basename, base_filename);
+	if (ft == NULL)
+		ft = filetypes[GEANY_FILETYPES_ALL];
 
 	g_free(base_filename);
-	return filetypes[GEANY_FILETYPES_ALL];
+	return ft;
 }
 
 
@@ -1018,3 +1033,10 @@
 }
 
 
+/* Call a predicate function for each filetype until it returns TRUE. */
+filetype *filetypes_find(FileTypePredicate predicate, gpointer user_data)
+{
+	return g_hash_table_find(filetypes_hash, (GHRFunc) predicate, user_data);
+}
+
+

Modified: branches/custom-filetypes/src/filetypes.h
===================================================================
--- branches/custom-filetypes/src/filetypes.h	2008-05-01 12:10:46 UTC (rev 2543)
+++ branches/custom-filetypes/src/filetypes.h	2008-05-01 14:30:20 UTC (rev 2544)
@@ -131,7 +131,13 @@
 
 filetype *filetypes_lookup_by_name(const gchar *name);
 
+/* This can be cast to GHRFunc */
+typedef gboolean (*FileTypePredicate) (const gchar *ft_name, filetype *ft,
+		gpointer user_data);
 
+filetype *filetypes_find(FileTypePredicate predicate, gpointer user_data);
+
+
 /* Calls filetypes_init_types() and creates the filetype menu. */
 void filetypes_init(void);
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Commits mailing list