From a4d82cfe1eb388b0552a20703116def53046774f Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@duempel.org>
Date: Sat, 26 Oct 2013 15:57:09 +0200
Subject: [PATCH] ApeTag: move code to ForEachValue()

---
 src/tag/ApeTag.cxx | 46 ++++++++++++++++++++++++++++++----------------
 1 file changed, 30 insertions(+), 16 deletions(-)

diff --git a/src/tag/ApeTag.cxx b/src/tag/ApeTag.cxx
index ab7ddbe7a..f33bf1353 100644
--- a/src/tag/ApeTag.cxx
+++ b/src/tag/ApeTag.cxx
@@ -45,6 +45,32 @@ tag_ape_name_parse(const char *name)
 	return type;
 }
 
+/**
+ * Invoke the given callback for each string inside the given range.
+ * The strings are separated by null bytes, but the last one may not
+ * be terminated.
+ */
+template<typename C>
+static void
+ForEachValue(const char *value, const char *end, C &&callback)
+{
+	while (true) {
+		const char *n = (const char *)memchr(value, 0, end - value);
+		if (n == nullptr)
+			break;
+
+		if (n > value)
+			callback(value);
+
+		value = n + 1;
+	}
+
+	if (value < end) {
+		const std::string value2(value, end);
+		callback(value2.c_str());
+	}
+}
+
 /**
  * @return true if the item was recognized
  */
@@ -64,23 +90,11 @@ tag_ape_import_item(unsigned long flags,
 		return false;
 
 	const char *end = value + value_length;
-	while (true) {
-		/* multiple values are separated by null bytes */
-		const char *n = (const char *)memchr(value, 0, end - value);
-		if (n != nullptr) {
-			if (n > value) {
-				tag_handler_invoke_tag(handler, handler_ctx,
-						       type, value);
-			}
-
-			value = n + 1;
-		} else {
-			const std::string value2(value, end);
+	ForEachValue(value, end, [handler, handler_ctx,
+				    type](const char *_value) {
 			tag_handler_invoke_tag(handler, handler_ctx,
-					       type, value2.c_str());
-			break;
-		}
-	}
+					       type, _value);
+		});
 
 	return true;
 }
-- 
2.24.1