From 2e72a9b262ac71a8a7e8ed9b00efa80597d5f17d Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 17 Mar 2010 23:12:21 +0100 Subject: tag: added function tag_merge_replace() Like tag_merge(), but can deal with NULL parameters, and frees both tag objects. --- src/cue/cue_tag.c | 22 +--------------------- src/tag.c | 16 ++++++++++++++++ src/tag.h | 9 +++++++++ 3 files changed, 26 insertions(+), 21 deletions(-) diff --git a/src/cue/cue_tag.c b/src/cue/cue_tag.c index ce8202a8..6251b03e 100644 --- a/src/cue/cue_tag.c +++ b/src/cue/cue_tag.c @@ -173,7 +173,6 @@ cue_tag_file( FILE* fp, { struct tag* cd_tag = NULL; struct tag* track_tag = NULL; - struct tag* merge_tag = NULL; struct Cd* cd = NULL; if (tnum > 256) @@ -199,26 +198,7 @@ cue_tag_file( FILE* fp, cd_delete(cd); } - if ((cd_tag != NULL) && (track_tag != NULL)) - { - merge_tag = tag_merge(cd_tag, track_tag); - tag_free(cd_tag); - tag_free(track_tag); - return merge_tag; - } - - else if (cd_tag != NULL) - { - return cd_tag; - } - - else if (track_tag != NULL) - { - return track_tag; - } - - else - return NULL; + return tag_merge_replace(cd_tag, track_tag); } struct tag* diff --git a/src/tag.c b/src/tag.c index 34205d20..c34256b7 100644 --- a/src/tag.c +++ b/src/tag.c @@ -247,6 +247,22 @@ tag_merge(const struct tag *base, const struct tag *add) return ret; } +struct tag * +tag_merge_replace(struct tag *base, struct tag *add) +{ + if (add == NULL) + return base; + + if (base == NULL) + return add; + + struct tag *tag = tag_merge(base, add); + tag_free(base); + tag_free(add); + + return tag; +} + const char * tag_get_value(const struct tag *tag, enum tag_type type) { diff --git a/src/tag.h b/src/tag.h index 4b72dd18..75a86b38 100644 --- a/src/tag.h +++ b/src/tag.h @@ -165,6 +165,15 @@ struct tag *tag_dup(const struct tag *tag); struct tag * tag_merge(const struct tag *base, const struct tag *add); +/** + * Merges the data from two tags. Any of the two may be NULL. Both + * are freed by this function. + * + * @return a newly allocated tag, which must be freed with tag_free() + */ +struct tag * +tag_merge_replace(struct tag *base, struct tag *add); + /** * Returns true if the tag contains no items. This ignores the "time" * attribute. -- cgit v1.2.3