From 31bc94160a4dc7b8749cca8c3f7b703548fcb4f4 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 17 Apr 2013 22:25:57 +0200 Subject: song_sort: convert to C++ --- Makefile.am | 4 +- src/Directory.cxx | 2 +- src/SongSort.cxx | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/SongSort.hxx | 28 ++++++++++++ src/song_sort.c | 121 ---------------------------------------------------- src/song_sort.h | 28 ------------ 6 files changed, 155 insertions(+), 152 deletions(-) create mode 100644 src/SongSort.cxx create mode 100644 src/SongSort.hxx delete mode 100644 src/song_sort.c delete mode 100644 src/song_sort.h diff --git a/Makefile.am b/Makefile.am index cb3539021..d40f92a22 100644 --- a/Makefile.am +++ b/Makefile.am @@ -88,7 +88,6 @@ mpd_headers = \ src/replay_gain_ape.h \ src/TimePrint.cxx src/TimePrint.hxx \ src/song.h \ - src/song_sort.c src/song_sort.h \ src/stats.h \ src/tag.h \ src/tag_internal.h \ @@ -226,6 +225,7 @@ src_mpd_SOURCES = \ src/SongUpdate.cxx \ src/SongPrint.cxx src/SongPrint.hxx \ src/SongSave.cxx src/SongSave.hxx \ + src/SongSort.cxx src/SongSort.hxx \ src/resolver.c src/resolver.h \ src/SocketUtil.cxx src/SocketUtil.hxx \ src/StateFile.cxx src/StateFile.hxx \ @@ -1054,7 +1054,7 @@ test_DumpDatabase_SOURCES = test/DumpDatabase.cxx \ src/Directory.cxx src/DirectorySave.cxx \ src/PlaylistVector.cxx src/PlaylistDatabase.cxx \ src/DatabaseLock.cxx src/DatabaseSave.cxx \ - src/Song.cxx src/song_sort.c src/SongSave.cxx \ + src/Song.cxx src/SongSave.cxx src/SongSort.cxx \ src/Tag.cxx src/TagNames.c src/TagPool.cxx src/TagSave.cxx \ src/SongFilter.cxx \ src/TextFile.cxx diff --git a/src/Directory.cxx b/src/Directory.cxx index 2b1a34cbf..c96ac927d 100644 --- a/src/Directory.cxx +++ b/src/Directory.cxx @@ -22,10 +22,10 @@ #include "SongFilter.hxx" #include "PlaylistVector.hxx" #include "DatabaseLock.hxx" +#include "SongSort.hxx" extern "C" { #include "song.h" -#include "song_sort.h" #include "util/list_sort.h" } diff --git a/src/SongSort.cxx b/src/SongSort.cxx new file mode 100644 index 000000000..8728614e0 --- /dev/null +++ b/src/SongSort.cxx @@ -0,0 +1,124 @@ +/* + * 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 "SongSort.hxx" +#include "song.h" +#include "util/list.h" +#include "tag.h" + +extern "C" { +#include "util/list_sort.h" +} + +#include + +#include +#include + +static const char * +tag_get_value_checked(const struct tag *tag, enum tag_type type) +{ + return tag != NULL + ? tag_get_value(tag, type) + : NULL; +} + +static int +compare_utf8_string(const char *a, const char *b) +{ + if (a == NULL) + return b == NULL ? 0 : -1; + + if (b == NULL) + return 1; + + return g_utf8_collate(a, b); +} + +/** + * Compare two string tag values, ignoring case. Either one may be + * NULL. + */ +static int +compare_string_tag_item(const struct tag *a, const struct tag *b, + enum tag_type type) +{ + return compare_utf8_string(tag_get_value_checked(a, type), + tag_get_value_checked(b, type)); +} + +/** + * Compare two tag values which should contain an integer value + * (e.g. disc or track number). Either one may be NULL. + */ +static int +compare_number_string(const char *a, const char *b) +{ + long ai = a == NULL ? 0 : strtol(a, NULL, 10); + long bi = b == NULL ? 0 : strtol(b, NULL, 10); + + if (ai <= 0) + return bi <= 0 ? 0 : -1; + + if (bi <= 0) + return 1; + + return ai - bi; +} + +static int +compare_tag_item(const struct tag *a, const struct tag *b, enum tag_type type) +{ + return compare_number_string(tag_get_value_checked(a, type), + tag_get_value_checked(b, type)); +} + +/* Only used for sorting/searchin a songvec, not general purpose compares */ +static int +song_cmp(G_GNUC_UNUSED void *priv, struct list_head *_a, struct list_head *_b) +{ + const struct song *a = (const struct song *)_a; + const struct song *b = (const struct song *)_b; + int ret; + + /* first sort by album */ + ret = compare_string_tag_item(a->tag, b->tag, TAG_ALBUM); + if (ret != 0) + return ret; + + /* then sort by disc */ + ret = compare_tag_item(a->tag, b->tag, TAG_DISC); + if (ret != 0) + return ret; + + /* then by track number */ + ret = compare_tag_item(a->tag, b->tag, TAG_TRACK); + if (ret != 0) + return ret; + + /* still no difference? compare file name */ + return g_utf8_collate(a->uri, b->uri); +} + +void +song_list_sort(struct list_head *songs) +{ + list_sort(NULL, songs, song_cmp); +} diff --git a/src/SongSort.hxx b/src/SongSort.hxx new file mode 100644 index 000000000..b3b67b0c0 --- /dev/null +++ b/src/SongSort.hxx @@ -0,0 +1,28 @@ +/* + * 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. + */ + +#ifndef MPD_SONG_SORT_HXX +#define MPD_SONG_SORT_HXX + +struct list_head; + +void +song_list_sort(struct list_head *songs); + +#endif diff --git a/src/song_sort.c b/src/song_sort.c deleted file mode 100644 index 397d2c7a9..000000000 --- a/src/song_sort.c +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (C) 2003-2012 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 "song_sort.h" -#include "song.h" -#include "util/list.h" -#include "util/list_sort.h" -#include "tag.h" - -#include - -#include -#include - -static const char * -tag_get_value_checked(const struct tag *tag, enum tag_type type) -{ - return tag != NULL - ? tag_get_value(tag, type) - : NULL; -} - -static int -compare_utf8_string(const char *a, const char *b) -{ - if (a == NULL) - return b == NULL ? 0 : -1; - - if (b == NULL) - return 1; - - return g_utf8_collate(a, b); -} - -/** - * Compare two string tag values, ignoring case. Either one may be - * NULL. - */ -static int -compare_string_tag_item(const struct tag *a, const struct tag *b, - enum tag_type type) -{ - return compare_utf8_string(tag_get_value_checked(a, type), - tag_get_value_checked(b, type)); -} - -/** - * Compare two tag values which should contain an integer value - * (e.g. disc or track number). Either one may be NULL. - */ -static int -compare_number_string(const char *a, const char *b) -{ - long ai = a == NULL ? 0 : strtol(a, NULL, 10); - long bi = b == NULL ? 0 : strtol(b, NULL, 10); - - if (ai <= 0) - return bi <= 0 ? 0 : -1; - - if (bi <= 0) - return 1; - - return ai - bi; -} - -static int -compare_tag_item(const struct tag *a, const struct tag *b, enum tag_type type) -{ - return compare_number_string(tag_get_value_checked(a, type), - tag_get_value_checked(b, type)); -} - -/* Only used for sorting/searchin a songvec, not general purpose compares */ -static int -song_cmp(G_GNUC_UNUSED void *priv, struct list_head *_a, struct list_head *_b) -{ - const struct song *a = (const struct song *)_a; - const struct song *b = (const struct song *)_b; - int ret; - - /* first sort by album */ - ret = compare_string_tag_item(a->tag, b->tag, TAG_ALBUM); - if (ret != 0) - return ret; - - /* then sort by disc */ - ret = compare_tag_item(a->tag, b->tag, TAG_DISC); - if (ret != 0) - return ret; - - /* then by track number */ - ret = compare_tag_item(a->tag, b->tag, TAG_TRACK); - if (ret != 0) - return ret; - - /* still no difference? compare file name */ - return g_utf8_collate(a->uri, b->uri); -} - -void -song_list_sort(struct list_head *songs) -{ - list_sort(NULL, songs, song_cmp); -} diff --git a/src/song_sort.h b/src/song_sort.h deleted file mode 100644 index ec124cf4a..000000000 --- a/src/song_sort.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2003-2012 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. - */ - -#ifndef MPD_SONG_SORT_H -#define MPD_SONG_SORT_H - -struct list_head; - -void -song_list_sort(struct list_head *songs); - -#endif -- cgit v1.2.3