diff options
-rw-r--r-- | src/mm-private-boxed-types.c | 84 | ||||
-rw-r--r-- | src/mm-private-boxed-types.h | 8 |
2 files changed, 92 insertions, 0 deletions
diff --git a/src/mm-private-boxed-types.c b/src/mm-private-boxed-types.c index 1f5d6a8b..a7b166ef 100644 --- a/src/mm-private-boxed-types.c +++ b/src/mm-private-boxed-types.c @@ -51,6 +51,90 @@ mm_uint16_array_get_type (void) return g_define_type_id__volatile; } +static mm_uint16_pair * +uint16_pair_array_copy (mm_uint16_pair *array) +{ + mm_uint16_pair *dup; + guint i; + + if (!array) + return NULL; + + /* Get 0-terminated array size */ + for (i = 0; array[i].l; i++); + + dup = g_new (mm_uint16_pair, i + 1); + memcpy (dup, array, i * sizeof (mm_uint16_pair)); + dup[i].l = 0; dup[i].r = 0; + return dup; +} + +GType +mm_uint16_pair_array_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + GType g_define_type_id = + g_boxed_type_register_static (g_intern_static_string ("MMUint16PairArray"), + (GBoxedCopyFunc) uint16_pair_array_copy, + (GBoxedFreeFunc) g_free); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} + +static void +str_pair_array_free (mm_str_pair *array) +{ + guint i; + + for (i = 0; array[i].l; i++) { + g_free (array[i].l); + g_free (array[i].r); + } + g_free (array); +} + +static mm_str_pair * +str_pair_array_copy (mm_str_pair *array) +{ + mm_str_pair *dup; + guint i; + + if (!array) + return NULL; + + /* Get NULL-terminated array size */ + for (i = 0; array[i].l; i++); + + dup = g_new (mm_str_pair, i + 1); + for (i = 0; array[i].l; i++) { + dup[i].l = g_strdup (array[i].l); + dup[i].r = g_strdup (array[i].r); + } + dup[i].l = NULL; dup[i].r = NULL; + return dup; +} + +GType +mm_str_pair_array_get_type (void) +{ + static volatile gsize g_define_type_id__volatile = 0; + + if (g_once_init_enter (&g_define_type_id__volatile)) { + GType g_define_type_id = + g_boxed_type_register_static (g_intern_static_string ("MMStrPairArray"), + (GBoxedCopyFunc) str_pair_array_copy, + (GBoxedFreeFunc) str_pair_array_free); + + g_once_init_leave (&g_define_type_id__volatile, g_define_type_id); + } + + return g_define_type_id__volatile; +} static gpointer * pointer_array_copy (gpointer *array) diff --git a/src/mm-private-boxed-types.h b/src/mm-private-boxed-types.h index 661ce991..dba8d359 100644 --- a/src/mm-private-boxed-types.h +++ b/src/mm-private-boxed-types.h @@ -23,6 +23,14 @@ G_BEGIN_DECLS GType mm_uint16_array_get_type (void) G_GNUC_CONST; #define MM_TYPE_UINT16_ARRAY (mm_uint16_array_get_type ()) +typedef struct { guint16 l; guint16 r; } mm_uint16_pair; +GType mm_uint16_pair_array_get_type (void) G_GNUC_CONST; +#define MM_TYPE_UINT16_PAIR_ARRAY (mm_uint16_pair_array_get_type ()) + +typedef struct { gchar *l; gchar *r; } mm_str_pair; +GType mm_str_pair_array_get_type (void) G_GNUC_CONST; +#define MM_TYPE_STR_PAIR_ARRAY (mm_str_pair_array_get_type ()) + GType mm_pointer_array_get_type (void) G_GNUC_CONST; #define MM_TYPE_POINTER_ARRAY (mm_pointer_array_get_type ()) |