[gthumb] Use GSList* instead of char** to store keywords - bug 547620
- From: Michael J. Chudobiak <mjc src gnome org>
- To: svn-commits-list gnome org
- Subject: [gthumb] Use GSList* instead of char** to store keywords - bug 547620
- Date: Sat, 2 May 2009 12:14:14 -0400 (EDT)
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]