[tracker] libtracker-common: Update tracker_filename_casecmp_without_extension
- From: JÃrg Billeter <juergbi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tracker] libtracker-common: Update tracker_filename_casecmp_without_extension
- Date: Thu, 13 Oct 2011 12:33:14 +0000 (UTC)
commit f6802836722a4ee122537269ee5b7b2c1bbf3475
Author: JÃrg Billeter <j bitron ch>
Date: Thu Oct 13 13:58:16 2011 +0200
libtracker-common: Update tracker_filename_casecmp_without_extension
The function was refactored in tracker-0.12 branch. This merges the
changes back into master.
src/libtracker-common/tracker-file-utils.c | 85 ++++++++++-----------
tests/libtracker-common/tracker-file-utils-test.c | 16 +---
tests/libtracker-common/tracker-utils-test.c | 1 -
3 files changed, 44 insertions(+), 58 deletions(-)
---
diff --git a/src/libtracker-common/tracker-file-utils.c b/src/libtracker-common/tracker-file-utils.c
index 63ff5b5..bc650b6 100644
--- a/src/libtracker-common/tracker-file-utils.c
+++ b/src/libtracker-common/tracker-file-utils.c
@@ -856,62 +856,55 @@ gboolean
tracker_filename_casecmp_without_extension (const gchar *a,
const gchar *b)
{
- const gchar *ca = a;
- const gchar *cb = b;
- gboolean period_a = FALSE;
- gboolean period_b = FALSE;
- gboolean match = TRUE;
+ gchar *pa;
+ gchar *pb;
+ gint len_a;
+ gint len_b;
g_return_val_if_fail (a != NULL, FALSE);
g_return_val_if_fail (b != NULL, FALSE);
- while (1) {
- if (*ca == '\0' && *cb == '\0')
- break;
+ pa = strrchr (a, '.');
+ pb = strrchr (b, '.');
- if (*ca != '\0' && *cb != '\0') {
- if (g_ascii_tolower (*ca) != g_ascii_tolower (*cb)) {
- match = FALSE;
- break;
- }
- }
-
- if (*ca == '.')
- period_a = TRUE;
-
- if (*cb == '.')
- period_b = TRUE;
-
- if (*ca == '\0' || *cb == '\0') {
- match = FALSE;
- break;
- }
-
- ca ++; cb ++;
+ /* Did we find a "." */
+ if (pa) {
+ len_a = pa - a;
+ } else {
+ len_a = -1;
}
- if (!match) {
- /* If the mismatch was past the last '.' then forgive it. */
- if (*ca != '\0' && period_a) {
- match = TRUE;
+ if (pb) {
+ len_b = pb - b;
+ } else {
+ len_b = -1;
+ }
- while (*(ca ++) != '\0') {
- if (*ca == '.') {
- match = FALSE;
- }
- }
- }
+ /* If one has a "." and the other doesn't, we do length
+ * comparison with strlen() which is less optimal but this is
+ * not a case we consider common operation.
+ */
+ if (len_a == -1 && len_b > -1) {
+ len_a = strlen (a);
+ } else if (len_b == -1 && len_a > -1) {
+ len_b = strlen (b);
+ }
- if (*cb != '\0' && period_b) {
- match = TRUE;
+ /* If we have length for both and it's different then these
+ * strings are not the same. If we have no length for the
+ * strings then it's a simple -1 != -1 comparison.
+ */
+ if (len_a != len_b) {
+ return FALSE;
+ }
- while (*(cb ++) != '\0') {
- if (*cb == '.') {
- match = FALSE;
- }
- }
- }
+ /* Now we know we either have the same length string or no
+ * extension in a and b, meaning it's a strcmp() of the
+ * string only. We test only len_a or len_b here for that:
+ */
+ if (G_UNLIKELY (len_a == -1)) {
+ return g_ascii_strcasecmp (a, b) == 0;
}
- return match;
+ return g_ascii_strncasecmp (a, b, len_a) == 0;
}
diff --git a/tests/libtracker-common/tracker-file-utils-test.c b/tests/libtracker-common/tracker-file-utils-test.c
index 45eebf4..3e53525 100644
--- a/tests/libtracker-common/tracker-file-utils-test.c
+++ b/tests/libtracker-common/tracker-file-utils-test.c
@@ -181,14 +181,13 @@ test_file_get_mime_type (void)
g_free (dir_name);
}
-
#define assert_filename_match(a, b) { \
- g_assert (tracker_filename_casecmp_without_extension (a, b) == TRUE); \
- g_assert (tracker_filename_casecmp_without_extension (b, a) == TRUE); }
+ g_assert_cmpint (tracker_filename_casecmp_without_extension (a, b), ==, TRUE); \
+ g_assert_cmpint (tracker_filename_casecmp_without_extension (b, a), ==, TRUE); }
#define assert_no_filename_match(a, b) { \
- g_assert (tracker_filename_casecmp_without_extension (a, b) == FALSE); \
- g_assert (tracker_filename_casecmp_without_extension (b, a) == FALSE); }
+ g_assert_cmpint (tracker_filename_casecmp_without_extension (a, b), ==, FALSE); \
+ g_assert_cmpint (tracker_filename_casecmp_without_extension (b, a), ==, FALSE); }
static void
test_case_match_filename_without_extension ()
@@ -210,8 +209,6 @@ test_case_match_filename_without_extension ()
assert_filename_match ("", ".");
}
-
-
int
main (int argc, char **argv)
{
@@ -224,14 +221,11 @@ main (int argc, char **argv)
g_test_add_func ("/tracker/libtracker-common/tracker-file-utils/path_evaluate_name",
test_path_evaluate_name);
-
g_test_add_func ("/tracker/libtracker-common/tracker-file-utils/path_list_filter_duplicates",
test_path_list_filter_duplicates);
-
g_test_add_func ("/tracker/libtracker-common/tracker-file-utils/file_get_mime_type",
test_file_get_mime_type);
-
- g_test_add_func ("/libtracker-common/tracker-utils/case_match_filename_without_extension",
+ g_test_add_func ("/tracker/libtracker-common/tracker-file-utils/case_match_filename_without_extension",
test_case_match_filename_without_extension);
result = g_test_run ();
diff --git a/tests/libtracker-common/tracker-utils-test.c b/tests/libtracker-common/tracker-utils-test.c
index 0ee82b5..ac68c6c 100644
--- a/tests/libtracker-common/tracker-utils-test.c
+++ b/tests/libtracker-common/tracker-utils-test.c
@@ -75,7 +75,6 @@ test_seconds_estimate_to_string ()
g_print ("%s\n", result);
}
-
int
main (int argc, char **argv)
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]