changeset 1935:5fab16d12a54

recognize all registered extensions, even if they contain dots
author Vladimir Nadvornik <nadvornik@suse.cz>
date Sun, 02 Oct 2011 11:55:34 +0200
parents 95a788b9dc1c
children ed6aa14b66c9
files src/filedata.c src/filefilter.c src/filefilter.h
diffstat 3 files changed, 30 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/filedata.c	Sun Oct 02 11:16:03 2011 +0200
+++ b/src/filedata.c	Sun Oct 02 11:55:34 2011 +0200
@@ -294,7 +294,7 @@
 		return;
 		}
 
-	fd->extension = extension_from_path(fd->path);
+	fd->extension = registered_extension_from_path(fd->path);
 	if (fd->extension == NULL)
 		{
 		fd->extension = fd->name + strlen(fd->name);
--- a/src/filefilter.c	Sun Oct 02 11:16:03 2011 +0200
+++ b/src/filefilter.c	Sun Oct 02 11:55:34 2011 +0200
@@ -314,6 +314,20 @@
 	return list;
 }
 
+static gint filter_sort_ext_len_cb(gconstpointer a, gconstpointer b)
+{
+	gchar *sa = (gchar *)a;
+	gchar *sb = (gchar *)b;
+	
+	gint len_a = strlen(sa);
+	gint len_b = strlen(sb);
+	
+	if (len_a > len_b) return -1;
+	if (len_a < len_b) return 1;
+	return 0;
+}
+ 
+
 void filter_rebuild(void)
 {
 	GList *work;
@@ -374,10 +388,13 @@
 			}
 		}
 
+	/* make sure registered_extension_from_path finds the longer match first */
+	extension_list = g_list_sort(extension_list, filter_sort_ext_len_cb);
 	sidecar_ext_parse(options->sidecar.ext); /* this must be updated after changed file extensions */
 }
 
-static gboolean filter_name_find(GList *filter, const gchar *name)
+/* return the extension part of the name or NULL */
+static const gchar *filter_name_find(GList *filter, const gchar *name)
 {
 	GList *work;
 	guint ln;
@@ -392,20 +409,23 @@
 		if (ln >= lf)
 			{
 			/* FIXME: utf8 */
-			if (g_ascii_strncasecmp(name + ln - lf, filter, lf) == 0) return TRUE;
+			if (g_ascii_strncasecmp(name + ln - lf, filter, lf) == 0) return name + ln - lf;
 			}
 		work = work->next;
 		}
 
-	return FALSE;
+	return NULL;
 }
-
+const gchar *registered_extension_from_path(const gchar *name)
+{
+	return filter_name_find(extension_list, name);
+}
 
 gboolean filter_name_exists(const gchar *name)
 {
 	if (!extension_list || options->file_filter.disable) return TRUE;
 
-	return filter_name_find(extension_list, name);
+	return !!filter_name_find(extension_list, name);
 }
 
 gboolean filter_file_class(const gchar *name, FileFormatClass file_class)
@@ -416,17 +436,17 @@
 		return FALSE;
 		}
 
-	return filter_name_find(file_class_extension_list[file_class], name);
+	return !!filter_name_find(file_class_extension_list[file_class], name);
 }
 
 gboolean filter_name_is_writable(const gchar *name)
 {
-	return filter_name_find(file_writable_list, name);
+	return !!filter_name_find(file_writable_list, name);
 }
 
 gboolean filter_name_allow_sidecar(const gchar *name)
 {
-	return filter_name_find(file_sidecar_list, name);
+	return !!filter_name_find(file_sidecar_list, name);
 }
 
 void filter_write_list(GString *outstr, gint indent)
--- a/src/filefilter.h	Sun Oct 02 11:16:03 2011 +0200
+++ b/src/filefilter.h	Sun Oct 02 11:55:34 2011 +0200
@@ -37,6 +37,7 @@
 void filter_rebuild(void);
 GList *filter_to_list(const gchar *extensions);
 
+const gchar *registered_extension_from_path(const gchar *name);
 gboolean filter_name_exists(const gchar *name);
 gboolean filter_file_class(const gchar *name, FileFormatClass file_class);
 gboolean filter_name_is_writable(const gchar *name);