tag/VorbisComment: use struct StringView

This commit is contained in:
Max Kellermann 2019-08-14 11:33:00 +02:00
parent 8e0d810968
commit 9ae9b2c18f
7 changed files with 34 additions and 34 deletions

View File

@ -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, * Checks if the specified name matches the entry's name, and if yes,
* returns the comment value; * returns the comment value;
*/ */
static const char * static StringView
flac_comment_value(const FLAC__StreamMetadata_VorbisComment_Entry *entry, GetFlacCommentValue(const FLAC__StreamMetadata_VorbisComment_Entry *entry,
const char *name) noexcept 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 static bool
flac_copy_comment(const FLAC__StreamMetadata_VorbisComment_Entry *entry, flac_copy_comment(const FLAC__StreamMetadata_VorbisComment_Entry *entry,
const char *name, TagType tag_type, StringView name, TagType tag_type,
TagHandler &handler) noexcept TagHandler &handler) noexcept
{ {
const char *value = flac_comment_value(entry, name); const auto value = GetFlacCommentValue(entry, name);
if (value != nullptr) { if (!value.IsNull()) {
handler.OnTag(tag_type, value); handler.OnTag(tag_type, value);
return true; return true;
} }

View File

@ -50,14 +50,12 @@ vorbis_comments_to_replay_gain(ReplayGainInfo &rgi, char **comments) noexcept
* the comment value into the tag. * the comment value into the tag.
*/ */
static bool static bool
vorbis_copy_comment(const char *comment, vorbis_copy_comment(StringView comment,
const char *name, TagType tag_type, StringView name, TagType tag_type,
TagHandler &handler) noexcept TagHandler &handler) noexcept
{ {
const char *value; const auto value = GetVorbisCommentValue(comment, name);
if (!value.IsNull()) {
value = vorbis_comment_value(comment, name);
if (value != nullptr) {
handler.OnTag(tag_type, value); handler.OnTag(tag_type, value);
return true; return true;
} }

View File

@ -72,8 +72,8 @@ ParseMixRampVorbis(MixRampInfo &info, const char *entry)
const char *entry; const char *entry;
gcc_pure gcc_pure
StringView operator[](const char *n) const noexcept { StringView operator[](StringView n) const noexcept {
return vorbis_comment_value(entry, n); return GetVorbisCommentValue(entry, n);
} }
}; };

View File

@ -70,14 +70,14 @@ ParseReplayGainTag(ReplayGainInfo &info, const char *name, const char *value)
} }
bool bool
ParseReplayGainVorbis(ReplayGainInfo &info, const char *entry) ParseReplayGainVorbis(ReplayGainInfo &info, StringView entry)
{ {
struct VorbisCommentEntry { struct VorbisCommentEntry {
const char *entry; StringView entry;
gcc_pure gcc_pure
const char *operator[](const char *n) const noexcept { const char *operator[](StringView n) const noexcept {
return vorbis_comment_value(entry, n); return GetVorbisCommentValue(entry, n).data;
} }
}; };

View File

@ -20,12 +20,13 @@
#ifndef MPD_TAG_REPLAY_GAIN_HXX #ifndef MPD_TAG_REPLAY_GAIN_HXX
#define MPD_TAG_REPLAY_GAIN_HXX #define MPD_TAG_REPLAY_GAIN_HXX
struct StringView;
struct ReplayGainInfo; struct ReplayGainInfo;
bool bool
ParseReplayGainTag(ReplayGainInfo &info, const char *name, const char *value); ParseReplayGainTag(ReplayGainInfo &info, const char *name, const char *value);
bool bool
ParseReplayGainVorbis(ReplayGainInfo &info, const char *entry); ParseReplayGainVorbis(ReplayGainInfo &info, StringView entry);
#endif #endif

View File

@ -18,23 +18,21 @@
*/ */
#include "VorbisComment.hxx" #include "VorbisComment.hxx"
#include "util/ASCII.hxx" #include "util/StringView.hxx"
#include <assert.h> #include <assert.h>
#include <string.h>
const char * StringView
vorbis_comment_value(const char *entry, const char *name) noexcept GetVorbisCommentValue(StringView entry, StringView name) noexcept
{ {
assert(entry != nullptr); assert(!name.empty());
assert(name != nullptr);
assert(*name != 0);
const size_t length = strlen(name); if (entry.StartsWithIgnoreCase(name) &&
entry.size > name.size &&
if (StringEqualsCaseASCII(entry, name, length) && entry[name.size] == '=') {
entry[length] == '=') entry.skip_front(name.size + 1);
return entry + length + 1; return entry;
}
return nullptr; return nullptr;
} }

View File

@ -22,12 +22,14 @@
#include "util/Compiler.h" #include "util/Compiler.h"
struct StringView;
/** /**
* Checks if the specified name matches the entry's name, and if yes, * Checks if the specified name matches the entry's name, and if yes,
* returns the comment value. * returns the comment value.
*/ */
gcc_pure gcc_pure
const char * StringView
vorbis_comment_value(const char *entry, const char *name) noexcept; GetVorbisCommentValue(StringView entry, StringView name) noexcept;
#endif #endif