diff options
author | Richard Hughes <richard@hughsie.com> | 2016-03-03 13:42:59 +0000 |
---|---|---|
committer | Richard Hughes <richard@hughsie.com> | 2016-03-03 17:39:01 +0000 |
commit | 4160f8b48ca7a3f06e0865d5bc40736daa5bb7a0 (patch) | |
tree | 1d670a9c6073051dd27eb0398e356aec62034cbc | |
parent | 45406dd91959729e0f8935cf864f70f291801489 (diff) | |
download | appstream-glib-4160f8b48ca7a3f06e0865d5bc40736daa5bb7a0.tar.gz |
Add as_utils_string_replace()
This is used all over the place both in and out of tree.
-rw-r--r-- | client/as-util.c | 42 | ||||
-rw-r--r-- | libappstream-builder/asb-self-test.c | 13 | ||||
-rw-r--r-- | libappstream-builder/asb-utils.c | 29 | ||||
-rw-r--r-- | libappstream-builder/asb-utils.h | 3 | ||||
-rw-r--r-- | libappstream-glib/as-node.c | 25 | ||||
-rw-r--r-- | libappstream-glib/as-self-test.c | 28 | ||||
-rw-r--r-- | libappstream-glib/as-utils.c | 62 | ||||
-rw-r--r-- | libappstream-glib/as-utils.h | 3 |
8 files changed, 97 insertions, 108 deletions
diff --git a/client/as-util.c b/client/as-util.c index c2c9546..9c70ea8 100644 --- a/client/as-util.c +++ b/client/as-util.c @@ -704,46 +704,6 @@ as_util_appdata_to_news (AsUtilPrivate *priv, gchar **values, GError **error) return TRUE; } -/** - * as_string_replace: - **/ -static guint -as_string_replace (GString *string, const gchar *search, const gchar *replace) -{ - gchar *tmp; - guint count = 0; - guint replace_len; - guint search_len; - - search_len = strlen (search); - replace_len = strlen (replace); - - do { - tmp = g_strstr_len (string->str, -1, search); - if (tmp == NULL) - goto out; - - /* reallocate the string if required */ - if (search_len > replace_len) { - g_string_erase (string, - tmp - string->str, - search_len - replace_len); - } - if (search_len < replace_len) { - g_string_insert_len (string, - tmp - string->str, - search, - replace_len - search_len); - } - - /* just memcmp in the new string */ - memcpy (tmp, replace, replace_len); - count++; - } while (TRUE); -out: - return count; -} - typedef enum { AS_UTIL_SECTION_KIND_UNKNOWN, AS_UTIL_SECTION_KIND_HEADER, @@ -1001,7 +961,7 @@ as_util_news_to_appdata (AsUtilPrivate *priv, gchar **values, GError **error) /* try to unsplit lines */ data_str = g_string_new (data); - as_string_replace (data_str, "\n ", " "); + as_utils_string_replace (data_str, "\n ", " "); /* break up into sections */ desc = g_string_new (""); diff --git a/libappstream-builder/asb-self-test.c b/libappstream-builder/asb-self-test.c index 8e32d73..f37b39d 100644 --- a/libappstream-builder/asb-self-test.c +++ b/libappstream-builder/asb-self-test.c @@ -259,18 +259,6 @@ asb_test_utils_glob_func (void) } static void -asb_test_utils_replace_func (void) -{ - guint n; - g_autoptr(GString) str = NULL; - - str = g_string_new ("I want to have searched for search"); - n = asb_string_replace (str, "search", "replace"); - g_assert_cmpstr (str->str, ==, "I want to have replaceed for replace"); - g_assert_cmpint (n, ==, 2); -} - -static void asb_test_plugin_loader_func (void) { AsbPluginLoader *loader = NULL; @@ -925,7 +913,6 @@ main (int argc, char **argv) /* tests go here */ g_test_add_func ("/AppStreamBuilder/package", asb_test_package_func); - g_test_add_func ("/AppStreamBuilder/utils{replace}", asb_test_utils_replace_func); g_test_add_func ("/AppStreamBuilder/utils{glob}", asb_test_utils_glob_func); g_test_add_func ("/AppStreamBuilder/plugin-loader", asb_test_plugin_loader_func); g_test_add_func ("/AppStreamBuilder/firmware", asb_test_firmware_func); diff --git a/libappstream-builder/asb-utils.c b/libappstream-builder/asb-utils.c index 3649c6e..616c40a 100644 --- a/libappstream-builder/asb-utils.c +++ b/libappstream-builder/asb-utils.c @@ -536,35 +536,6 @@ asb_utils_write_archive_dir (const gchar *filename, return asb_utils_write_archive (filename, directory, files, error); } -/** - * asb_string_replace: - * @string: Source string - * @search: utf8 string to search for - * @replace: utf8 string to replace with - * - * Does search/replace on a given string. - * - * Returns: the number of times the string was replaced - * - * Since: 0.1.0 - **/ -guint -asb_string_replace (GString *string, const gchar *search, const gchar *replace) -{ - g_autofree gchar *tmp = NULL; - g_auto(GStrv) split = NULL; - - /* quick search */ - if (g_strstr_len (string->str, -1, search) == NULL) - return 0; - - /* replace */ - split = g_strsplit (string->str, search, -1); - tmp = g_strjoinv (replace, split); - g_string_assign (string, tmp); - return g_strv_length (split) - 1; -} - /******************************************************************************/ struct AsbGlobValue { diff --git a/libappstream-builder/asb-utils.h b/libappstream-builder/asb-utils.h index 83020e3..266f311 100644 --- a/libappstream-builder/asb-utils.h +++ b/libappstream-builder/asb-utils.h @@ -52,9 +52,6 @@ void asb_glob_value_free (AsbGlobValue *kv); const gchar *asb_glob_value_search (GPtrArray *array, const gchar *search); GPtrArray *asb_glob_value_array_new (void); -guint asb_string_replace (GString *string, - const gchar *search, - const gchar *replace); G_END_DECLS diff --git a/libappstream-glib/as-node.c b/libappstream-glib/as-node.c index 820a9ed..340ee1e 100644 --- a/libappstream-glib/as-node.c +++ b/libappstream-glib/as-node.c @@ -173,25 +173,6 @@ as_node_unref (AsNode *node) G_DEFINE_QUARK (as-node-error-quark, as_node_error) /** - * as_node_string_replace: - **/ -static void -as_node_string_replace (GString *string, const gchar *search, const gchar *replace) -{ - g_autofree gchar *tmp = NULL; - g_auto(GStrv) split = NULL; - - /* quick search */ - if (g_strstr_len (string->str, -1, search) == NULL) - return; - - /* replace */ - split = g_strsplit (string->str, search, -1); - tmp = g_strjoinv (replace, split); - g_string_assign (string, tmp); -} - -/** * as_node_string_replace_inplace: **/ static void @@ -241,9 +222,9 @@ as_node_cdata_to_escaped (AsNodeData *data) return; str = g_string_new (data->cdata); g_free (data->cdata); - as_node_string_replace (str, "&", "&"); - as_node_string_replace (str, "<", "<"); - as_node_string_replace (str, ">", ">"); + as_utils_string_replace (str, "&", "&"); + as_utils_string_replace (str, "<", "<"); + as_utils_string_replace (str, ">", ">"); data->cdata = g_string_free (str, FALSE); data->cdata_escaped = TRUE; } diff --git a/libappstream-glib/as-self-test.c b/libappstream-glib/as-self-test.c index 43f499f..3c90f7c 100644 --- a/libappstream-glib/as-self-test.c +++ b/libappstream-glib/as-self-test.c @@ -4592,6 +4592,33 @@ as_test_utils_install_filename_func (void) g_assert (g_file_test ("/tmp/destdir/usr/share/app-info/icons/origin/64x64/org.gnome.Software.png", G_FILE_TEST_EXISTS)); } +static void +as_test_utils_string_replace_func (void) +{ + guint i; + struct { + const gchar *str; + const gchar *search; + const gchar *replace; + const gchar *result; + } table[] = { + { "", "", "", "" }, + { "one", "one", "two", "two" }, + { "one", "one", "1", "1" }, + { "one", "one", "onlyme", "onlyme" }, + { "we few ppl", " few ", "", "weppl" }, + { "bee&", "&", "&", "bee&" }, + { NULL, NULL, NULL, NULL } + }; + for (i = 0; table[i].str != NULL; i++) { + g_autoptr(GString) str = g_string_new (table[i].str); + as_utils_string_replace (str, + table[i].search, + table[i].replace); + g_assert_cmpstr (str->str, ==, table[i].result); + } +} + int main (int argc, char **argv) { @@ -4651,6 +4678,7 @@ main (int argc, char **argv) g_test_add_func ("/AppStream/utils{spdx-token}", as_test_utils_spdx_token_func); g_test_add_func ("/AppStream/utils{install-filename}", as_test_utils_install_filename_func); g_test_add_func ("/AppStream/utils{vercmp}", as_test_utils_vercmp_func); + g_test_add_func ("/AppStream/utils{string-replace}", as_test_utils_string_replace_func); if (g_test_slow ()) { g_test_add_func ("/AppStream/monitor{dir}", as_test_monitor_dir_func); g_test_add_func ("/AppStream/monitor{file}", as_test_monitor_file_func); diff --git a/libappstream-glib/as-utils.c b/libappstream-glib/as-utils.c index 923ca5c..1f1140c 100644 --- a/libappstream-glib/as-utils.c +++ b/libappstream-glib/as-utils.c @@ -1554,3 +1554,65 @@ as_utils_version_parse (const gchar *version) return g_strdup (version); return as_utils_version_from_uint32 (tmp, AS_VERSION_PARSE_FLAG_USE_TRIPLET); } + +/** + * as_utils_string_replace: + * @string: The #GString to operate on + * @search: The text to search for + * @replace: The text to use for substitutions + * + * Performs multiple search and replace operations on the given string. + * + * Returns: the number of replacements done, or 0 if @search is not found. + * + * Since: 0.5.11 + **/ +guint +as_utils_string_replace (GString *string, const gchar *search, const gchar *replace) +{ + gchar *tmp; + guint count = 0; + guint search_idx = 0; + guint replace_len; + guint search_len; + + g_return_val_if_fail (string != NULL, 0); + g_return_val_if_fail (search != NULL, 0); + g_return_val_if_fail (replace != NULL, 0); + + /* nothing to do */ + if (string->len == 0) + return 0; + + search_len = strlen (search); + replace_len = strlen (replace); + + do { + tmp = g_strstr_len (string->str + search_idx, -1, search); + if (tmp == NULL) + break; + + /* advance the counter in case @replace contains @search */ + search_idx = tmp - string->str; + + /* reallocate the string if required */ + if (search_len > replace_len) { + g_string_erase (string, search_idx, + search_len - replace_len); + memcpy (tmp, replace, replace_len); + } else if (search_len < replace_len) { + g_string_insert_len (string, search_idx, search, + replace_len - search_len); + /* we have to treat this specially as it could have + * been reallocated when the insertion happened */ + memcpy (string->str + search_idx, replace, replace_len); + } else { + /* just memcmp in the new string */ + memcpy (tmp, replace, replace_len); + } + search_idx += replace_len; + count++; + } while (TRUE); + + return count; +} diff --git a/libappstream-glib/as-utils.h b/libappstream-glib/as-utils.h index 8c0c5cf..b39876d 100644 --- a/libappstream-glib/as-utils.h +++ b/libappstream-glib/as-utils.h @@ -126,6 +126,9 @@ gchar *as_utils_version_from_uint32 (guint32 val, gchar *as_utils_version_from_uint16 (guint16 val, AsVersionParseFlag flags); gchar *as_utils_version_parse (const gchar *version); +guint as_utils_string_replace (GString *string, + const gchar *search, + const gchar *replace); G_END_DECLS |