tag: convert to C++
This commit is contained in:
parent
48025c2279
commit
47911f9544
24
Makefile.am
24
Makefile.am
@ -140,7 +140,6 @@ mpd_headers = \
|
|||||||
src/stats.h \
|
src/stats.h \
|
||||||
src/tag.h \
|
src/tag.h \
|
||||||
src/tag_internal.h \
|
src/tag_internal.h \
|
||||||
src/tag_pool.h \
|
|
||||||
src/tag_table.h \
|
src/tag_table.h \
|
||||||
src/tag_ape.h \
|
src/tag_ape.h \
|
||||||
src/tag_id3.h \
|
src/tag_id3.h \
|
||||||
@ -291,8 +290,9 @@ src_mpd_SOURCES = \
|
|||||||
src/socket_util.c \
|
src/socket_util.c \
|
||||||
src/StateFile.cxx src/StateFile.hxx \
|
src/StateFile.cxx src/StateFile.hxx \
|
||||||
src/Stats.cxx \
|
src/Stats.cxx \
|
||||||
src/tag.c \
|
src/Tag.cxx \
|
||||||
src/tag_pool.c \
|
src/TagNames.c \
|
||||||
|
src/TagPool.cxx src/TagPool.hxx \
|
||||||
src/TagPrint.cxx src/TagPrint.hxx \
|
src/TagPrint.cxx src/TagPrint.hxx \
|
||||||
src/TagSave.cxx src/TagSave.hxx \
|
src/TagSave.cxx src/TagSave.hxx \
|
||||||
src/tag_handler.c src/tag_handler.h \
|
src/tag_handler.c src/tag_handler.h \
|
||||||
@ -1049,7 +1049,7 @@ test_DumpDatabase_SOURCES = test/DumpDatabase.cxx \
|
|||||||
src/PlaylistVector.cxx src/PlaylistDatabase.cxx \
|
src/PlaylistVector.cxx src/PlaylistDatabase.cxx \
|
||||||
src/DatabaseLock.cxx src/DatabaseSave.cxx \
|
src/DatabaseLock.cxx src/DatabaseSave.cxx \
|
||||||
src/Song.cxx src/song_sort.c src/SongSave.cxx \
|
src/Song.cxx src/song_sort.c src/SongSave.cxx \
|
||||||
src/tag.c src/tag_pool.c src/TagSave.cxx \
|
src/Tag.cxx src/TagNames.c src/TagPool.cxx src/TagSave.cxx \
|
||||||
src/path.c \
|
src/path.c \
|
||||||
src/SongFilter.cxx \
|
src/SongFilter.cxx \
|
||||||
src/TextFile.cxx \
|
src/TextFile.cxx \
|
||||||
@ -1063,7 +1063,7 @@ test_run_input_SOURCES = test/run_input.c \
|
|||||||
test/stdbin.h \
|
test/stdbin.h \
|
||||||
src/io_thread.c src/io_thread.h \
|
src/io_thread.c src/io_thread.h \
|
||||||
src/conf.c src/tokenizer.c src/utils.c src/string_util.c\
|
src/conf.c src/tokenizer.c src/utils.c src/string_util.c\
|
||||||
src/tag.c src/tag_pool.c src/TagSave.cxx \
|
src/Tag.cxx src/TagNames.c src/TagPool.cxx src/TagSave.cxx \
|
||||||
src/fd_util.c
|
src/fd_util.c
|
||||||
|
|
||||||
test_dump_text_file_LDADD = \
|
test_dump_text_file_LDADD = \
|
||||||
@ -1074,7 +1074,7 @@ test_dump_text_file_SOURCES = test/dump_text_file.c \
|
|||||||
test/stdbin.h \
|
test/stdbin.h \
|
||||||
src/io_thread.c src/io_thread.h \
|
src/io_thread.c src/io_thread.h \
|
||||||
src/conf.c src/tokenizer.c src/utils.c src/string_util.c\
|
src/conf.c src/tokenizer.c src/utils.c src/string_util.c\
|
||||||
src/tag.c src/tag_pool.c \
|
src/Tag.cxx src/TagNames.c src/TagPool.cxx \
|
||||||
src/text_input_stream.c src/fifo_buffer.c \
|
src/text_input_stream.c src/fifo_buffer.c \
|
||||||
src/fd_util.c
|
src/fd_util.c
|
||||||
|
|
||||||
@ -1092,7 +1092,7 @@ test_dump_playlist_SOURCES = test/dump_playlist.cxx \
|
|||||||
src/io_thread.c src/io_thread.h \
|
src/io_thread.c src/io_thread.h \
|
||||||
src/conf.c src/tokenizer.c src/utils.c src/string_util.c\
|
src/conf.c src/tokenizer.c src/utils.c src/string_util.c\
|
||||||
src/uri.c \
|
src/uri.c \
|
||||||
src/Song.cxx src/tag.c src/tag_pool.c src/TagSave.cxx \
|
src/Song.cxx src/Tag.cxx src/TagNames.c src/TagPool.cxx src/TagSave.cxx \
|
||||||
src/tag_handler.c src/tag_file.c \
|
src/tag_handler.c src/tag_file.c \
|
||||||
src/audio_check.c src/pcm_buffer.c \
|
src/audio_check.c src/pcm_buffer.c \
|
||||||
src/text_input_stream.c src/fifo_buffer.c \
|
src/text_input_stream.c src/fifo_buffer.c \
|
||||||
@ -1117,7 +1117,7 @@ test_run_decoder_SOURCES = test/run_decoder.c \
|
|||||||
test/stdbin.h \
|
test/stdbin.h \
|
||||||
src/io_thread.c src/io_thread.h \
|
src/io_thread.c src/io_thread.h \
|
||||||
src/conf.c src/tokenizer.c src/utils.c src/string_util.c src/log.c \
|
src/conf.c src/tokenizer.c src/utils.c src/string_util.c src/log.c \
|
||||||
src/tag.c src/tag_pool.c src/tag_handler.c \
|
src/Tag.cxx src/TagNames.c src/TagPool.cxx src/tag_handler.c \
|
||||||
src/ReplayGainInfo.cxx \
|
src/ReplayGainInfo.cxx \
|
||||||
src/uri.c \
|
src/uri.c \
|
||||||
src/fd_util.c \
|
src/fd_util.c \
|
||||||
@ -1139,7 +1139,7 @@ test_read_tags_LDADD = \
|
|||||||
test_read_tags_SOURCES = test/read_tags.c \
|
test_read_tags_SOURCES = test/read_tags.c \
|
||||||
src/io_thread.c src/io_thread.h \
|
src/io_thread.c src/io_thread.h \
|
||||||
src/conf.c src/tokenizer.c src/utils.c src/string_util.c src/log.c \
|
src/conf.c src/tokenizer.c src/utils.c src/string_util.c src/log.c \
|
||||||
src/tag.c src/tag_pool.c src/tag_handler.c \
|
src/Tag.cxx src/TagNames.c src/TagPool.cxx src/tag_handler.c \
|
||||||
src/ReplayGainInfo.cxx \
|
src/ReplayGainInfo.cxx \
|
||||||
src/uri.c \
|
src/uri.c \
|
||||||
src/fd_util.c \
|
src/fd_util.c \
|
||||||
@ -1192,7 +1192,7 @@ test_run_encoder_SOURCES = test/run_encoder.c \
|
|||||||
src/fifo_buffer.c src/growing_fifo.c \
|
src/fifo_buffer.c src/growing_fifo.c \
|
||||||
src/conf.c src/tokenizer.c \
|
src/conf.c src/tokenizer.c \
|
||||||
src/utils.c src/string_util.c \
|
src/utils.c src/string_util.c \
|
||||||
src/tag.c src/tag_pool.c \
|
src/Tag.cxx src/TagNames.c src/TagPool.cxx \
|
||||||
src/audio_check.c \
|
src/audio_check.c \
|
||||||
src/audio_format.c \
|
src/audio_format.c \
|
||||||
src/audio_parser.c
|
src/audio_parser.c
|
||||||
@ -1210,7 +1210,7 @@ test_test_vorbis_encoder_SOURCES = test/test_vorbis_encoder.c \
|
|||||||
src/conf.c src/tokenizer.c \
|
src/conf.c src/tokenizer.c \
|
||||||
src/utils.c \
|
src/utils.c \
|
||||||
src/string_util.c \
|
src/string_util.c \
|
||||||
src/tag.c src/tag_pool.c \
|
src/Tag.cxx src/TagNames.c src/TagPool.cxx \
|
||||||
src/audio_check.c \
|
src/audio_check.c \
|
||||||
src/audio_format.c \
|
src/audio_format.c \
|
||||||
src/audio_parser.c \
|
src/audio_parser.c \
|
||||||
@ -1266,7 +1266,7 @@ test_run_output_SOURCES = test/run_output.cxx \
|
|||||||
src/audio_format.c \
|
src/audio_format.c \
|
||||||
src/audio_parser.c \
|
src/audio_parser.c \
|
||||||
src/timer.c src/clock.c \
|
src/timer.c src/clock.c \
|
||||||
src/tag.c src/tag_pool.c \
|
src/Tag.cxx src/TagNames.c src/TagPool.cxx \
|
||||||
src/fifo_buffer.c src/growing_fifo.c \
|
src/fifo_buffer.c src/growing_fifo.c \
|
||||||
src/page.c \
|
src/page.c \
|
||||||
src/socket_util.c \
|
src/socket_util.c \
|
||||||
|
@ -24,11 +24,11 @@
|
|||||||
#include "DirectorySave.hxx"
|
#include "DirectorySave.hxx"
|
||||||
#include "song.h"
|
#include "song.h"
|
||||||
#include "TextFile.hxx"
|
#include "TextFile.hxx"
|
||||||
|
#include "TagInternal.hxx"
|
||||||
|
#include "tag.h"
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#include "path.h"
|
#include "path.h"
|
||||||
#include "tag.h"
|
|
||||||
#include "tag_internal.h"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2003-2011 The Music Player Daemon Project
|
* Copyright (C) 2003-2013 The Music Player Daemon Project
|
||||||
* http://www.musicpd.org
|
* http://www.musicpd.org
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
@ -19,8 +19,8 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "tag.h"
|
#include "tag.h"
|
||||||
#include "tag_internal.h"
|
#include "TagInternal.hxx"
|
||||||
#include "tag_pool.h"
|
#include "TagPool.hxx"
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
#include "song.h"
|
#include "song.h"
|
||||||
#include "mpd_error.h"
|
#include "mpd_error.h"
|
||||||
@ -43,38 +43,15 @@ static struct {
|
|||||||
struct tag_item *items[BULK_MAX];
|
struct tag_item *items[BULK_MAX];
|
||||||
} bulk;
|
} bulk;
|
||||||
|
|
||||||
const char *tag_item_names[TAG_NUM_OF_ITEM_TYPES] = {
|
|
||||||
[TAG_ARTIST] = "Artist",
|
|
||||||
[TAG_ARTIST_SORT] = "ArtistSort",
|
|
||||||
[TAG_ALBUM] = "Album",
|
|
||||||
[TAG_ALBUM_ARTIST] = "AlbumArtist",
|
|
||||||
[TAG_ALBUM_ARTIST_SORT] = "AlbumArtistSort",
|
|
||||||
[TAG_TITLE] = "Title",
|
|
||||||
[TAG_TRACK] = "Track",
|
|
||||||
[TAG_NAME] = "Name",
|
|
||||||
[TAG_GENRE] = "Genre",
|
|
||||||
[TAG_DATE] = "Date",
|
|
||||||
[TAG_COMPOSER] = "Composer",
|
|
||||||
[TAG_PERFORMER] = "Performer",
|
|
||||||
[TAG_COMMENT] = "Comment",
|
|
||||||
[TAG_DISC] = "Disc",
|
|
||||||
|
|
||||||
/* MusicBrainz tags from http://musicbrainz.org/doc/MusicBrainzTag */
|
|
||||||
[TAG_MUSICBRAINZ_ARTISTID] = "MUSICBRAINZ_ARTISTID",
|
|
||||||
[TAG_MUSICBRAINZ_ALBUMID] = "MUSICBRAINZ_ALBUMID",
|
|
||||||
[TAG_MUSICBRAINZ_ALBUMARTISTID] = "MUSICBRAINZ_ALBUMARTISTID",
|
|
||||||
[TAG_MUSICBRAINZ_TRACKID] = "MUSICBRAINZ_TRACKID",
|
|
||||||
};
|
|
||||||
|
|
||||||
bool ignore_tag_items[TAG_NUM_OF_ITEM_TYPES];
|
bool ignore_tag_items[TAG_NUM_OF_ITEM_TYPES];
|
||||||
|
|
||||||
enum tag_type
|
enum tag_type
|
||||||
tag_name_parse(const char *name)
|
tag_name_parse(const char *name)
|
||||||
{
|
{
|
||||||
assert(name != NULL);
|
assert(name != nullptr);
|
||||||
|
|
||||||
for (unsigned i = 0; i < TAG_NUM_OF_ITEM_TYPES; ++i) {
|
for (unsigned i = 0; i < TAG_NUM_OF_ITEM_TYPES; ++i) {
|
||||||
assert(tag_item_names[i] != NULL);
|
assert(tag_item_names[i] != nullptr);
|
||||||
|
|
||||||
if (strcmp(name, tag_item_names[i]) == 0)
|
if (strcmp(name, tag_item_names[i]) == 0)
|
||||||
return (enum tag_type)i;
|
return (enum tag_type)i;
|
||||||
@ -86,10 +63,10 @@ tag_name_parse(const char *name)
|
|||||||
enum tag_type
|
enum tag_type
|
||||||
tag_name_parse_i(const char *name)
|
tag_name_parse_i(const char *name)
|
||||||
{
|
{
|
||||||
assert(name != NULL);
|
assert(name != nullptr);
|
||||||
|
|
||||||
for (unsigned i = 0; i < TAG_NUM_OF_ITEM_TYPES; ++i) {
|
for (unsigned i = 0; i < TAG_NUM_OF_ITEM_TYPES; ++i) {
|
||||||
assert(tag_item_names[i] != NULL);
|
assert(tag_item_names[i] != nullptr);
|
||||||
|
|
||||||
if (g_ascii_strcasecmp(name, tag_item_names[i]) == 0)
|
if (g_ascii_strcasecmp(name, tag_item_names[i]) == 0)
|
||||||
return (enum tag_type)i;
|
return (enum tag_type)i;
|
||||||
@ -117,8 +94,8 @@ void tag_lib_init(void)
|
|||||||
/* ignore comments by default */
|
/* ignore comments by default */
|
||||||
ignore_tag_items[TAG_COMMENT] = true;
|
ignore_tag_items[TAG_COMMENT] = true;
|
||||||
|
|
||||||
value = config_get_string(CONF_METADATA_TO_USE, NULL);
|
value = config_get_string(CONF_METADATA_TO_USE, nullptr);
|
||||||
if (value == NULL)
|
if (value == nullptr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
memset(ignore_tag_items, true, TAG_NUM_OF_ITEM_TYPES);
|
memset(ignore_tag_items, true, TAG_NUM_OF_ITEM_TYPES);
|
||||||
@ -156,7 +133,7 @@ void tag_lib_init(void)
|
|||||||
struct tag *tag_new(void)
|
struct tag *tag_new(void)
|
||||||
{
|
{
|
||||||
struct tag *ret = g_new(struct tag, 1);
|
struct tag *ret = g_new(struct tag, 1);
|
||||||
ret->items = NULL;
|
ret->items = nullptr;
|
||||||
ret->time = -1;
|
ret->time = -1;
|
||||||
ret->has_playlist = false;
|
ret->has_playlist = false;
|
||||||
ret->num_items = 0;
|
ret->num_items = 0;
|
||||||
@ -178,10 +155,11 @@ static void tag_delete_item(struct tag *tag, unsigned idx)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (tag->num_items > 0) {
|
if (tag->num_items > 0) {
|
||||||
tag->items = g_realloc(tag->items, items_size(tag));
|
tag->items = (struct tag_item **)
|
||||||
|
g_realloc(tag->items, items_size(tag));
|
||||||
} else {
|
} else {
|
||||||
g_free(tag->items);
|
g_free(tag->items);
|
||||||
tag->items = NULL;
|
tag->items = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -200,7 +178,7 @@ void tag_free(struct tag *tag)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
assert(tag != NULL);
|
assert(tag != nullptr);
|
||||||
|
|
||||||
g_static_mutex_lock(&tag_pool_lock);
|
g_static_mutex_lock(&tag_pool_lock);
|
||||||
for (i = tag->num_items; --i >= 0; )
|
for (i = tag->num_items; --i >= 0; )
|
||||||
@ -223,13 +201,15 @@ struct tag *tag_dup(const struct tag *tag)
|
|||||||
struct tag *ret;
|
struct tag *ret;
|
||||||
|
|
||||||
if (!tag)
|
if (!tag)
|
||||||
return NULL;
|
return nullptr;
|
||||||
|
|
||||||
ret = tag_new();
|
ret = tag_new();
|
||||||
ret->time = tag->time;
|
ret->time = tag->time;
|
||||||
ret->has_playlist = tag->has_playlist;
|
ret->has_playlist = tag->has_playlist;
|
||||||
ret->num_items = tag->num_items;
|
ret->num_items = tag->num_items;
|
||||||
ret->items = ret->num_items > 0 ? g_malloc(items_size(tag)) : NULL;
|
ret->items = ret->num_items > 0
|
||||||
|
? (struct tag_item **)g_malloc(items_size(tag))
|
||||||
|
: nullptr;
|
||||||
|
|
||||||
g_static_mutex_lock(&tag_pool_lock);
|
g_static_mutex_lock(&tag_pool_lock);
|
||||||
for (unsigned i = 0; i < tag->num_items; i++)
|
for (unsigned i = 0; i < tag->num_items; i++)
|
||||||
@ -245,15 +225,17 @@ tag_merge(const struct tag *base, const struct tag *add)
|
|||||||
struct tag *ret;
|
struct tag *ret;
|
||||||
unsigned n;
|
unsigned n;
|
||||||
|
|
||||||
assert(base != NULL);
|
assert(base != nullptr);
|
||||||
assert(add != NULL);
|
assert(add != nullptr);
|
||||||
|
|
||||||
/* allocate new tag object */
|
/* allocate new tag object */
|
||||||
|
|
||||||
ret = tag_new();
|
ret = tag_new();
|
||||||
ret->time = add->time > 0 ? add->time : base->time;
|
ret->time = add->time > 0 ? add->time : base->time;
|
||||||
ret->num_items = base->num_items + add->num_items;
|
ret->num_items = base->num_items + add->num_items;
|
||||||
ret->items = ret->num_items > 0 ? g_malloc(items_size(ret)) : NULL;
|
ret->items = ret->num_items > 0
|
||||||
|
? (struct tag_item **)g_malloc(items_size(ret))
|
||||||
|
: nullptr;
|
||||||
|
|
||||||
g_static_mutex_lock(&tag_pool_lock);
|
g_static_mutex_lock(&tag_pool_lock);
|
||||||
|
|
||||||
@ -279,7 +261,8 @@ tag_merge(const struct tag *base, const struct tag *add)
|
|||||||
assert(n > 0);
|
assert(n > 0);
|
||||||
|
|
||||||
ret->num_items = n;
|
ret->num_items = n;
|
||||||
ret->items = g_realloc(ret->items, items_size(ret));
|
ret->items = (struct tag_item **)
|
||||||
|
g_realloc(ret->items, items_size(ret));
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@ -288,10 +271,10 @@ tag_merge(const struct tag *base, const struct tag *add)
|
|||||||
struct tag *
|
struct tag *
|
||||||
tag_merge_replace(struct tag *base, struct tag *add)
|
tag_merge_replace(struct tag *base, struct tag *add)
|
||||||
{
|
{
|
||||||
if (add == NULL)
|
if (add == nullptr)
|
||||||
return base;
|
return base;
|
||||||
|
|
||||||
if (base == NULL)
|
if (base == nullptr)
|
||||||
return add;
|
return add;
|
||||||
|
|
||||||
struct tag *tag = tag_merge(base, add);
|
struct tag *tag = tag_merge(base, add);
|
||||||
@ -304,24 +287,24 @@ tag_merge_replace(struct tag *base, struct tag *add)
|
|||||||
const char *
|
const char *
|
||||||
tag_get_value(const struct tag *tag, enum tag_type type)
|
tag_get_value(const struct tag *tag, enum tag_type type)
|
||||||
{
|
{
|
||||||
assert(tag != NULL);
|
assert(tag != nullptr);
|
||||||
assert(type < TAG_NUM_OF_ITEM_TYPES);
|
assert(type < TAG_NUM_OF_ITEM_TYPES);
|
||||||
|
|
||||||
for (unsigned i = 0; i < tag->num_items; i++)
|
for (unsigned i = 0; i < tag->num_items; i++)
|
||||||
if (tag->items[i]->type == type)
|
if (tag->items[i]->type == type)
|
||||||
return tag->items[i]->value;
|
return tag->items[i]->value;
|
||||||
|
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool tag_has_type(const struct tag *tag, enum tag_type type)
|
bool tag_has_type(const struct tag *tag, enum tag_type type)
|
||||||
{
|
{
|
||||||
return tag_get_value(tag, type) != NULL;
|
return tag_get_value(tag, type) != nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool tag_equal(const struct tag *tag1, const struct tag *tag2)
|
bool tag_equal(const struct tag *tag1, const struct tag *tag2)
|
||||||
{
|
{
|
||||||
if (tag1 == NULL && tag2 == NULL)
|
if (tag1 == nullptr && tag2 == nullptr)
|
||||||
return true;
|
return true;
|
||||||
else if (!tag1 || !tag2)
|
else if (!tag1 || !tag2)
|
||||||
return false;
|
return false;
|
||||||
@ -367,16 +350,16 @@ fix_utf8(const char *str, size_t length)
|
|||||||
char *temp;
|
char *temp;
|
||||||
gsize written;
|
gsize written;
|
||||||
|
|
||||||
assert(str != NULL);
|
assert(str != nullptr);
|
||||||
|
|
||||||
/* check if the string is already valid UTF-8 */
|
/* check if the string is already valid UTF-8 */
|
||||||
if (g_utf8_validate(str, length, &end))
|
if (g_utf8_validate(str, length, &end))
|
||||||
return NULL;
|
return nullptr;
|
||||||
|
|
||||||
/* no, it's not - try to import it from ISO-Latin-1 */
|
/* no, it's not - try to import it from ISO-Latin-1 */
|
||||||
temp = g_convert(str, length, "utf-8", "iso-8859-1",
|
temp = g_convert(str, length, "utf-8", "iso-8859-1",
|
||||||
NULL, &written, NULL);
|
nullptr, &written, nullptr);
|
||||||
if (temp != NULL)
|
if (temp != nullptr)
|
||||||
/* success! */
|
/* success! */
|
||||||
return temp;
|
return temp;
|
||||||
|
|
||||||
@ -388,8 +371,8 @@ fix_utf8(const char *str, size_t length)
|
|||||||
void tag_begin_add(struct tag *tag)
|
void tag_begin_add(struct tag *tag)
|
||||||
{
|
{
|
||||||
assert(!bulk.busy);
|
assert(!bulk.busy);
|
||||||
assert(tag != NULL);
|
assert(tag != nullptr);
|
||||||
assert(tag->items == NULL);
|
assert(tag->items == nullptr);
|
||||||
assert(tag->num_items == 0);
|
assert(tag->num_items == 0);
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
@ -406,10 +389,11 @@ void tag_end_add(struct tag *tag)
|
|||||||
if (tag->num_items > 0) {
|
if (tag->num_items > 0) {
|
||||||
/* copy the tag items from the bulk list over
|
/* copy the tag items from the bulk list over
|
||||||
to a new list (which fits exactly) */
|
to a new list (which fits exactly) */
|
||||||
tag->items = g_malloc(items_size(tag));
|
tag->items = (struct tag_item **)
|
||||||
|
g_malloc(items_size(tag));
|
||||||
memcpy(tag->items, bulk.items, items_size(tag));
|
memcpy(tag->items, bulk.items, items_size(tag));
|
||||||
} else
|
} else
|
||||||
tag->items = NULL;
|
tag->items = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
@ -430,12 +414,12 @@ find_non_printable(const char *p, size_t length)
|
|||||||
if (char_is_non_printable(p[i]))
|
if (char_is_non_printable(p[i]))
|
||||||
return p + i;
|
return p + i;
|
||||||
|
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clears all non-printable characters, convert them to space.
|
* Clears all non-printable characters, convert them to space.
|
||||||
* Returns NULL if nothing needs to be cleared.
|
* Returns nullptr if nothing needs to be cleared.
|
||||||
*/
|
*/
|
||||||
static char *
|
static char *
|
||||||
clear_non_printable(const char *p, size_t length)
|
clear_non_printable(const char *p, size_t length)
|
||||||
@ -443,8 +427,8 @@ clear_non_printable(const char *p, size_t length)
|
|||||||
const char *first = find_non_printable(p, length);
|
const char *first = find_non_printable(p, length);
|
||||||
char *dest;
|
char *dest;
|
||||||
|
|
||||||
if (first == NULL)
|
if (first == nullptr)
|
||||||
return NULL;
|
return nullptr;
|
||||||
|
|
||||||
dest = g_strndup(p, length);
|
dest = g_strndup(p, length);
|
||||||
|
|
||||||
@ -461,13 +445,13 @@ fix_tag_value(const char *p, size_t length)
|
|||||||
char *utf8, *cleared;
|
char *utf8, *cleared;
|
||||||
|
|
||||||
utf8 = fix_utf8(p, length);
|
utf8 = fix_utf8(p, length);
|
||||||
if (utf8 != NULL) {
|
if (utf8 != nullptr) {
|
||||||
p = utf8;
|
p = utf8;
|
||||||
length = strlen(p);
|
length = strlen(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
cleared = clear_non_printable(p, length);
|
cleared = clear_non_printable(p, length);
|
||||||
if (cleared == NULL)
|
if (cleared == nullptr)
|
||||||
cleared = utf8;
|
cleared = utf8;
|
||||||
else
|
else
|
||||||
g_free(utf8);
|
g_free(utf8);
|
||||||
@ -483,7 +467,7 @@ tag_add_item_internal(struct tag *tag, enum tag_type type,
|
|||||||
char *p;
|
char *p;
|
||||||
|
|
||||||
p = fix_tag_value(value, len);
|
p = fix_tag_value(value, len);
|
||||||
if (p != NULL) {
|
if (p != nullptr) {
|
||||||
value = p;
|
value = p;
|
||||||
len = strlen(value);
|
len = strlen(value);
|
||||||
}
|
}
|
||||||
@ -492,12 +476,13 @@ tag_add_item_internal(struct tag *tag, enum tag_type type,
|
|||||||
|
|
||||||
if (tag->items != bulk.items)
|
if (tag->items != bulk.items)
|
||||||
/* bulk mode disabled */
|
/* bulk mode disabled */
|
||||||
tag->items = g_realloc(tag->items, items_size(tag));
|
tag->items = (struct tag_item **)
|
||||||
|
g_realloc(tag->items, items_size(tag));
|
||||||
else if (tag->num_items >= BULK_MAX) {
|
else if (tag->num_items >= BULK_MAX) {
|
||||||
/* bulk list already full - switch back to non-bulk */
|
/* bulk list already full - switch back to non-bulk */
|
||||||
assert(bulk.busy);
|
assert(bulk.busy);
|
||||||
|
|
||||||
tag->items = g_malloc(items_size(tag));
|
tag->items = (struct tag_item **)g_malloc(items_size(tag));
|
||||||
memcpy(tag->items, bulk.items,
|
memcpy(tag->items, bulk.items,
|
||||||
items_size(tag) - sizeof(struct tag_item *));
|
items_size(tag) - sizeof(struct tag_item *));
|
||||||
}
|
}
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2003-2011 The Music Player Daemon Project
|
* Copyright (C) 2003-2013 The Music Player Daemon Project
|
||||||
* http://www.musicpd.org
|
* http://www.musicpd.org
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
@ -17,13 +17,11 @@
|
|||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef MPD_TAG_INTERNAL_H
|
#ifndef MPD_TAG_INTERNAL_HXX
|
||||||
#define MPD_TAG_INTERNAL_H
|
#define MPD_TAG_INTERNAL_HXX
|
||||||
|
|
||||||
#include "tag.h"
|
#include "tag.h"
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
extern bool ignore_tag_items[TAG_NUM_OF_ITEM_TYPES];
|
extern bool ignore_tag_items[TAG_NUM_OF_ITEM_TYPES];
|
||||||
|
|
||||||
#endif
|
#endif
|
44
src/TagNames.c
Normal file
44
src/TagNames.c
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2003-2013 The Music Player Daemon Project
|
||||||
|
* http://www.musicpd.org
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along
|
||||||
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include "tag.h"
|
||||||
|
|
||||||
|
const char *tag_item_names[TAG_NUM_OF_ITEM_TYPES] = {
|
||||||
|
[TAG_ARTIST] = "Artist",
|
||||||
|
[TAG_ARTIST_SORT] = "ArtistSort",
|
||||||
|
[TAG_ALBUM] = "Album",
|
||||||
|
[TAG_ALBUM_ARTIST] = "AlbumArtist",
|
||||||
|
[TAG_ALBUM_ARTIST_SORT] = "AlbumArtistSort",
|
||||||
|
[TAG_TITLE] = "Title",
|
||||||
|
[TAG_TRACK] = "Track",
|
||||||
|
[TAG_NAME] = "Name",
|
||||||
|
[TAG_GENRE] = "Genre",
|
||||||
|
[TAG_DATE] = "Date",
|
||||||
|
[TAG_COMPOSER] = "Composer",
|
||||||
|
[TAG_PERFORMER] = "Performer",
|
||||||
|
[TAG_COMMENT] = "Comment",
|
||||||
|
[TAG_DISC] = "Disc",
|
||||||
|
|
||||||
|
/* MusicBrainz tags from http://musicbrainz.org/doc/MusicBrainzTag */
|
||||||
|
[TAG_MUSICBRAINZ_ARTISTID] = "MUSICBRAINZ_ARTISTID",
|
||||||
|
[TAG_MUSICBRAINZ_ALBUMID] = "MUSICBRAINZ_ALBUMID",
|
||||||
|
[TAG_MUSICBRAINZ_ALBUMARTISTID] = "MUSICBRAINZ_ALBUMARTISTID",
|
||||||
|
[TAG_MUSICBRAINZ_TRACKID] = "MUSICBRAINZ_TRACKID",
|
||||||
|
};
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2003-2011 The Music Player Daemon Project
|
* Copyright (C) 2003-2013 The Music Player Daemon Project
|
||||||
* http://www.musicpd.org
|
* http://www.musicpd.org
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
@ -18,7 +18,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "tag_pool.h"
|
#include "TagPool.hxx"
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
@ -49,7 +49,7 @@ calc_hash_n(enum tag_type type, const char *p, size_t length)
|
|||||||
{
|
{
|
||||||
unsigned hash = 5381;
|
unsigned hash = 5381;
|
||||||
|
|
||||||
assert(p != NULL);
|
assert(p != nullptr);
|
||||||
|
|
||||||
while (length-- > 0)
|
while (length-- > 0)
|
||||||
hash = (hash << 5) + hash + *p++;
|
hash = (hash << 5) + hash + *p++;
|
||||||
@ -62,7 +62,7 @@ calc_hash(enum tag_type type, const char *p)
|
|||||||
{
|
{
|
||||||
unsigned hash = 5381;
|
unsigned hash = 5381;
|
||||||
|
|
||||||
assert(p != NULL);
|
assert(p != nullptr);
|
||||||
|
|
||||||
while (*p != 0)
|
while (*p != 0)
|
||||||
hash = (hash << 5) + hash + *p++;
|
hash = (hash << 5) + hash + *p++;
|
||||||
@ -82,7 +82,8 @@ static struct slot *slot_alloc(struct slot *next,
|
|||||||
{
|
{
|
||||||
struct slot *slot;
|
struct slot *slot;
|
||||||
|
|
||||||
slot = g_malloc(sizeof(*slot) - sizeof(slot->item.value) + length + 1);
|
slot = (struct slot *)
|
||||||
|
g_malloc(sizeof(*slot) - sizeof(slot->item.value) + length + 1);
|
||||||
slot->next = next;
|
slot->next = next;
|
||||||
slot->ref = 1;
|
slot->ref = 1;
|
||||||
slot->item.type = type;
|
slot->item.type = type;
|
||||||
@ -97,7 +98,7 @@ tag_pool_get_item(enum tag_type type, const char *value, size_t length)
|
|||||||
struct slot **slot_p, *slot;
|
struct slot **slot_p, *slot;
|
||||||
|
|
||||||
slot_p = &slots[calc_hash_n(type, value, length) % NUM_SLOTS];
|
slot_p = &slots[calc_hash_n(type, value, length) % NUM_SLOTS];
|
||||||
for (slot = *slot_p; slot != NULL; slot = slot->next) {
|
for (slot = *slot_p; slot != nullptr; slot = slot->next) {
|
||||||
if (slot->item.type == type &&
|
if (slot->item.type == type &&
|
||||||
length == strlen(slot->item.value) &&
|
length == strlen(slot->item.value) &&
|
||||||
memcmp(value, slot->item.value, length) == 0 &&
|
memcmp(value, slot->item.value, length) == 0 &&
|
||||||
@ -150,7 +151,7 @@ void tag_pool_put_item(struct tag_item *item)
|
|||||||
for (slot_p = &slots[calc_hash(item->type, item->value) % NUM_SLOTS];
|
for (slot_p = &slots[calc_hash(item->type, item->value) % NUM_SLOTS];
|
||||||
*slot_p != slot;
|
*slot_p != slot;
|
||||||
slot_p = &(*slot_p)->next) {
|
slot_p = &(*slot_p)->next) {
|
||||||
assert(*slot_p != NULL);
|
assert(*slot_p != nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
*slot_p = slot->next;
|
*slot_p = slot->next;
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2003-2011 The Music Player Daemon Project
|
* Copyright (C) 2003-2013 The Music Player Daemon Project
|
||||||
* http://www.musicpd.org
|
* http://www.musicpd.org
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
@ -17,8 +17,8 @@
|
|||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef MPD_TAG_POOL_H
|
#ifndef MPD_TAG_POOL_HXX
|
||||||
#define MPD_TAG_POOL_H
|
#define MPD_TAG_POOL_HXX
|
||||||
|
|
||||||
#include "tag.h"
|
#include "tag.h"
|
||||||
|
|
@ -20,7 +20,7 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "TagPrint.hxx"
|
#include "TagPrint.hxx"
|
||||||
#include "tag.h"
|
#include "tag.h"
|
||||||
#include "tag_internal.h"
|
#include "TagInternal.hxx"
|
||||||
#include "song.h"
|
#include "song.h"
|
||||||
#include "Client.hxx"
|
#include "Client.hxx"
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "TagSave.hxx"
|
#include "TagSave.hxx"
|
||||||
#include "tag.h"
|
#include "tag.h"
|
||||||
#include "tag_internal.h"
|
#include "TagInternal.hxx"
|
||||||
#include "song.h"
|
#include "song.h"
|
||||||
|
|
||||||
void tag_save(FILE *file, const struct tag *tag)
|
void tag_save(FILE *file, const struct tag *tag)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2003-2011 The Music Player Daemon Project
|
* Copyright (C) 2003-2013 The Music Player Daemon Project
|
||||||
* http://www.musicpd.org
|
* http://www.musicpd.org
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
Loading…
Reference in New Issue
Block a user