diff options
author | Federico Mena Quintero <federico@ximian.com> | 2004-06-02 17:47:40 +0000 |
---|---|---|
committer | Federico Mena Quintero <federico@src.gnome.org> | 2004-06-02 17:47:40 +0000 |
commit | 5b9f86b96a782ddb3f30284124f5658411e29c8c (patch) | |
tree | e0ca79b0e9c029495d16d1ea3760d411bfe3f022 | |
parent | c1a4a4cd56ffcab4bd803187ed15a6402b1caae1 (diff) | |
download | gdk-pixbuf-5b9f86b96a782ddb3f30284124f5658411e29c8c.tar.gz |
Merged from HEAD:
2004-06-02 Federico Mena Quintero <federico@ximian.com>
Merged from HEAD:
Fix #138807.
* gtk/fnmatch.c (_gtk_fnmatch): Take a no_leading_period argument.
(gtk_fnmatch_intern): Likewise; also implement this option.
* gtk/gtkprivate.h (_gtk_fnmatch): Updated prototype.
* gtk/gtkfilesel.c (find_completion_dir): Pass TRUE for the
no_leading_period argument of _gtk_fnmatch().
(attempt_file_completion): Likewise.
* gtk/gtkfilefilter.c (gtk_file_filter_filter): Pass FALSE for the
no_leading_period argument of _gtk_fnmatch().
-rw-r--r-- | ChangeLog | 18 | ||||
-rw-r--r-- | ChangeLog.pre-2-10 | 18 | ||||
-rw-r--r-- | ChangeLog.pre-2-6 | 18 | ||||
-rw-r--r-- | ChangeLog.pre-2-8 | 18 | ||||
-rw-r--r-- | gtk/fnmatch.c | 159 | ||||
-rw-r--r-- | gtk/gtkfilefilter.c | 2 | ||||
-rw-r--r-- | gtk/gtkfilesel.c | 6 | ||||
-rw-r--r-- | gtk/gtkprivate.h | 3 |
8 files changed, 158 insertions, 84 deletions
@@ -1,3 +1,21 @@ +2004-06-02 Federico Mena Quintero <federico@ximian.com> + + Merged from HEAD: + + Fix #138807. + + * gtk/fnmatch.c (_gtk_fnmatch): Take a no_leading_period argument. + (gtk_fnmatch_intern): Likewise; also implement this option. + + * gtk/gtkprivate.h (_gtk_fnmatch): Updated prototype. + + * gtk/gtkfilesel.c (find_completion_dir): Pass TRUE for the + no_leading_period argument of _gtk_fnmatch(). + (attempt_file_completion): Likewise. + + * gtk/gtkfilefilter.c (gtk_file_filter_filter): Pass FALSE for the + no_leading_period argument of _gtk_fnmatch(). + Wed Jun 2 00:46:32 2004 Matthias Clasen <maclas@gmx.de> * gtk/gtkselection.c (_gtk_selection_request): Remove leftover diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index b83ea5210..4059bf0bc 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,21 @@ +2004-06-02 Federico Mena Quintero <federico@ximian.com> + + Merged from HEAD: + + Fix #138807. + + * gtk/fnmatch.c (_gtk_fnmatch): Take a no_leading_period argument. + (gtk_fnmatch_intern): Likewise; also implement this option. + + * gtk/gtkprivate.h (_gtk_fnmatch): Updated prototype. + + * gtk/gtkfilesel.c (find_completion_dir): Pass TRUE for the + no_leading_period argument of _gtk_fnmatch(). + (attempt_file_completion): Likewise. + + * gtk/gtkfilefilter.c (gtk_file_filter_filter): Pass FALSE for the + no_leading_period argument of _gtk_fnmatch(). + Wed Jun 2 00:46:32 2004 Matthias Clasen <maclas@gmx.de> * gtk/gtkselection.c (_gtk_selection_request): Remove leftover diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index b83ea5210..4059bf0bc 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,21 @@ +2004-06-02 Federico Mena Quintero <federico@ximian.com> + + Merged from HEAD: + + Fix #138807. + + * gtk/fnmatch.c (_gtk_fnmatch): Take a no_leading_period argument. + (gtk_fnmatch_intern): Likewise; also implement this option. + + * gtk/gtkprivate.h (_gtk_fnmatch): Updated prototype. + + * gtk/gtkfilesel.c (find_completion_dir): Pass TRUE for the + no_leading_period argument of _gtk_fnmatch(). + (attempt_file_completion): Likewise. + + * gtk/gtkfilefilter.c (gtk_file_filter_filter): Pass FALSE for the + no_leading_period argument of _gtk_fnmatch(). + Wed Jun 2 00:46:32 2004 Matthias Clasen <maclas@gmx.de> * gtk/gtkselection.c (_gtk_selection_request): Remove leftover diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index b83ea5210..4059bf0bc 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,21 @@ +2004-06-02 Federico Mena Quintero <federico@ximian.com> + + Merged from HEAD: + + Fix #138807. + + * gtk/fnmatch.c (_gtk_fnmatch): Take a no_leading_period argument. + (gtk_fnmatch_intern): Likewise; also implement this option. + + * gtk/gtkprivate.h (_gtk_fnmatch): Updated prototype. + + * gtk/gtkfilesel.c (find_completion_dir): Pass TRUE for the + no_leading_period argument of _gtk_fnmatch(). + (attempt_file_completion): Likewise. + + * gtk/gtkfilefilter.c (gtk_file_filter_filter): Pass FALSE for the + no_leading_period argument of _gtk_fnmatch(). + Wed Jun 2 00:46:32 2004 Matthias Clasen <maclas@gmx.de> * gtk/gtkselection.c (_gtk_selection_request): Remove leftover diff --git a/gtk/fnmatch.c b/gtk/fnmatch.c index aafe8c39d..677ff9f71 100644 --- a/gtk/fnmatch.c +++ b/gtk/fnmatch.c @@ -79,7 +79,8 @@ get_unescaped_char (const char **str, static gboolean gtk_fnmatch_intern (const char *pattern, const char *string, - gboolean component_start) + gboolean component_start, + gboolean no_leading_period) { const char *p = pattern, *n = string; @@ -97,7 +98,7 @@ gtk_fnmatch_intern (const char *pattern, return FALSE; else if (nc == G_DIR_SEPARATOR) return FALSE; - else if (nc == '.' && component_start) + else if (nc == '.' && component_start && no_leading_period) return FALSE; break; case '\\': @@ -107,7 +108,7 @@ gtk_fnmatch_intern (const char *pattern, return FALSE; break; case '*': - if (nc == '.' && component_start) + if (nc == '.' && component_start && no_leading_period) return FALSE; { @@ -148,7 +149,7 @@ gtk_fnmatch_intern (const char *pattern, for (p = last_p; nc != '\0';) { if ((c == '[' || nc == c) && - gtk_fnmatch_intern (p, last_n, component_start)) + gtk_fnmatch_intern (p, last_n, component_start, no_leading_period)) return TRUE; component_start = (nc == G_DIR_SEPARATOR); @@ -168,7 +169,7 @@ gtk_fnmatch_intern (const char *pattern, if (nc == '\0' || nc == G_DIR_SEPARATOR) return FALSE; - if (nc == '.' && component_start) + if (nc == '.' && component_start && no_leading_period) return FALSE; not = (*p == '!' || *p == '^'); @@ -245,116 +246,116 @@ gtk_fnmatch_intern (const char *pattern, * * FNM_FILE_NAME - always set * FNM_LEADING_DIR - never set - * FNM_PERIOD - always set * FNM_NOESCAPE - set only on windows * FNM_CASEFOLD - set only on windows */ gboolean _gtk_fnmatch (const char *pattern, - const char *string) + const char *string, + gboolean no_leading_period) { - return gtk_fnmatch_intern (pattern, string, TRUE); + return gtk_fnmatch_intern (pattern, string, TRUE, no_leading_period); } #undef FNMATCH_TEST_CASES #ifdef FNMATCH_TEST_CASES -#define TEST(pat, str, result) \ - g_assert (_gtk_fnmatch ((pat), (str)) == result) +#define TEST(pat, str, no_leading_period, result) \ + g_assert (_gtk_fnmatch ((pat), (str), (no_leading_period)) == result) int main (int argc, char **argv) { - TEST ("[a-]", "-", TRUE); + TEST ("[a-]", "-", TRUE, TRUE); - TEST ("a", "a", TRUE); - TEST ("a", "b", FALSE); + TEST ("a", "a", TRUE, TRUE); + TEST ("a", "b", TRUE, FALSE); /* Test what ? matches */ - TEST ("?", "a", TRUE); - TEST ("?", ".", FALSE); - TEST ("a?", "a.", TRUE); - TEST ("a/?", "a/b", TRUE); - TEST ("a/?", "a/.", FALSE); - TEST ("?", "/", FALSE); + TEST ("?", "a", TRUE, TRUE); + TEST ("?", ".", TRUE, FALSE); + TEST ("a?", "a.", TRUE, TRUE); + TEST ("a/?", "a/b", TRUE, TRUE); + TEST ("a/?", "a/.", TRUE, FALSE); + TEST ("?", "/", TRUE, FALSE); /* Test what * matches */ - TEST ("*", "a", TRUE); - TEST ("*", ".", FALSE); - TEST ("a*", "a.", TRUE); - TEST ("a/*", "a/b", TRUE); - TEST ("a/*", "a/.", FALSE); - TEST ("*", "/", FALSE); + TEST ("*", "a", TRUE, TRUE); + TEST ("*", ".", TRUE, FALSE); + TEST ("a*", "a.", TRUE, TRUE); + TEST ("a/*", "a/b", TRUE, TRUE); + TEST ("a/*", "a/.", TRUE, FALSE); + TEST ("*", "/", TRUE, FALSE); /* Range tests */ - TEST ("[ab]", "a", TRUE); - TEST ("[ab]", "c", FALSE); - TEST ("[^ab]", "a", FALSE); - TEST ("[!ab]", "a", FALSE); - TEST ("[^ab]", "c", TRUE); - TEST ("[!ab]", "c", TRUE); - TEST ("[a-c]", "b", TRUE); - TEST ("[a-c]", "d", FALSE); - TEST ("[a-]", "-", TRUE); - TEST ("[]]", "]", TRUE); - TEST ("[^]]", "a", TRUE); - TEST ("[!]]", "a", TRUE); + TEST ("[ab]", "a", TRUE, TRUE); + TEST ("[ab]", "c", TRUE, FALSE); + TEST ("[^ab]", "a", TRUE, FALSE); + TEST ("[!ab]", "a", TRUE, FALSE); + TEST ("[^ab]", "c", TRUE, TRUE); + TEST ("[!ab]", "c", TRUE, TRUE); + TEST ("[a-c]", "b", TRUE, TRUE); + TEST ("[a-c]", "d", TRUE, FALSE); + TEST ("[a-]", "-", TRUE, TRUE); + TEST ("[]]", "]", TRUE, TRUE); + TEST ("[^]]", "a", TRUE, TRUE); + TEST ("[!]]", "a", TRUE, TRUE); /* Various unclosed ranges */ - TEST ("[ab", "a", FALSE); - TEST ("[a-", "a", FALSE); - TEST ("[ab", "c", FALSE); - TEST ("[a-", "c", FALSE); - TEST ("[^]", "a", FALSE); + TEST ("[ab", "a", TRUE, FALSE); + TEST ("[a-", "a", TRUE, FALSE); + TEST ("[ab", "c", TRUE, FALSE); + TEST ("[a-", "c", TRUE, FALSE); + TEST ("[^]", "a", TRUE, FALSE); /* Ranges and special no-wildcard matches */ - TEST ("[.]", ".", FALSE); - TEST ("a[.]", "a.", TRUE); - TEST ("a/[.]", "a/.", FALSE); - TEST ("[/]", "/", FALSE); - TEST ("[^/]", "a", TRUE); + TEST ("[.]", ".", TRUE, FALSE); + TEST ("a[.]", "a.", TRUE, TRUE); + TEST ("a/[.]", "a/.", TRUE, FALSE); + TEST ("[/]", "/", TRUE, FALSE); + TEST ("[^/]", "a", TRUE, TRUE); /* Basic tests of * (and combinations of * and ?) */ - TEST ("a*b", "ab", TRUE); - TEST ("a*b", "axb", TRUE); - TEST ("a*b", "axxb", TRUE); - TEST ("a**b", "ab", TRUE); - TEST ("a**b", "axb", TRUE); - TEST ("a**b", "axxb", TRUE); - TEST ("a*?*b", "ab", FALSE); - TEST ("a*?*b", "axb", TRUE); - TEST ("a*?*b", "axxb", TRUE); + TEST ("a*b", "ab", TRUE, TRUE); + TEST ("a*b", "axb", TRUE, TRUE); + TEST ("a*b", "axxb", TRUE, TRUE); + TEST ("a**b", "ab", TRUE, TRUE); + TEST ("a**b", "axb", TRUE, TRUE); + TEST ("a**b", "axxb", TRUE, TRUE); + TEST ("a*?*b", "ab", TRUE, FALSE); + TEST ("a*?*b", "axb", TRUE, TRUE); + TEST ("a*?*b", "axxb", TRUE, TRUE); /* Test of *[range] */ - TEST ("a*[cd]", "ac", TRUE); - TEST ("a*[cd]", "axc", TRUE); - TEST ("a*[cd]", "axx", FALSE); + TEST ("a*[cd]", "ac", TRUE, TRUE); + TEST ("a*[cd]", "axc", TRUE, TRUE); + TEST ("a*[cd]", "axx", TRUE, FALSE); - TEST ("a/[.]", "a/.", FALSE); - TEST ("a*[.]", "a/.", FALSE); + TEST ("a/[.]", "a/.", TRUE, FALSE); + TEST ("a*[.]", "a/.", TRUE, FALSE); /* Test of UTF-8 */ - TEST ("ä", "ä", TRUE); /* TEST ("ä", "ä", TRUE); */ - TEST ("?", "ä", TRUE); /* TEST ("?", "ä", TRUE); */ - TEST ("*ö", "äö", TRUE); /* TEST ("*ö", "äö", TRUE); */ - TEST ("*ö", "ääö", TRUE); /* TEST ("*ö", "ääö", TRUE); */ - TEST ("[ä]", "ä", TRUE); /* TEST ("[ä]", "ä", TRUE); */ - TEST ("[ä-ö]", "é", TRUE); /* TEST ("[ä-ö]", "é", TRUE); */ - TEST ("[ä-ö]", "a", FALSE); /* TEST ("[ä-ö]", "a", FALSE); */ + TEST ("ä", "ä", TRUE, TRUE); /* TEST ("ä", "ä", TRUE); */ + TEST ("?", "ä", TRUE, TRUE); /* TEST ("?", "ä", TRUE); */ + TEST ("*ö", "äö", TRUE, TRUE); /* TEST ("*ö", "äö", TRUE); */ + TEST ("*ö", "ääö", TRUE, TRUE); /* TEST ("*ö", "ääö", TRUE); */ + TEST ("[ä]", "ä", TRUE, TRUE); /* TEST ("[ä]", "ä", TRUE); */ + TEST ("[ä-ö]", "é", TRUE, TRUE); /* TEST ("[ä-ö]", "é", TRUE); */ + TEST ("[ä-ö]", "a", TRUE, FALSE); /* TEST ("[ä-ö]", "a", FALSE); */ #ifdef DO_ESCAPE /* Tests of escaping */ - TEST ("\\\\", "\\", TRUE); - TEST ("\\?", "?", TRUE); - TEST ("\\?", "a", FALSE); - TEST ("\\*", "*", TRUE); - TEST ("\\*", "a", FALSE); - TEST ("\\[a-b]", "[a-b]", TRUE); - TEST ("[\\\\]", "\\", TRUE); - TEST ("[\\^a]", "a", TRUE); - TEST ("[a\\-c]", "b", FALSE); - TEST ("[a\\-c]", "-", TRUE); - TEST ("[a\\]", "a", FALSE); + TEST ("\\\\", "\\", TRUE, TRUE); + TEST ("\\?", "?", TRUE, TRUE); + TEST ("\\?", "a", TRUE, FALSE); + TEST ("\\*", "*", TRUE, TRUE); + TEST ("\\*", "a", TRUE, FALSE); + TEST ("\\[a-b]", "[a-b]", TRUE, TRUE); + TEST ("[\\\\]", "\\", TRUE, TRUE); + TEST ("[\\^a]", "a", TRUE, TRUE); + TEST ("[a\\-c]", "b", TRUE, FALSE); + TEST ("[a\\-c]", "-", TRUE, TRUE); + TEST ("[a\\]", "a", TRUE, FALSE); #endif /* DO_ESCAPE */ return 0; diff --git a/gtk/gtkfilefilter.c b/gtk/gtkfilefilter.c index 81e563392..01fc22350 100644 --- a/gtk/gtkfilefilter.c +++ b/gtk/gtkfilefilter.c @@ -378,7 +378,7 @@ gtk_file_filter_filter (GtkFileFilter *filter, break; case FILTER_RULE_PATTERN: if (filter_info->display_name != NULL && - _gtk_fnmatch (rule->u.pattern, filter_info->display_name)) + _gtk_fnmatch (rule->u.pattern, filter_info->display_name, FALSE)) return TRUE; break; case FILTER_RULE_CUSTOM: diff --git a/gtk/gtkfilesel.c b/gtk/gtkfilesel.c index 9e1bf6b1c..dd516a475 100644 --- a/gtk/gtkfilesel.c +++ b/gtk/gtkfilesel.c @@ -3694,7 +3694,7 @@ find_completion_dir (gchar *text_to_complete, for (i = 0; i < dir->sent->entry_count; i += 1) { if (dir->sent->entries[i].is_dir && - _gtk_fnmatch (pat_buf, dir->sent->entries[i].entry_name)) + _gtk_fnmatch (pat_buf, dir->sent->entries[i].entry_name, TRUE)) { if (found) { @@ -3844,7 +3844,7 @@ attempt_file_completion (CompletionState *cmpl_state) { if (dir->sent->entries[dir->cmpl_index].is_dir) { - if (_gtk_fnmatch (pat_buf, dir->sent->entries[dir->cmpl_index].entry_name)) + if (_gtk_fnmatch (pat_buf, dir->sent->entries[dir->cmpl_index].entry_name, TRUE)) { CompletionDir* new_dir; @@ -3892,7 +3892,7 @@ attempt_file_completion (CompletionState *cmpl_state) append_completion_text (dir->sent->entries[dir->cmpl_index].entry_name, cmpl_state); cmpl_state->the_completion.is_a_completion = - _gtk_fnmatch (pat_buf, dir->sent->entries[dir->cmpl_index].entry_name); + _gtk_fnmatch (pat_buf, dir->sent->entries[dir->cmpl_index].entry_name, TRUE); cmpl_state->the_completion.is_directory = dir->sent->entries[dir->cmpl_index].is_dir; if (dir->sent->entries[dir->cmpl_index].is_dir) diff --git a/gtk/gtkprivate.h b/gtk/gtkprivate.h index 6d043809f..390c4f1b6 100644 --- a/gtk/gtkprivate.h +++ b/gtk/gtkprivate.h @@ -100,7 +100,8 @@ const gchar *_gtk_get_data_prefix (); #endif /* G_OS_WIN32 */ gboolean _gtk_fnmatch (const char *pattern, - const char *string); + const char *string, + gboolean no_leading_period); #ifdef __cplusplus } |