From: Vladimir Nadvornik Date: Sun, 2 Oct 2011 09:55:34 +0000 (+0200) Subject: recognize all registered extensions, even if they contain dots X-Git-Tag: 1.1~27 X-Git-Url: http://geeqie.org/cgi-bin/gitweb.cgi?p=geeqie.git;a=commitdiff_plain;h=58e4671ba18ae3b3a996f3f518151fc6fb2bbdf0 recognize all registered extensions, even if they contain dots --- diff --git a/src/filedata.c b/src/filedata.c index 046cdc37..76815877 100644 --- a/src/filedata.c +++ b/src/filedata.c @@ -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); diff --git a/src/filefilter.c b/src/filefilter.c index 80490acb..23612d83 100644 --- a/src/filefilter.c +++ b/src/filefilter.c @@ -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) diff --git a/src/filefilter.h b/src/filefilter.h index ddc8f3a3..caa723be 100644 --- a/src/filefilter.h +++ b/src/filefilter.h @@ -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);