From a8a8bcd86a01e006b3f45ce916ad626fe3efe70c Mon Sep 17 00:00:00 2001 From: Dirk Hohndel Date: Thu, 10 Jul 2014 09:39:51 -0700 Subject: Add helper functions to ensure we have sane tag lists There should never be empty or duplicate tags on those lists. Signed-off-by: Dirk Hohndel --- dive.c | 24 ++++++++++++++++++++++++ dive.h | 3 +++ qt-ui/maintab.cpp | 4 ++-- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/dive.c b/dive.c index ce04bd54e..349bc104a 100644 --- a/dive.c +++ b/dive.c @@ -2089,6 +2089,30 @@ static void join_dive_computers(struct divecomputer *res, struct divecomputer *a remove_redundant_dc(res, prefer_downloaded); } +static bool tag_seen_before(struct tag_entry *start, struct tag_entry *before) +{ + while(start && start != before) { + if (same_string(start->tag->name, before->tag->name)) + return true; + start = start->next; + } + return false; +} + +/* remove duplicates and empty nodes */ +void taglist_cleanup(struct tag_entry **tag_list) +{ + struct tag_entry **tl = tag_list; + while (*tl) { + /* skip tags that are empty or that we have seen before */ + if (same_string((*tl)->tag->name, "") || tag_seen_before(*tag_list, *tl)) { + *tl = (*tl)->next; + continue; + } + tl = &(*tl)->next; + } +} + int taglist_get_tagstring(struct tag_entry *tag_list, char *buffer, int len) { int i = 0; diff --git a/dive.h b/dive.h index 60693f2a1..ef57e2964 100644 --- a/dive.h +++ b/dive.h @@ -197,6 +197,9 @@ struct divetag *taglist_add_tag(struct tag_entry **tag_list, const char *tag); */ int taglist_get_tagstring(struct tag_entry *tag_list, char *buffer, int len); +/* cleans up a list: removes empty tags and duplicates */ +void taglist_cleanup(struct tag_entry **tag_list); + void taglist_init_global(); void taglist_free(struct tag_entry *tag_list); diff --git a/qt-ui/maintab.cpp b/qt-ui/maintab.cpp index f84c63ec2..6fc4db8df 100644 --- a/qt-ui/maintab.cpp +++ b/qt-ui/maintab.cpp @@ -934,9 +934,9 @@ void MainTab::on_timeEdit_timeChanged(const QTime &time) void MainTab::saveTags() { struct dive *cd = current_dive; - Q_FOREACH(const QString& tag, ui.tagWidget->getBlockStringList()){ + Q_FOREACH (const QString& tag, ui.tagWidget->getBlockStringList()) taglist_add_tag(&displayed_dive.tag_list, tag.toUtf8().data()); - } + taglist_cleanup(&displayed_dive.tag_list); MODIFY_SELECTED_DIVES( QString tag; taglist_free(mydive->tag_list); -- cgit v1.2.3-70-g09d2