summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFederico Mena Quintero <federico@ximian.com>2004-06-02 17:47:40 +0000
committerFederico Mena Quintero <federico@src.gnome.org>2004-06-02 17:47:40 +0000
commit5b9f86b96a782ddb3f30284124f5658411e29c8c (patch)
treee0ca79b0e9c029495d16d1ea3760d411bfe3f022
parentc1a4a4cd56ffcab4bd803187ed15a6402b1caae1 (diff)
downloadgdk-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--ChangeLog18
-rw-r--r--ChangeLog.pre-2-1018
-rw-r--r--ChangeLog.pre-2-618
-rw-r--r--ChangeLog.pre-2-818
-rw-r--r--gtk/fnmatch.c159
-rw-r--r--gtk/gtkfilefilter.c2
-rw-r--r--gtk/gtkfilesel.c6
-rw-r--r--gtk/gtkprivate.h3
8 files changed, 158 insertions, 84 deletions
diff --git a/ChangeLog b/ChangeLog
index b83ea5210..4059bf0bc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
}