From a4d82cfe1eb388b0552a20703116def53046774f Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 26 Oct 2013 15:57:09 +0200 Subject: 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 +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; } -- cgit v1.2.3