From e69bef3ce389967b8239648e4b9eaec42217bc95 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@duempel.org>
Date: Wed, 3 Dec 2014 21:39:45 +0100
Subject: util/SplitString: new utility class

Replaces GLib's g_strsplit().
---
 src/output/plugins/AoOutputPlugin.cxx   | 12 ++++--------
 src/output/plugins/JackOutputPlugin.cxx | 30 ++++++++++--------------------
 2 files changed, 14 insertions(+), 28 deletions(-)

(limited to 'src/output')

diff --git a/src/output/plugins/AoOutputPlugin.cxx b/src/output/plugins/AoOutputPlugin.cxx
index 6faa30b1b..689e7de7c 100644
--- a/src/output/plugins/AoOutputPlugin.cxx
+++ b/src/output/plugins/AoOutputPlugin.cxx
@@ -21,12 +21,12 @@
 #include "AoOutputPlugin.hxx"
 #include "../OutputAPI.hxx"
 #include "util/DivideString.hxx"
+#include "util/SplitString.hxx"
 #include "util/Error.hxx"
 #include "util/Domain.hxx"
 #include "Log.hxx"
 
 #include <ao/ao.h>
-#include <glib.h>
 
 #include <string.h>
 
@@ -127,22 +127,18 @@ AoOutput::Configure(const config_param &param, Error &error)
 
 	value = param.GetBlockValue("options", nullptr);
 	if (value != nullptr) {
-		gchar **_options = g_strsplit(value, ";", 0);
-
-		for (unsigned i = 0; _options[i] != nullptr; ++i) {
-			const DivideString ss(_options[i], '=');
+		for (const auto &i : SplitString(value, ';')) {
+			const DivideString ss(i.c_str(), '=');
 
 			if (!ss.IsDefined()) {
 				error.Format(ao_output_domain,
 					     "problems parsing options \"%s\"",
-					     _options[i]);
+					     i.c_str());
 				return false;
 			}
 
 			ao_append_option(&options, ss.GetFirst(), ss.GetSecond());
 		}
-
-		g_strfreev(_options);
 	}
 
 	return true;
diff --git a/src/output/plugins/JackOutputPlugin.cxx b/src/output/plugins/JackOutputPlugin.cxx
index 5651de68a..777db11bf 100644
--- a/src/output/plugins/JackOutputPlugin.cxx
+++ b/src/output/plugins/JackOutputPlugin.cxx
@@ -21,13 +21,13 @@
 #include "JackOutputPlugin.hxx"
 #include "../OutputAPI.hxx"
 #include "config/ConfigError.hxx"
+#include "util/SplitString.hxx"
 #include "util/Error.hxx"
 #include "util/Domain.hxx"
 #include "Log.hxx"
 
 #include <assert.h>
 
-#include <glib.h>
 #include <jack/jack.h>
 #include <jack/types.h>
 #include <jack/ringbuffer.h>
@@ -56,10 +56,10 @@ struct JackOutput {
 
 	/* configuration */
 
-	char *source_ports[MAX_PORTS];
+	std::string source_ports[MAX_PORTS];
 	unsigned num_source_ports;
 
-	char *destination_ports[MAX_PORTS];
+	std::string destination_ports[MAX_PORTS];
 	unsigned num_destination_ports;
 
 	size_t ringbuffer_size;
@@ -261,13 +261,13 @@ mpd_jack_connect(JackOutput *jd, Error &error)
 
 	for (unsigned i = 0; i < jd->num_source_ports; ++i) {
 		jd->ports[i] = jack_port_register(jd->client,
-						  jd->source_ports[i],
+						  jd->source_ports[i].c_str(),
 						  JACK_DEFAULT_AUDIO_TYPE,
 						  JackPortIsOutput, 0);
 		if (jd->ports[i] == nullptr) {
 			error.Format(jack_output_domain,
 				     "Cannot register output port \"%s\"",
-				     jd->source_ports[i]);
+				     jd->source_ports[i].c_str());
 			mpd_jack_disconnect(jd);
 			return false;
 		}
@@ -283,23 +283,19 @@ mpd_jack_test_default_device(void)
 }
 
 static unsigned
-parse_port_list(const char *source, char **dest, Error &error)
+parse_port_list(const char *source, std::string dest[], Error &error)
 {
-	char **list = g_strsplit(source, ",", 0);
 	unsigned n = 0;
-
-	for (n = 0; list[n] != nullptr; ++n) {
+	for (auto &&i : SplitString(source, ',')) {
 		if (n >= MAX_PORTS) {
 			error.Set(config_domain,
 				  "too many port names");
 			return 0;
 		}
 
-		dest[n] = list[n];
+		dest[n++] = std::move(i);
 	}
 
-	g_free(list);
-
 	if (n == 0) {
 		error.Format(config_domain,
 			     "at least one port name expected");
@@ -392,12 +388,6 @@ mpd_jack_finish(AudioOutput *ao)
 {
 	JackOutput *jd = (JackOutput *)ao;
 
-	for (unsigned i = 0; i < jd->num_source_ports; ++i)
-		g_free(jd->source_ports[i]);
-
-	for (unsigned i = 0; i < jd->num_destination_ports; ++i)
-		g_free(jd->destination_ports[i]);
-
 	delete jd;
 }
 
@@ -505,8 +495,8 @@ mpd_jack_start(JackOutput *jd, Error &error)
 		/* use the configured output ports */
 
 		num_destination_ports = jd->num_destination_ports;
-		memcpy(destination_ports, jd->destination_ports,
-		       num_destination_ports * sizeof(*destination_ports));
+		for (unsigned i = 0; i < num_destination_ports; ++i)
+			destination_ports[i] = jd->destination_ports[i].c_str();
 
 		jports = nullptr;
 	}
-- 
cgit v1.2.3