[gthumb] Use GSList* instead of char** to store keywords - bug 547620



commit 30ae26de411e7f6143c913e8c9ed7936cf6406c0
Author: Marc Pavot <marc pavot gmail com>
Date:   Sat May 2 12:12:53 2009 -0400

    Use GSList* instead of char** to store keywords - bug 547620
    
    Also fixes metadata-to-categories conversion.
---
 libgthumb/comments.c          |  214 ++++++++++++++---------------------------
 libgthumb/comments.h          |    3 +-
 libgthumb/gth-exif-utils.c    |   40 ++++++++-
 libgthumb/gth-exif-utils.h    |    5 +
 libgthumb/gth-exiv2-utils.cpp |   15 +++
 libgthumb/gth-filter.c        |   16 ++--
 src/dlg-categories.c          |   27 ++---
 src/dlg-image-prop.c          |   14 ++-
 src/dlg-search.c              |   19 ++--
 9 files changed, 166 insertions(+), 187 deletions(-)

diff --git a/libgthumb/comments.c b/libgthumb/comments.c
index 0421696..302a718 100644
--- a/libgthumb/comments.c
+++ b/libgthumb/comments.c
@@ -69,7 +69,6 @@ comment_data_new (void)
 	data->place = NULL;
 	data->time = 0;
 	data->comment = NULL;
-	data->keywords_n = 0;
 	data->keywords = NULL;
 	data->utf8_format = TRUE;
 	data->changed = FALSE;
@@ -81,14 +80,9 @@ comment_data_new (void)
 void
 comment_data_free_keywords (CommentData *data)
 {
-	if (data->keywords != NULL) {
-		int i;
-		for (i = 0; i < data->keywords_n; i++)
-			g_free (data->keywords[i]);
-		g_free (data->keywords);
-		data->keywords = NULL;
-		data->keywords_n = 0;
-	}
+        g_slist_foreach (data->keywords, (GFunc) g_free, NULL);
+        g_slist_free (data->keywords);
+        data->keywords = NULL;
 }
 
 
