From 31cabc751d2dc6721706d878a0694afc83ef6a0c Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@duempel.org>
Date: Wed, 30 Sep 2009 23:13:13 +0200
Subject: command: range support for "delete"

---
 NEWS                |  1 +
 src/command.c       |  6 +++---
 src/playlist.h      |  9 +++++++++
 src/playlist_edit.c | 26 ++++++++++++++++++++++++++
 4 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/NEWS b/NEWS
index c7c907743..efb311e62 100644
--- a/NEWS
+++ b/NEWS
@@ -4,6 +4,7 @@ ver 0.16 (20??/??/??)
   - added "update" idle event
   - removed the deprecated "volume" command
   - added the "findadd" command
+  - range support for "delete"
 * input:
   - lastfm: use metadata
 * tags:
diff --git a/src/command.c b/src/command.c
index f69bdf632..165e21c96 100644
--- a/src/command.c
+++ b/src/command.c
@@ -632,13 +632,13 @@ handle_addid(struct client *client, int argc, char *argv[])
 static enum command_return
 handle_delete(struct client *client, G_GNUC_UNUSED int argc, char *argv[])
 {
-	int song;
+	unsigned start, end;
 	enum playlist_result result;
 
-	if (!check_int(client, &song, argv[1], need_positive))
+	if (!check_range(client, &start, &end, argv[1], need_range))
 		return COMMAND_RETURN_ERROR;
 
-	result = playlist_delete(&g_playlist, song);
+	result = playlist_delete_range(&g_playlist, start, end);
 	return print_playlist_result(client, result);
 }
 
diff --git a/src/playlist.h b/src/playlist.h
index 4126c67c3..311163e8b 100644
--- a/src/playlist.h
+++ b/src/playlist.h
@@ -141,6 +141,15 @@ playlist_append_song(struct playlist *playlist,
 enum playlist_result
 playlist_delete(struct playlist *playlist, unsigned song);
 
+/**
+ * Deletes a range of songs from the playlist.
+ *
+ * @param start the position of the first song to delete
+ * @param end the position after the last song to delete
+ */
+enum playlist_result
+playlist_delete_range(struct playlist *playlist, unsigned start, unsigned end);
+
 enum playlist_result
 playlist_delete_id(struct playlist *playlist, unsigned song);
 
diff --git a/src/playlist_edit.c b/src/playlist_edit.c
index 6b15f56cb..473305f17 100644
--- a/src/playlist_edit.c
+++ b/src/playlist_edit.c
@@ -279,6 +279,32 @@ playlist_delete(struct playlist *playlist, unsigned song)
 	return PLAYLIST_RESULT_SUCCESS;
 }
 
+enum playlist_result
+playlist_delete_range(struct playlist *playlist, unsigned start, unsigned end)
+{
+	const struct song *queued;
+
+	if (start >= queue_length(&playlist->queue))
+		return PLAYLIST_RESULT_BAD_RANGE;
+
+	if (end > queue_length(&playlist->queue))
+		end = queue_length(&playlist->queue);
+
+	if (start >= end)
+		return PLAYLIST_RESULT_SUCCESS;
+
+	queued = playlist_get_queued_song(playlist);
+
+	do {
+		playlist_delete_internal(playlist, --end, &queued);
+	} while (end != start);
+
+	playlist_increment_version(playlist);
+	playlist_update_queued_song(playlist, queued);
+
+	return PLAYLIST_RESULT_SUCCESS;
+}
+
 enum playlist_result
 playlist_delete_id(struct playlist *playlist, unsigned id)
 {
-- 
cgit v1.2.3