diff options
author | Aleksander Morgado <aleksander@lanedo.com> | 2012-01-18 13:43:23 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@lanedo.com> | 2012-03-15 14:14:52 +0100 |
commit | 04fc34fab89483e9cfdaf7b273a867b72e622fbc (patch) | |
tree | 087e33c2692ffb5fa10a9970df7c922e48991b8b /build-aux | |
parent | f8cb1269e31526813450cae4fd7382842fee242d (diff) | |
download | ModemManager-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.c | 96 | ||||
-rw-r--r-- | build-aux/mm-enums-template.h | 14 |
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 ***/ |