@@ -128,6 +122,7 @@ CommentData *
 comment_data_dup (CommentData *data)
 {
 	CommentData *new_data;
+        GSList *tmp;
 
 	if (data == NULL)
 		return NULL;
@@ -140,15 +135,8 @@ comment_data_dup (CommentData *data)
 	if (data->comment != NULL)
 		new_data->comment = g_strdup (data->comment);
 
-	if (data->keywords != NULL) {
-		int i;
-
-		new_data->keywords = g_new0 (char*, data->keywords_n + 1);
-		new_data->keywords_n = data->keywords_n;
-
-		for (i = 0; i < data->keywords_n; i++)
-			new_data->keywords[i] = g_strdup (data->keywords[i]);
-		new_data->keywords[i] = NULL;
+        for (tmp = data->keywords; tmp; tmp = g_slist_next (tmp)) {
+                new_data->keywords = g_slist_append (new_data->keywords, g_strdup (tmp->data));
 	}
 	new_data->utf8_format = data->utf8_format;
 
@@ -160,7 +148,7 @@ gboolean
 comment_data_equal (CommentData *data1,
 		    CommentData *data2)
 {
-	int i;
+        GSList *tmp1, *tmp2;
 
 	if ((data1 == NULL) && (data2 == NULL))
 		return TRUE;
@@ -173,12 +161,15 @@ comment_data_equal (CommentData *data1,
 		return FALSE;
 	if (strcmp_null_tolerant (data1->comment, data2->comment) != 0)
 		return FALSE;
-	if (data1->keywords_n != data2->keywords_n)
+	if (g_slist_length (data1->keywords) != g_slist_length (data2->keywords))
 		return FALSE;
-	for (i = 0; i < data1->keywords_n; i++)
-		if (strcmp_null_tolerant (data1->keywords[i],
-					   data2->keywords[i]) != 0)
+        for (tmp1 = data1->keywords, tmp2 = data2->keywords;
+             tmp1 && tmp2;
+             tmp1 = g_slist_next (tmp1), tmp2 = g_slist_next (tmp2)) {
+		if (strcmp_null_tolerant (tmp1->data,
+					  tmp2->data) != 0)
 			return FALSE;
+        }
 
 	return TRUE;
 }
@@ -315,48 +306,26 @@ get_keywords (CommentData *data,
 
 {
 	char     *value;
-        int       n;
-        char     *p, *keyword;
-        gboolean  done;
+        char    **keywords_v;
+        int       i;
+
+        comment_data_free_keywords (data);
 
 	if ((utf8_value == NULL) || (*utf8_value == 0)) {
-		data->keywords_n = 0;
-		data->keywords = NULL;
 		return;
 	}
 
 	value = get_utf8_text (data, utf8_value);
-
 	if (value == NULL) {
-		data->keywords_n = 0;
-		data->keywords = NULL;
 		return;
 	}
 
-	n = 1;
-	for (p = value; *p != 0; p = g_utf8_next_char (p)) {
-		gunichar ch = g_utf8_get_char (p);
-		if (ch == ',')
-			n++;
-	}
-
-	data->keywords_n = n;
-	data->keywords = g_new0 (char*, n + 1);
-	data->keywords[n] = NULL;
-
-        n = 0;
-	keyword = p = value;
-	do {
-		gunichar ch = g_utf8_get_char (p);
+        keywords_v = g_strsplit (value, ",", 0);
 
-		done = (*p == 0);
-
-		if ((ch == ',') || (*p == 0)) {
-			data->keywords[n++] = g_strndup (keyword, p - keyword);
-			keyword = p = g_utf8_next_char (p);
-		} else
-			p = g_utf8_next_char (p);
-	} while (! done);
+        for (i = 0; keywords_v[i]; ++i) {
+                data->keywords = g_slist_append (data->keywords, g_strdup (keywords_v[i]));
+        }
+        g_strfreev (keywords_v);
 
 	g_free (value);
 }
@@ -387,6 +356,8 @@ load_comment_from_metadata (const char *uri)
 	FileData    *file;
 	char        *metadata_string = NULL;
 	time_t	     metadata_time = 0;
+        GSList      *metadata_list, *tmp;
+        char        **keywords_v;
 
 	file = file_data_new (uri);
 	file_data_update_all (file, FALSE);
@@ -403,39 +374,23 @@ load_comment_from_metadata (const char *uri)
                 data->place = g_strdup (metadata_string);
 	g_free (metadata_string);
 
-        metadata_string = get_metadata_tagset_string (file, TAG_NAME_SETS[KEYWORD_TAG_NAMES]);
-	if (has_non_whitespace_comment (metadata_string)) {
-		char **keywords_v;
-		int  i = 0;
-		int  j = 0;
-
+        metadata_list = get_metadata_tagset_list (file, TAG_NAME_SETS[KEYWORD_TAG_NAMES]);
 		comment_data_free_keywords (data);
-
-		keywords_v = g_strsplit (metadata_string, ",", 0);
-
-		while (keywords_v[j] != NULL) {
-			if (has_non_whitespace_comment (keywords_v[j]))	{
-				i++;
-			}
-			j++;
-		}
-
-		data->keywords_n = i;
-		data->keywords = g_new0 (char*, data->keywords_n + 1);
-
-		i = 0;
-		j = 0;
-                while (keywords_v[j] != NULL) {
-                        if (has_non_whitespace_comment (keywords_v[j])) {
-				data->keywords[i] = g_strdup (keywords_v[j]);
-                                i++;
+        for (tmp = metadata_list; tmp; tmp = g_slist_next (tmp)) {
+                if (has_non_whitespace_comment (tmp->data)) {
+                        int i;
+                        keywords_v = g_strsplit (tmp->data, ",", 0);
+
+                        for (i = 0; keywords_v[i]; ++i) {
+                                if (has_non_whitespace_comment (keywords_v[i])) {
+                                        data->keywords = g_slist_append (data->keywords, g_strdup (keywords_v[i]));
                         }
-			j++;
                 }
-
-		data->keywords[i] = NULL;
 		g_strfreev (keywords_v);
 	}
+        }
+        g_slist_foreach (metadata_list, (GFunc) g_free, NULL);
+        g_slist_free (metadata_list);
 
 	/* Only load the metadata time if the metadata contained useful comments,
 	   location data, or keywords. Almost all photos contain date metadata, so
@@ -444,7 +399,7 @@ load_comment_from_metadata (const char *uri)
 	   be a matter for further consideration. */
 	if ((data->comment != NULL) ||
             (data->place != NULL) ||
-	    (data->keywords_n > 0)) {
+	    (data->keywords)) {
 	        metadata_time = get_metadata_time_from_fd (file, TAG_NAME_SETS[COMMENT_DATE_TAG_NAMES]);
         	if (metadata_time > (time_t) 0)
                 	data->time = metadata_time;
@@ -460,12 +415,26 @@ load_comment_from_metadata (const char *uri)
 	return data;
 }
 
+static char*
+get_keywords_str (CommentData *data)
+{
+        GString   *keywords_str;
+        GSList    *tmp;
+
+        keywords_str = g_string_new (NULL);
+        for (tmp = data->keywords; tmp; tmp = g_slist_next (tmp)) {
+                keywords_str = g_string_append (keywords_str, g_strdup (tmp->data));
+                if (g_slist_next (tmp))
+                        keywords_str = g_string_append_c (keywords_str, ',');
+        }
+        return g_string_free (keywords_str, FALSE);
+}
 
 static void
 save_comment_to_metadata (const char  *uri,
    	                  CommentData *data)
 {
-        char      *keywords_str = NULL;
+        char      *keywords_str;
 	GList     *add_metadata = NULL;
         FileData  *file;
         char      *buf;
@@ -487,20 +456,14 @@ save_comment_to_metadata (const char  *uri,
                                tm.tm_sec );
         add_metadata = simple_add_metadata (add_metadata, TAG_NAME_SETS[COMMENT_DATE_TAG_NAMES][0], buf);
 
-        if (data->keywords_n > 0) {
-                if (data->keywords_n == 1)
-                        keywords_str = g_strdup (data->keywords[0]);
-                else
-                        keywords_str = g_strjoinv (",", data->keywords);
-        } else
-                keywords_str = g_strdup ("");
-
+        add_metadata = clear_metadata_tagset (add_metadata, TAG_NAME_SETS[KEYWORD_TAG_NAMES]);
+        keywords_str = get_keywords_str (data);
 	add_metadata = simple_add_metadata (add_metadata, TAG_NAME_SETS[KEYWORD_TAG_NAMES][0], keywords_str);
+        g_free (keywords_str);
 
 	update_and_save_metadata (file->path, file->path, add_metadata);
 	free_metadata (add_metadata);
 	file_data_unref (file);
-	g_free (keywords_str);
 }
 
 
@@ -596,14 +559,7 @@ save_comment (const char  *uri,
 	/* Convert data to strings. */
 
 	time_str = g_strdup_printf ("%ld", data->time);
-	if (data->keywords_n > 0) {
-		if (data->keywords_n == 1)
-			keywords_str = g_strdup (data->keywords[0]);
-		else
-			keywords_str = g_strjoinv (",", data->keywords);
-	} 
-	else
-		keywords_str = g_strdup ("");
+        keywords_str = get_keywords_str (data);
 
 	/* Escape text */
 
@@ -767,6 +723,7 @@ comments_save_categories (const char  *uri,
 			  CommentData *data)
 {
 	CommentData *new_data;
+        GSList *tmp;
 
 	if ((uri == NULL) || ! is_local_file (uri))
 		return;
@@ -785,17 +742,9 @@ comments_save_categories (const char  *uri,
 	}
 
 	comment_data_free_keywords (new_data);
-	if (data->keywords != NULL) {
-		int i;
 
-		new_data->keywords = g_new0 (char*, data->keywords_n + 1);
-		new_data->keywords_n = data->keywords_n;
-
-		for (i = 0; i < data->keywords_n; i++) {
-			char *k = g_strdup (data->keywords[i]);
-			new_data->keywords[i] = k;
-		}
-		new_data->keywords[i] = NULL;
+        for (tmp = data->keywords; tmp; tmp = g_slist_next (tmp)) {
+                new_data->keywords = g_slist_append (new_data->keywords, g_strdup (tmp->data));
 	}
 
 	save_comment (uri, new_data, TRUE);
@@ -807,36 +756,19 @@ void
 comment_data_remove_keyword (CommentData *data,
 			     const char  *keyword)
 {
-	gboolean  found = FALSE;
-	int       i;
+        GSList *found;
 
 	if ((data->keywords == NULL)
-	    || (data->keywords_n == 0)
 	    || (keyword == NULL))
 		return;
 
-	for (i = 0; i < data->keywords_n; i++)
-		if (g_utf8_collate (data->keywords[i], keyword) == 0) {
-			found = TRUE;
-			break;
-		}
-
+        found = g_slist_find_custom (data->keywords, keyword, (GCompareFunc) g_utf8_collate);
 	if (!found)
 		return;
 
-	g_free (data->keywords[i]);
-	for (; i < data->keywords_n - 1; i++)
-		data->keywords[i] = data->keywords[i + 1];
-	data->keywords[i] = NULL;
-
-	data->keywords_n--;
-	data->keywords = g_realloc (data->keywords,
-				    sizeof (char*) * (data->keywords_n + 1));
-
-	if (data->keywords_n == 0) {
-		g_free (data->keywords);
-		data->keywords = NULL;
-	}
+        data->keywords = g_slist_remove_link (data->keywords, found);
+        g_free (found->data);
+        g_slist_free (found);
 }
 
 
@@ -844,20 +776,16 @@ void
 comment_data_add_keyword (CommentData *data,
 			  const char  *keyword)
 {
-	int i;
+        GSList *found;
 
 	if (keyword == NULL)
 		return;
 
- 	for (i = 0; i < data->keywords_n; i++)
-		if (g_utf8_collate (data->keywords[i], keyword) == 0)
+        found = g_slist_find_custom (data->keywords, keyword, (GCompareFunc) g_utf8_collate);
+	if (found)
 			return;
 
-	data->keywords_n++;
-	data->keywords = g_realloc (data->keywords,
-				    sizeof (char*) * (data->keywords_n + 1));
-	data->keywords[data->keywords_n - 1] = g_strdup (keyword);
-	data->keywords[data->keywords_n] = NULL;
+        data->keywords = g_slist_append (data->keywords, g_strdup (keyword));
 }
 
 
@@ -873,7 +801,7 @@ comment_data_is_void (CommentData *data)
 		return FALSE;
 	if ((data->comment != NULL) && (*data->comment != 0))
 		return FALSE;
-	if (data->keywords_n > 0)
+	if (data->keywords)
 		return FALSE;
 
 	return TRUE;
@@ -1025,7 +953,7 @@ _get_comment_as_string_common (CommentData *data,
 	if ((data->comment == NULL)
 	    && (data->place == NULL)
 	    && (data->time == 0)) {
-		if (data->keywords_n > 0)
+		if (data->keywords)
 			as_string = NULL;
 		else if (markup_escape)
 			as_string = g_markup_escape_text (_("(No Comment)"), -1);
diff --git a/libgthumb/comments.h b/libgthumb/comments.h
index 0a8e8e5..ff64cb1 100644
--- a/libgthumb/comments.h
+++ b/libgthumb/comments.h
@@ -32,8 +32,7 @@ typedef struct {
 				     * format. */
 	time_t     time;
 	char      *comment;
-	char     **keywords;
-	int        keywords_n;
+        GSList    *keywords;
 	gboolean   utf8_format;     /* TRUE if text is saved in UTF8 format.
 				     * gthumb for GNOME 1.x saved text in
 				     * locale format, gthumb for
diff --git a/libgthumb/gth-exif-utils.c b/libgthumb/gth-exif-utils.c
index ca68a79..80fd645 100644
--- a/libgthumb/gth-exif-utils.c
+++ b/libgthumb/gth-exif-utils.c
@@ -338,7 +338,6 @@ get_metadata_tagset_string (FileData *fd, const char *tagnames[])
 		GList *search_result = g_list_find_custom (fd->metadata, tagnames[i], (GCompareFunc) metadata_search);
 		if (search_result != NULL) {
 			GthMetadata *md_entry = search_result->data;
-			g_free (string);
 			string = g_strdup (md_entry->formatted_value);
 		}
 	}
@@ -347,6 +346,30 @@ get_metadata_tagset_string (FileData *fd, const char *tagnames[])
 }
 
 
+GSList *
+get_metadata_tagset_list (FileData *fd, const char *tagnames[])
+{
+	int     i;
+        GSList *list = NULL;
+        GList  *tmp;
+
+	/* Searches for the best tag from a list of acceptable tag names */
+
+	update_metadata (fd);
+
+	for (i = 0; tagnames[i] != NULL; i++) {
+                for (tmp = fd->metadata; tmp; tmp = g_list_next (tmp)) {
+                        GthMetadata *md_entry = tmp->data;
+                        if (!strcmp (md_entry->full_name, tagnames[i])) {
+                                list = g_slist_append (list, g_strdup (md_entry->formatted_value));
+                        }
+                }
+        }
+
+	return list;
+}
+
+
 GList *
 simple_add_metadata (GList       *metadata,
                      const gchar *key,
@@ -585,3 +608,18 @@ swap_fields (GList *metadata, const char *tag1, const char *tag2)
         entry1->raw_value = entry2->raw_value;
         entry2->raw_value = tmp;
 }
+
+GList *
+clear_metadata_tagset (GList        *metadata,
+                       const char   *tagnames[])
+{
+        int i;
+        GList *tmp_metadata = metadata;
+
+        for (i = 0; tagnames[i]; ++i) {
+                tmp_metadata = simple_add_metadata (tmp_metadata, tagnames[i], "");
+        }
+
+        return tmp_metadata;
+}
+
diff --git a/libgthumb/gth-exif-utils.h b/libgthumb/gth-exif-utils.h
index 56bf4c9..ec4d890 100644
--- a/libgthumb/gth-exif-utils.h
+++ b/libgthumb/gth-exif-utils.h
@@ -92,6 +92,8 @@ char *        get_metadata_string         (FileData     *fd,
 					   const char *tagname);
 char *	      get_metadata_tagset_string  (FileData     *fd,
 					   const char   *tagnames[]);
+GSList *      get_metadata_tagset_list    (FileData     *fd,
+					   const char   *tagnames[]);
 GList *       simple_add_metadata         (GList        *metadata,
 			                   const gchar  *key,
 					   const gchar  *value);
@@ -110,4 +112,7 @@ void          update_metadata		  (FileData	*fd);
 void          swap_fields                 (GList        *metadata,
 					   const char   *tag1,
 				           const char   *tag2);
+GList *       clear_metadata_tagset       (GList        *metadata,
+                                           const char   *tagnames[]);
+
 #endif /* EXIF_UTILS_H */
diff --git a/libgthumb/gth-exiv2-utils.cpp b/libgthumb/gth-exiv2-utils.cpp
index 46e7d4b..308bb6c 100644
--- a/libgthumb/gth-exiv2-utils.cpp
+++ b/libgthumb/gth-exiv2-utils.cpp
@@ -598,12 +598,27 @@ write_metadata (const char *from_file,
 			if (metadatum->full_name != NULL
                             && metadatum->raw_value != NULL) {
 				if (g_str_has_prefix (metadatum->full_name, "Exif")) {
+                                        // Remove existing tags of the same type
+                                        Exiv2::ExifData::iterator iter = ed.findKey (Exiv2::ExifKey (metadatum->full_name));
+                                        if (iter != ed.end ())
+                                                ed.erase (iter);
+                                        // Add tag
 					ed[metadatum->full_name] = metadatum->raw_value;
 				}
 				else if (g_str_has_prefix (metadatum->full_name, "Iptc")) {
+                                        // Remove existing tags of the same type
+                                        Exiv2::IptcData::iterator iter = id.findKey (Exiv2::IptcKey (metadatum->full_name));
+                                        if (iter != id.end ())
+                                                id.erase (iter);
+                                        // Add tag
 					id[metadatum->full_name] = metadatum->raw_value;
 		        	}
 				else if (g_str_has_prefix (metadatum->full_name, "Xmp")) {
+                                        // Remove existing tags of the same type
+                                        Exiv2::XmpData::iterator iter = xd.findKey (Exiv2::XmpKey (metadatum->full_name));
+                                        if (iter != xd.end ())
+                                                xd.erase (iter);
+                                        // Add tag
 					xd[metadatum->full_name] = metadatum->raw_value;
 		        	}
 			}
diff --git a/libgthumb/gth-filter.c b/libgthumb/gth-filter.c
index 57c79ad..ecfcefd 100644
--- a/libgthumb/gth-filter.c
+++ b/libgthumb/gth-filter.c
@@ -229,13 +229,13 @@ test_integer (GthTest *test,
 
 static gboolean
 test_keywords (GthTest  *test,
- 	       char    **keywords,
- 	       int       keywords_n)
+               GSList   *keywords)
 {
 	gboolean result;
-	int      p, i;
+	int      p;
+        GSList  *tmp;
 
-	if ((test->data.s == NULL) || (keywords == NULL) || (keywords_n == 0))
+	if ((test->data.s == NULL) || (keywords == NULL))
 		return test->negative;
 
 	if ((test->op != GTH_TEST_OP_CONTAINS) && (test->op != GTH_TEST_OP_CONTAINS_ALL))
@@ -248,8 +248,8 @@ test_keywords (GthTest  *test,
 	for (p = 0; test->patterns[p] != NULL; p++) {
 		gboolean keyword_present = FALSE;
 		
-		for (i = 0; ! keyword_present && (i < keywords_n); i++) {
-			char *value2 = g_utf8_casefold (keywords[i], -1);
+		for (tmp = keywords; ! keyword_present && tmp; tmp = g_slist_next (tmp)) {
+			char *value2 = g_utf8_casefold (tmp->data, -1);
 				
 			keyword_present = g_utf8_collate (value2, test->patterns[p]) == 0;
 			g_free (value2);
@@ -337,7 +337,7 @@ gth_test_match (GthTest  *test,
 		        	  || test_string (test, fdata->comment_data->comment)
 		          	  || test_string (test, fdata->comment_data->place));
 		        if (! result && (fdata->comment_data != NULL))
-		        	result = test_keywords (test, fdata->comment_data->keywords, fdata->comment_data->keywords_n);
+				result = test_keywords (test, fdata->comment_data->keywords);
 		} else
 			result = test->negative;
 		break;
@@ -349,7 +349,7 @@ gth_test_match (GthTest  *test,
 	case GTH_TEST_SCOPE_KEYWORDS:
 		file_data_load_comment_data (fdata);
 		if (fdata->comment_data != NULL)
-			result = test_keywords (test, fdata->comment_data->keywords, fdata->comment_data->keywords_n);
+			result = test_keywords (test, fdata->comment_data->keywords);
 		else
 			result = test->negative;
 		break;
diff --git a/src/dlg-categories.c b/src/dlg-categories.c
index 5fcc896..1efd5fd 100644
--- a/src/dlg-categories.c
+++ b/src/dlg-categories.c
@@ -746,6 +746,7 @@ dlg_categories_update (GtkWidget *dlg)
 	CommentData   *cdata = NULL;
 	GList         *scan;
 	GList         *other_keys = NULL;
+        GSList        *tmp1, *tmp2;
 
 
 	g_return_if_fail (dlg != NULL);
@@ -776,7 +777,6 @@ dlg_categories_update (GtkWidget *dlg)
 		/* remove a category if it is not in all comments. */
 		for (scan = data->file_list->next; scan; scan = scan->next) {
 			CommentData *scan_cdata;
-			int          i;
 
 			scan_cdata = comments_load_comment (scan->data, TRUE);
 
@@ -785,13 +785,12 @@ dlg_categories_update (GtkWidget *dlg)
 				break;
 			}
 
-			for (i = 0; i < cdata->keywords_n; i++) {
-				char     *k1 = cdata->keywords[i];
+			for (tmp1 = cdata->keywords; tmp1; tmp1 = g_slist_next (tmp1)) {
+				char     *k1 = tmp1->data;
 				gboolean  found = FALSE;
-				int       j;
 
-				for (j = 0; j < scan_cdata->keywords_n; j++) {
-					char *k2 = scan_cdata->keywords[j];
+				for (tmp2 =  scan_cdata->keywords; tmp2; tmp2 = g_slist_next (tmp2)) {
+					char *k2 = tmp2->data;
 					if (strcmp (k1, k2) == 0) {
 						found = TRUE;
 						break;
@@ -808,21 +807,19 @@ dlg_categories_update (GtkWidget *dlg)
 
 	for (scan = data->file_list; scan; scan = scan->next) {
 		CommentData *scan_cdata;
-		int          j;
 
 		scan_cdata = comments_load_comment (scan->data, TRUE);
 
 		if (scan_cdata == NULL)
 			continue;
 
-		for (j = 0; j < scan_cdata->keywords_n; j++) {
-			char     *k2 = scan_cdata->keywords[j];
+                for (tmp2 =  scan_cdata->keywords; tmp2; tmp2 = g_slist_next (tmp2)) {
+                        char *k2 = tmp2->data;
 			gboolean  found = FALSE;
-			int       i;
 
 			if (cdata != NULL)
-				for (i = 0; i < cdata->keywords_n; i++) {
-					char *k1 = cdata->keywords[i];
+                                for (tmp1 = cdata->keywords; tmp1; tmp1 = g_slist_next (tmp1)) {
+                                        char     *k1 = tmp1->data;
 					if (strcmp (k1, k2) == 0) {
 						found = TRUE;
 						break;
@@ -837,9 +834,7 @@ dlg_categories_update (GtkWidget *dlg)
 	}
 
 	if (cdata != NULL) {
-		int i;
-
-		for (i = 0; i < cdata->keywords_n; i++) {
+                for (tmp1 = cdata->keywords; tmp1; tmp1 = g_slist_next (tmp1)) {
 			GtkTreeIter  iter;
 
 			gtk_list_store_append (data->keywords_list_model,
@@ -849,7 +844,7 @@ dlg_categories_update (GtkWidget *dlg)
 					    IS_EDITABLE_COLUMN, FALSE,
 					    HAS_THIRD_STATE_COLUMN, FALSE,
 					    USE_CATEGORY_COLUMN, 1,
-					    CATEGORY_COLUMN, cdata->keywords[i],
+					    CATEGORY_COLUMN, tmp1->data,
 					    -1);
 		}
 	}
diff --git a/src/dlg-image-prop.c b/src/dlg-image-prop.c
index 8539e66..39f11b6 100644
--- a/src/dlg-image-prop.c
+++ b/src/dlg-image-prop.c
@@ -281,6 +281,7 @@ update_comment (DialogData *data)
 {
 	CommentData *cdata;
 	char        *comment;
+        GSList      *tmp;
 
 	g_return_if_fail (GTK_IS_WIDGET (data->i_categories_label));
 	g_return_if_fail (GTK_IS_TEXT_BUFFER (data->i_comment_textbuffer));
@@ -324,16 +325,17 @@ update_comment (DialogData *data)
 					    &end_iter);
 	}
 
-	if (cdata->keywords_n > 0) {
+	if (cdata->keywords) {
 		GString   *keywords;
-		int        i;
 
-		keywords = g_string_new (cdata->keywords[0]);
-		for (i = 1; i < cdata->keywords_n; i++) {
+		keywords = g_string_new (NULL);
+                for (tmp = cdata->keywords; tmp; tmp = g_slist_next (tmp)) {
+			g_string_append (keywords, tmp->data);
+                        if (g_slist_next (tmp))
 			g_string_append (keywords, ", ");
-			g_string_append (keywords, cdata->keywords[i]);
+                        else
+                                g_string_append_c (keywords, '.');
 		}
-		g_string_append (keywords, ".");
 
 		gtk_label_set_text (GTK_LABEL (data->i_categories_label), keywords->str);
 
diff --git a/src/dlg-search.c b/src/dlg-search.c
index 956dc51..2135d45 100644
--- a/src/dlg-search.c
+++ b/src/dlg-search.c
@@ -727,17 +727,17 @@ dlg_search_ui (GthBrowser *browser,
 
 static gboolean
 pattern_matched_by_keywords (char  *pattern,
-			     char **keywords)
+			     GSList *keywords)
 {
 	GPatternSpec *spec;
 	gboolean      retval = FALSE;
-	int           i;
 	char	     *norm_pattern;
+        GSList       *tmp;
 
 	if (pattern == NULL)
 		return TRUE;
 
-	if ((keywords == NULL) || (keywords[0] == NULL))
+	if (keywords == NULL)
 		return FALSE;
 
 	norm_pattern = g_utf8_normalize (pattern,
@@ -746,12 +746,12 @@ pattern_matched_by_keywords (char  *pattern,
 	spec = g_pattern_spec_new (norm_pattern);
 	g_free (norm_pattern);
 
-	for (i = 0; keywords[i] != NULL; i++) {
+	for (tmp = keywords; tmp; tmp = g_slist_next (tmp)) {
 		char     *case_string;
 		char     *norm_string;
 		gboolean  match;
 
-		case_string = g_utf8_casefold (keywords[i], -1);
+		case_string = g_utf8_casefold (tmp->data, -1);
 		norm_string = g_utf8_normalize (case_string,
 		                                -1,
 		                                G_NORMALIZE_NFC);
@@ -867,9 +867,9 @@ add_parents_comments (CommentData *comment_data,
 		parent_data = g_hash_table_lookup (data->folders_comment, parent);
 
 		if (parent_data != NULL) {
-			int i;
-			for (i = 0; i < parent_data->keywords_n; i++)
-				comment_data_add_keyword (comment_data, parent_data->keywords[i]);
+                        GSList *tmp;
+			for (tmp = parent_data->keywords; tmp; tmp = g_slist_next (tmp))
+				comment_data_add_keyword (comment_data, tmp->data);
 		}
 
 	} while (! uri_is_root (parent));
@@ -889,7 +889,6 @@ file_respects_search_criteria (DialogData *data,
 	int          i;
 	char        *comment;
 	char        *place;
-	int          keywords_n;
 	time_t       time = 0;
 	const char  *name_only;
 
@@ -906,12 +905,10 @@ file_respects_search_criteria (DialogData *data,
 	if (comment_data == NULL) {
 		comment = NULL;
 		place = NULL;
-		keywords_n = 0;
 		time = 0;
 	} else {
 		comment = comment_data->comment;
 		place = comment_data->place;
-		keywords_n = comment_data->keywords_n;
 		time = comment_data->time;
 	}
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]