tracker r2362 - in trunk: . src/trackerd
- From: carlosg svn gnome org
- To: svn-commits-list gnome org
- Subject: tracker r2362 - in trunk: . src/trackerd
- Date: Mon, 13 Oct 2008 15:38:54 +0000 (UTC)
Author: carlosg
Date: Mon Oct 13 15:38:54 2008
New Revision: 2362
URL: http://svn.gnome.org/viewvc/tracker?rev=2362&view=rev
Log:
2008-10-12 Carlos Garnacho <carlos imendio com>
* src/trackerd/tracker-search.c (search_highlight_terms): Do not leak
like if there was no tomorrow, save one unnecessary allocation.
(search_get_snippet): Rework code, do not read out of bounds.
(tracker_search_get_snippet): Actually highlight the search terms.
(search_utf8_strcasestr_array): Pass a const gchar** for search terms.
* src/trackerd/tracker-crawler.c (tracker_crawler_finalize): Plug a
leak.
Modified:
trunk/ChangeLog
trunk/src/trackerd/tracker-crawler.c
trunk/src/trackerd/tracker-search.c
Modified: trunk/src/trackerd/tracker-crawler.c
==============================================================================
--- trunk/src/trackerd/tracker-crawler.c (original)
+++ trunk/src/trackerd/tracker-crawler.c Mon Oct 13 15:38:54 2008
@@ -214,6 +214,10 @@
g_list_free (priv->index_file_patterns);
}
+ if (priv->ignored_directory_patterns) {
+ g_list_free (priv->ignored_directory_patterns);
+ }
+
if (priv->ignored_file_patterns) {
g_list_free (priv->ignored_file_patterns);
}
Modified: trunk/src/trackerd/tracker-search.c
==============================================================================
--- trunk/src/trackerd/tracker-search.c (original)
+++ trunk/src/trackerd/tracker-search.c Mon Oct 13 15:38:54 2008
@@ -159,13 +159,13 @@
static const char *
search_utf8_strcasestr_array (const gchar *haystack,
- gchar **needles)
+ const gchar **needles)
{
gsize needle_len;
gsize haystack_len;
const gchar *ret = NULL;
const gchar *needle;
- gchar **array;
+ const gchar **array;
gchar *p;
gchar *casefold;
gchar *caseless_haystack;
@@ -252,9 +252,9 @@
static char *
search_highlight_terms (const gchar *text,
- gchar **terms)
+ const gchar **terms)
{
- GStrv p;
+ const gchar **p;
GString *s;
const gchar *str;
gchar *text_copy;
@@ -264,18 +264,13 @@
return NULL;
}
- s = NULL;
+ s = g_string_new ("");
text_copy = g_strdup (text);
for (p = terms; *p; p++) {
- const gchar *text_p;
- gchar **single_term;
+ const gchar *text_p;
+ const gchar *single_term[2] = { *p, NULL };
- single_term = g_new (gchar*, 2);
- single_term[0] = g_strdup (*p);
- single_term[1] = NULL;
-
- s = g_string_new ("");
text_p = text_copy;
while ((str = search_utf8_strcasestr_array (text_p, single_term))) {
@@ -296,8 +291,6 @@
if (text_p) {
g_string_append (s, text_p);
}
-
- g_strfreev (single_term);
}
g_free (text_copy);
@@ -308,7 +301,7 @@
static gchar *
search_get_snippet (const gchar *text,
- gchar **terms,
+ const gchar **terms,
gint length)
{
const gchar *ptr = NULL;
@@ -332,65 +325,51 @@
tmp = ptr;
i = 0;
- /* Get snippet before the matching term */
- while ((ptr = g_utf8_prev_char (ptr)) && ptr >= text && i < length) {
- if (*ptr == '\n') {
- break;
- }
-
+ /* Get snippet before the matching term, try to keep it in the middle */
+ while (ptr != NULL && *ptr != '\n' && i < length / 2) {
+ ptr = g_utf8_find_prev_char (text, ptr);
i++;
}
- /* Try to start beginning of snippet on a word break */
- if (*ptr != '\n' && ptr > text) {
- i = 0;
-
- while (!search_is_word_break (*ptr) && i < (length / 2)) {
- ptr = g_utf8_next_char (ptr);
- i++;
+ if (!ptr) {
+ /* No newline was found before highlighted term */
+ ptr = text;
+ } else if (*ptr != '\n') {
+ /* Try to start beginning of snippet on a word break */
+ while (!search_is_word_break (*ptr) && ptr != tmp) {
+ ptr = g_utf8_find_next_char (ptr, NULL);
}
+ } else {
+ ptr = g_utf8_find_next_char (ptr, NULL);
}
- ptr = g_utf8_next_char (ptr);
-
- if (!ptr || ptr < text) {
- return NULL;
- }
-
- end_ptr = tmp;
+ end_ptr = ptr;
i = 0;
- /* Get snippet after match */
- while ((end_ptr = g_utf8_next_char (end_ptr)) &&
- end_ptr <= text_len + text &&
- i < length) {
+ while (end_ptr != NULL && *end_ptr != '\n' && i < length) {
+ end_ptr = g_utf8_find_next_char (end_ptr, NULL);
i++;
-
- if (*end_ptr == '\n') {
- break;
- }
}
- while (end_ptr > text_len + text) {
- end_ptr = g_utf8_prev_char (end_ptr);
- }
+ if (end_ptr && *end_ptr != '\n') {
+ /* Try to end snippet on a word break */
+ while (!search_is_word_break (*end_ptr) && end_ptr != tmp) {
+ end_ptr = g_utf8_find_prev_char (text, end_ptr);
+ }
- /* Try to end snippet on a word break */
- if (*end_ptr != '\n' && end_ptr < text_len + text) {
- i=0;
- while (!search_is_word_break (*end_ptr) && i < (length / 2)) {
- end_ptr = g_utf8_prev_char (end_ptr);
- i++;
+ if (end_ptr == tmp) {
+ end_ptr = NULL;
}
}
- if (!end_ptr || !ptr) {
- return NULL;
+ if (!end_ptr) {
+ /* Copy to the end of the string */
+ snippet = g_strdup (ptr);
+ } else {
+ snippet = g_strndup (ptr, end_ptr - ptr);
}
- snippet = g_strndup (ptr, end_ptr - ptr);
- i = strlen (snippet);
- snippet_escaped = g_markup_escape_text (snippet, i);
+ snippet_escaped = g_markup_escape_text (snippet, -1);
g_free (snippet);
snippet_highlighted = search_highlight_terms (snippet_escaped, terms);
@@ -833,13 +812,13 @@
priv = TRACKER_SEARCH_GET_PRIVATE (object);
tracker_db_result_set_get (result_set, 0, &text, -1);
- strv = tracker_parser_text_into_array (text,
+
+ strv = tracker_parser_text_into_array (search_text,
priv->language,
tracker_config_get_max_word_length (priv->config),
tracker_config_get_min_word_length (priv->config));
-
if (strv && strv[0]) {
- snippet = search_get_snippet (text, strv, 120);
+ snippet = search_get_snippet (text, (const gchar **) strv, 120);
}
g_strfreev (strv);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]