recognize all registered extensions, even if they contain dots
authorVladimir Nadvornik <nadvornik@suse.cz>
Sun, 2 Oct 2011 09:55:34 +0000 (11:55 +0200)
committerVladimir Nadvornik <nadvornik@suse.cz>
Sun, 2 Oct 2011 09:55:34 +0000 (11:55 +0200)
src/filedata.c
src/filefilter.c
src/filefilter.h

index 046cdc3..7681587 100644 (file)
@@ -294,7 +294,7 @@ static void file_data_set_path(FileData *fd, const gchar *path)
                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);
index 80490ac..23612d8 100644 (file)
@@ -314,6 +314,20 @@ GList *filter_to_list(const gchar *extensions)
        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 @@ void filter_rebuild(void)
                        }
                }
 
+       /* 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 @@ static gboolean filter_name_find(GList *filter, const gchar *name)
                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 @@ gboolean filter_file_class(const gchar *name, FileFormatClass file_class)
                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)
index ddc8f3a..caa723b 100644 (file)
@@ -37,6 +37,7 @@ void filter_reset(void);
 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);