summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hughes <richard@hughsie.com>2016-03-03 13:42:59 +0000
committerRichard Hughes <richard@hughsie.com>2016-03-03 17:39:01 +0000
commit4160f8b48ca7a3f06e0865d5bc40736daa5bb7a0 (patch)
tree1d670a9c6073051dd27eb0398e356aec62034cbc
parent45406dd91959729e0f8935cf864f70f291801489 (diff)
downloadappstream-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.c42
-rw-r--r--libappstream-builder/asb-self-test.c13
-rw-r--r--libappstream-builder/asb-utils.c29
-rw-r--r--libappstream-builder/asb-utils.h3
-rw-r--r--libappstream-glib/as-node.c25
-rw-r--r--libappstream-glib/as-self-test.c28
-rw-r--r--libappstream-glib/as-utils.c62
-rw-r--r--libappstream-glib/as-utils.h3
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, "&", "&amp;");
- as_node_string_replace (str, "<", "&lt;");
- as_node_string_replace (str, ">", "&gt;");
+ as_utils_string_replace (str, "&", "&amp;");
+ as_utils_string_replace (str, "<", "&lt;");
+ as_utils_string_replace (str, ">", "&gt;");
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&", "&", "&amp;", "bee&amp;" },
+ { 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