diff --git a/src/lib/xiph/FlacStreamMetadata.cxx b/src/lib/xiph/FlacStreamMetadata.cxx index bf96f1622..cebe3b79f 100644 --- a/src/lib/xiph/FlacStreamMetadata.cxx +++ b/src/lib/xiph/FlacStreamMetadata.cxx @@ -68,11 +68,12 @@ flac_parse_mixramp(const FLAC__StreamMetadata_VorbisComment &vc) * Checks if the specified name matches the entry's name, and if yes, * returns the comment value; */ -static const char * -flac_comment_value(const FLAC__StreamMetadata_VorbisComment_Entry *entry, - const char *name) noexcept +static StringView +GetFlacCommentValue(const FLAC__StreamMetadata_VorbisComment_Entry *entry, + StringView name) noexcept { - return vorbis_comment_value((const char *)entry->entry, name); + return GetVorbisCommentValue({(const char *)entry->entry, entry->length}, + name); } /** @@ -81,11 +82,11 @@ flac_comment_value(const FLAC__StreamMetadata_VorbisComment_Entry *entry, */ static bool flac_copy_comment(const FLAC__StreamMetadata_VorbisComment_Entry *entry, - const char *name, TagType tag_type, + StringView name, TagType tag_type, TagHandler &handler) noexcept { - const char *value = flac_comment_value(entry, name); - if (value != nullptr) { + const auto value = GetFlacCommentValue(entry, name); + if (!value.IsNull()) { handler.OnTag(tag_type, value); return true; } diff --git a/src/lib/xiph/VorbisComments.cxx b/src/lib/xiph/VorbisComments.cxx index b0f1cba16..d2315e708 100644 --- a/src/lib/xiph/VorbisComments.cxx +++ b/src/lib/xiph/VorbisComments.cxx @@ -50,14 +50,12 @@ vorbis_comments_to_replay_gain(ReplayGainInfo &rgi, char **comments) noexcept * the comment value into the tag. */ static bool -vorbis_copy_comment(const char *comment, - const char *name, TagType tag_type, +vorbis_copy_comment(StringView comment, + StringView name, TagType tag_type, TagHandler &handler) noexcept { - const char *value; - - value = vorbis_comment_value(comment, name); - if (value != nullptr) { + const auto value = GetVorbisCommentValue(comment, name); + if (!value.IsNull()) { handler.OnTag(tag_type, value); return true; } diff --git a/src/tag/MixRamp.cxx b/src/tag/MixRamp.cxx index a0e1457de..876061410 100644 --- a/src/tag/MixRamp.cxx +++ b/src/tag/MixRamp.cxx @@ -72,8 +72,8 @@ ParseMixRampVorbis(MixRampInfo &info, const char *entry) const char *entry; gcc_pure - StringView operator[](const char *n) const noexcept { - return vorbis_comment_value(entry, n); + StringView operator[](StringView n) const noexcept { + return GetVorbisCommentValue(entry, n); } }; diff --git a/src/tag/ReplayGain.cxx b/src/tag/ReplayGain.cxx index 92eb7c925..f23f23e3c 100644 --- a/src/tag/ReplayGain.cxx +++ b/src/tag/ReplayGain.cxx @@ -70,14 +70,14 @@ ParseReplayGainTag(ReplayGainInfo &info, const char *name, const char *value) } bool -ParseReplayGainVorbis(ReplayGainInfo &info, const char *entry) +ParseReplayGainVorbis(ReplayGainInfo &info, StringView entry) { struct VorbisCommentEntry { - const char *entry; + StringView entry; gcc_pure - const char *operator[](const char *n) const noexcept { - return vorbis_comment_value(entry, n); + const char *operator[](StringView n) const noexcept { + return GetVorbisCommentValue(entry, n).data; } }; diff --git a/src/tag/ReplayGain.hxx b/src/tag/ReplayGain.hxx index 4f231f5f6..db0b4a715 100644 --- a/src/tag/ReplayGain.hxx +++ b/src/tag/ReplayGain.hxx @@ -20,12 +20,13 @@ #ifndef MPD_TAG_REPLAY_GAIN_HXX #define MPD_TAG_REPLAY_GAIN_HXX +struct StringView; struct ReplayGainInfo; bool ParseReplayGainTag(ReplayGainInfo &info, const char *name, const char *value); bool -ParseReplayGainVorbis(ReplayGainInfo &info, const char *entry); +ParseReplayGainVorbis(ReplayGainInfo &info, StringView entry); #endif diff --git a/src/tag/VorbisComment.cxx b/src/tag/VorbisComment.cxx index c87d393e8..dc9e822fe 100644 --- a/src/tag/VorbisComment.cxx +++ b/src/tag/VorbisComment.cxx @@ -18,23 +18,21 @@ */ #include "VorbisComment.hxx" -#include "util/ASCII.hxx" +#include "util/StringView.hxx" #include -#include -const char * -vorbis_comment_value(const char *entry, const char *name) noexcept +StringView +GetVorbisCommentValue(StringView entry, StringView name) noexcept { - assert(entry != nullptr); - assert(name != nullptr); - assert(*name != 0); + assert(!name.empty()); - const size_t length = strlen(name); - - if (StringEqualsCaseASCII(entry, name, length) && - entry[length] == '=') - return entry + length + 1; + if (entry.StartsWithIgnoreCase(name) && + entry.size > name.size && + entry[name.size] == '=') { + entry.skip_front(name.size + 1); + return entry; + } return nullptr; } diff --git a/src/tag/VorbisComment.hxx b/src/tag/VorbisComment.hxx index 6b45c1737..83c3a7fa6 100644 --- a/src/tag/VorbisComment.hxx +++ b/src/tag/VorbisComment.hxx @@ -22,12 +22,14 @@ #include "util/Compiler.h" +struct StringView; + /** * Checks if the specified name matches the entry's name, and if yes, * returns the comment value. */ gcc_pure -const char * -vorbis_comment_value(const char *entry, const char *name) noexcept; +StringView +GetVorbisCommentValue(StringView entry, StringView name) noexcept; #endif