tracker r2362 - in trunk: . src/trackerd



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]