summaryrefslogtreecommitdiff
path: root/build-aux
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2012-01-18 13:43:23 +0100
committerAleksander Morgado <aleksander@lanedo.com>2012-03-15 14:14:52 +0100
commit04fc34fab89483e9cfdaf7b273a867b72e622fbc (patch)
tree087e33c2692ffb5fa10a9970df7c922e48991b8b /build-aux
parentf8cb1269e31526813450cae4fd7382842fee242d (diff)
downloadModemManager-04fc34fab89483e9cfdaf7b273a867b72e622fbc.tar.gz
build: autogenerate enum/flags string getter/builders
Each enum will have its own #_get_string (), and each flags will have its own #_build_string_from_mask ().
Diffstat (limited to 'build-aux')
-rw-r--r--build-aux/mm-enums-template.c96
-rw-r--r--build-aux/mm-enums-template.h14
2 files changed, 95 insertions, 15 deletions
diff --git a/build-aux/mm-enums-template.c b/build-aux/mm-enums-template.c
index 1e789c396..7f12c2c59 100644
--- a/build-aux/mm-enums-template.c
+++ b/build-aux/mm-enums-template.c
@@ -7,30 +7,96 @@
/*** END file-production ***/
/*** BEGIN value-header ***/
+static const G@Type@Value @enum_name@_values[] = {
+/*** END value-header ***/
+/*** BEGIN value-production ***/
+ { @VALUENAME@, "@VALUENAME@", "@valuenick@" },
+/*** END value-production ***/
+/*** BEGIN value-tail ***/
+ { 0, NULL, NULL }
+};
+
+/* Define type-specific symbols */
+#undef IS_ENUM
+#undef IS_FLAGS
+#define IS_@TYPE@
+
GType
@enum_name@_get_type (void)
{
- static volatile gsize g_define_type_id__volatile = 0;
+ static volatile gsize g_define_type_id__volatile = 0;
- if (g_once_init_enter (&g_define_type_id__volatile))
- {
- static const G@Type@Value values[] = {
-/*** END value-header ***/
+ if (g_once_init_enter (&g_define_type_id__volatile)) {
+ GType g_define_type_id =
+ g_@type@_register_static (g_intern_static_string ("@EnumName@"),
+ @enum_name@_values);
+ g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+ }
-/*** BEGIN value-production ***/
- { @VALUENAME@, "@VALUENAME@", "@valuenick@" },
-/*** END value-production ***/
+ return g_define_type_id__volatile;
+}
-/*** BEGIN value-tail ***/
- { 0, NULL, NULL }
- };
- GType g_define_type_id =
- g_@type@_register_static (g_intern_static_string ("@EnumName@"), values);
- g_once_init_leave (&g_define_type_id__volatile, g_define_type_id);
+/* Enum-specific method to get the value as a string.
+ * We get the nick of the GEnumValue. Note that this will be
+ * valid even if the GEnumClass is not referenced anywhere. */
+#if defined IS_ENUM
+const gchar *
+@enum_name@_get_string (@EnumName@ val)
+{
+ guint i;
+
+ for (i = 0; @enum_name@_values[i].value_nick; i++) {
+ if (val == @enum_name@_values[i].value)
+ return @enum_name@_values[i].value_nick;
+ }
+
+ return NULL;
+}
+#endif /* IS_ENUM */
+
+/* Flags-specific method to build a string with the given mask.
+ * We get a comma separated list of the nicks of the GFlagsValues.
+ * Note that this will be valid even if the GFlagsClass is not referenced
+ * anywhere. */
+#if defined IS_FLAGS
+gchar *
+@enum_name@_build_string_from_mask (@EnumName@ mask)
+{
+ guint i;
+ gboolean first = TRUE;
+ GString *str = NULL;
+
+ for (i = 0; @enum_name@_values[i].value_nick; i++) {
+ /* We also look for exact matches */
+ if (mask == @enum_name@_values[i].value) {
+ if (str)
+ g_string_free (str, TRUE);
+ return g_strdup (@enum_name@_values[i].value_nick);
+ }
+
+ /* Build list with single-bit masks */
+ if (mask & @enum_name@_values[i].value) {
+ guint c;
+ gulong number = @enum_name@_values[i].value;
+
+ for (c = 0; number; c++)
+ number &= number - 1;
+
+ if (c == 1) {
+ if (!str)
+ str = g_string_new ("");
+ g_string_append_printf (str, "%s%s",
+ first ? "" : ", ",
+ @enum_name@_values[i].value_nick);
+ if (first)
+ first = FALSE;
+ }
+ }
}
- return g_define_type_id__volatile;
+ return (str ? g_string_free (str, FALSE) : NULL);
}
+#endif /* IS_FLAGS */
/*** END value-tail ***/
diff --git a/build-aux/mm-enums-template.h b/build-aux/mm-enums-template.h
index df4aa01f7..13db2a6d8 100644
--- a/build-aux/mm-enums-template.h
+++ b/build-aux/mm-enums-template.h
@@ -13,6 +13,20 @@ G_BEGIN_DECLS
/*** BEGIN value-header ***/
GType @enum_name@_get_type (void) G_GNUC_CONST;
#define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type ())
+
+/* Define type-specific symbols */
+#undef IS_ENUM
+#undef IS_FLAGS
+#define IS_@TYPE@
+
+#if defined IS_ENUM
+const gchar *@enum_name@_get_string (@EnumName@ val);
+#endif
+
+#if defined IS_FLAGS
+gchar *@enum_name@_build_string_from_mask (@EnumName@ mask);
+#endif
+
/*** END value-header ***/
/*** BEGIN file-tail ***/