--- a/libpurple/purpletags.c Fri Nov 04 23:58:18 2022 -0500
+++ b/libpurple/purpletags.c Sat Nov 05 00:15:03 2022 -0500
@@ -175,3 +175,27 @@
return g_string_free(value, FALSE);
+purple_tag_parse(const char *tag, char **name, char **value) { + const char *colon = NULL; + g_return_if_fail(tag != NULL); + colon = g_strstr_len(tag, -1, ":"); + *name = g_strndup(tag, colon - tag); + *value = g_strdup(colon + 1); --- a/libpurple/purpletags.h Fri Nov 04 23:58:18 2022 -0500
+++ b/libpurple/purpletags.h Sat Nov 05 00:15:03 2022 -0500
@@ -152,6 +152,20 @@
gchar *purple_tags_to_string(PurpleTags *tags, const gchar *separator);
+ * @name: (nullable) (optional) (out): An optional return address for the name + * @value: (nullable) (optional) (out): An optional return address for the + * Splits a tag into its name and value parts. +void purple_tag_parse(const char *tag, char **name, char **value); #endif /* PURPLE_TAGS_H */
--- a/libpurple/tests/test_tags.c Fri Nov 04 23:58:18 2022 -0500
+++ b/libpurple/tests/test_tags.c Sat Nov 05 00:15:03 2022 -0500
@@ -245,6 +245,47 @@
/******************************************************************************
+ * purple_tag_parse Tests + *****************************************************************************/ +} TestPurpleTagParseData; +test_purple_tag_parse(void) { + TestPurpleTagParseData data[] = { + {"foo:bar", "foo", "bar"}, + for(int i = 0; data[i].tag != NULL; i++) { + purple_tag_parse(data[i].tag, &name, &value); + g_assert_cmpstr(name, ==, data[i].name); + g_assert_cmpstr(value, ==, data[i].value); + /* Finally make sure that we don't crash if neither optional argument was + purple_tag_parse("", NULL, NULL); +/****************************************************************************** *****************************************************************************/
@@ -281,5 +322,7 @@
g_test_add_func("/tags/to-string-multiple-with-null-separator",
test_purple_tags_to_string_multiple_with_null_separator);
+ g_test_add_func("/tag/parse", test_purple_tag_parse);