[glib/gsettings: 52/327] Add functions to deal with string arrays
- From: Ryan Lortie <ryanl src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [glib/gsettings: 52/327] Add functions to deal with string arrays
- Date: Thu, 27 Aug 2009 17:48:12 +0000 (UTC)
commit de8edf103b05ed691dac5d8168ec4510482ecf5e
Author: Ryan Lortie <desrt desrt ca>
Date: Sun May 3 00:02:12 2009 -0400
Add functions to deal with string arrays
- g_variant_new_strv ()
- g_variant_get_strv ()
- g_variant_dup_strv ()
docs/reference/glib/glib-sections.txt | 3 +
glib/gvariant-util.c | 120 +++++++++++++++++++++++++++++++++
glib/gvariant.h | 6 ++
3 files changed, 129 insertions(+), 0 deletions(-)
---
diff --git a/docs/reference/glib/glib-sections.txt b/docs/reference/glib/glib-sections.txt
index d093990..18c350a 100644
--- a/docs/reference/glib/glib-sections.txt
+++ b/docs/reference/glib/glib-sections.txt
@@ -2762,6 +2762,7 @@ g_variant_is_object_path
g_variant_new_signature
g_variant_is_signature
g_variant_new_variant
+g_variant_new_strv
<SUBSECTION>
g_variant_get_boolean
@@ -2776,6 +2777,8 @@ g_variant_get_double
g_variant_get_string
g_variant_dup_string
g_variant_get_variant
+g_variant_get_strv
+g_variant_dup_strv
<SUBSECTION>
g_variant_n_children
diff --git a/glib/gvariant-util.c b/glib/gvariant-util.c
index 8db4e93..aa86c1f 100644
--- a/glib/gvariant-util.c
+++ b/glib/gvariant-util.c
@@ -1763,5 +1763,125 @@ g_variant_deep_copy (GVariant *value)
}
}
+/**
+ * g_variant_new_strv:
+ * @strv: an array of strings
+ * @length: the length of @strv, or -1
+ * @returns: a new floating #GVariant instance
+ *
+ * Constructs an array of strings #GVariant from the given array of
+ * strings.
+ *
+ * If @length is not -1 then it gives the maximum length of @strv. In
+ * any case, a %NULL pointer in @strv is taken as a terminator.
+ **/
+GVariant *
+g_variant_new_strv (const gchar * const *strv,
+ gint length)
+{
+ GVariantBuilder *builder;
+
+ builder = g_variant_builder_new (G_VARIANT_TYPE_CLASS_ARRAY,
+ G_VARIANT_TYPE ("as"));
+ while (length-- && *strv)
+ g_variant_builder_add (builder, "s", *strv++);
+
+ return g_variant_builder_end (builder);
+}
+
+/**
+ * g_variant_get_strv:
+ * @value: an array of strings #GVariant
+ * @length: the length of the result, or %NULL
+ * @returns: an array of constant strings
+ *
+ * Gets the contents of an array of strings #GVariant. This call
+ * makes a shallow copy; the return result should be released with
+ * g_free(), but the individual strings must not be modified.
+ *
+ * If @length is non-%NULL then the number of elements in the result
+ * is stored there. In any case, the resulting array will be
+ * %NULL-terminated.
+ *
+ * For an empty array, @length will be set to 0 and a pointer to a
+ * %NULL pointer will be returned.
+ **/
+const gchar **
+g_variant_get_strv (GVariant *value,
+ gint *length)
+{
+ const gchar **result;
+ gint my_length;
+ gint i;
+
+ g_return_val_if_fail (g_variant_matches (value, G_VARIANT_TYPE ("as")),
+ NULL);
+
+ g_variant_flatten (value);
+
+ my_length = g_variant_n_children (value);
+ result = g_new (const gchar *, my_length + 1);
+
+ if (length)
+ *length = my_length;
+
+ for (i = 0; i < my_length; i++)
+ {
+ GVariant *child = g_variant_get_child (value, i);
+ result[i] = g_variant_get_string (child, NULL);
+ g_variant_unref (child);
+ }
+ result[i] = NULL;
+
+ return result;
+}
+
+/**
+ * g_variant_dup_strv:
+ * @value: an array of strings #GVariant
+ * @length: the length of the result, or %NULL
+ * @returns: an array of constant strings
+ *
+ * Gets the contents of an array of strings #GVariant. This call
+ * makes a deep copy; the return result should be released with
+ * g_strfreev().
+ *
+ * If @length is non-%NULL then the number of elements in the result
+ * is stored there. In any case, the resulting array will be
+ * %NULL-terminated.
+ *
+ * For an empty array, @length will be set to 0 and a pointer to a
+ * %NULL pointer will be returned.
+ **/
+gchar **
+g_variant_dup_strv (GVariant *value,
+ gint *length)
+{
+ gchar **result;
+ gint my_length;
+ gint i;
+
+ g_return_val_if_fail (g_variant_matches (value, G_VARIANT_TYPE ("as")),
+ NULL);
+
+ g_variant_flatten (value);
+
+ my_length = g_variant_n_children (value);
+ result = g_new (gchar *, my_length + 1);
+
+ if (length)
+ *length = my_length;
+
+ for (i = 0; i < my_length; i++)
+ {
+ GVariant *child = g_variant_get_child (value, i);
+ result[i] = g_variant_dup_string (child, NULL);
+ g_variant_unref (child);
+ }
+ result[i] = NULL;
+
+ return result;
+}
+
#define _gvariant_util_c_
#include "galiasdef.c"
diff --git a/glib/gvariant.h b/glib/gvariant.h
index 0054e78..9356bf1 100644
--- a/glib/gvariant.h
+++ b/glib/gvariant.h
@@ -73,6 +73,8 @@ gboolean g_variant_is_object_path (const g
GVariant *g_variant_new_signature (const gchar *string);
gboolean g_variant_is_signature (const gchar *string);
GVariant *g_variant_new_variant (GVariant *value);
+GVariant *g_variant_new_strv (const gchar * const *strv,
+ gint length);
/* deconstructors */
gboolean g_variant_get_boolean (GVariant *value);
@@ -88,6 +90,10 @@ const gchar *g_variant_get_string (GVarian
gsize *length);
gchar *g_variant_dup_string (GVariant *value,
gsize *length);
+const gchar ** g_variant_get_strv (GVariant *value,
+ gint *length);
+gchar ** g_variant_dup_strv (GVariant *value,
+ gint *length);
GVariant *g_variant_get_variant (GVariant *value);
gconstpointer g_variant_get_fixed (GVariant *value,
gsize size);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]