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 ().
This commit is contained in:
Aleksander Morgado
2012-01-18 13:43:23 +01:00
parent f8cb1269e3
commit 04fc34fab8
4 changed files with 101 additions and 21 deletions

View File

@@ -7,31 +7,97 @@
/*** END file-production ***/ /*** END file-production ***/
/*** BEGIN value-header ***/ /*** 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 GType
@enum_name@_get_type (void) @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)) if (g_once_init_enter (&g_define_type_id__volatile)) {
{ GType g_define_type_id =
static const G@Type@Value values[] = { g_@type@_register_static (g_intern_static_string ("@EnumName@"),
/*** END value-header ***/ @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 ***/
/*** 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);
} }
return g_define_type_id__volatile; return g_define_type_id__volatile;
} }
/* 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 (str ? g_string_free (str, FALSE) : NULL);
}
#endif /* IS_FLAGS */
/*** END value-tail ***/ /*** END value-tail ***/
/*** BEGIN file-tail ***/ /*** BEGIN file-tail ***/

View File

@@ -13,6 +13,20 @@ G_BEGIN_DECLS
/*** BEGIN value-header ***/ /*** BEGIN value-header ***/
GType @enum_name@_get_type (void) G_GNUC_CONST; GType @enum_name@_get_type (void) G_GNUC_CONST;
#define @ENUMPREFIX@_TYPE_@ENUMSHORT@ (@enum_name@_get_type ()) #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 ***/ /*** END value-header ***/
/*** BEGIN file-tail ***/ /*** BEGIN file-tail ***/

View File

@@ -37,14 +37,14 @@ GENERATED_DOC = \
# Enum types # Enum types
mm-enums-types.h: Makefile.am $(top_srcdir)/include/ModemManager-enums.h $(top_srcdir)/build-aux/mm-enums-template.h mm-enums-types.h: Makefile.am $(top_srcdir)/include/ModemManager-enums.h $(top_srcdir)/build-aux/mm-enums-template.h
$(AM_V_GEN) glib-mkenums \ $(AM_V_GEN) glib-mkenums \
--fhead "#ifndef __MM_ENUMS_TYPES_H__\n#define __MM_ENUMS_TYPES_H__\n" \ --fhead "#include <ModemManager-enums.h>\n#ifndef __MM_ENUMS_TYPES_H__\n#define __MM_ENUMS_TYPES_H__\n" \
--template $(top_srcdir)/build-aux/mm-enums-template.h \ --template $(top_srcdir)/build-aux/mm-enums-template.h \
--ftail "#endif /* __MM_ENUMS_TYPES_H__ */\n" \ --ftail "#endif /* __MM_ENUMS_TYPES_H__ */\n" \
$(top_srcdir)/include/ModemManager-enums.h > $@ $(top_srcdir)/include/ModemManager-enums.h > $@
mm-enums-types.c: Makefile.am $(top_srcdir)/include/ModemManager-enums.h $(top_srcdir)/build-aux/mm-enums-template.c mm-enums-types.h mm-enums-types.c: Makefile.am $(top_srcdir)/include/ModemManager-enums.h $(top_srcdir)/build-aux/mm-enums-template.c mm-enums-types.h
$(AM_V_GEN) glib-mkenums \ $(AM_V_GEN) glib-mkenums \
--fhead "#include <ModemManager-enums.h>\n#include \"mm-enums-types.h\"\n" \ --fhead "#include \"mm-enums-types.h\"\n" \
--template $(top_srcdir)/build-aux/mm-enums-template.c \ --template $(top_srcdir)/build-aux/mm-enums-template.c \
$(top_srcdir)/include/ModemManager-enums.h > $@ $(top_srcdir)/include/ModemManager-enums.h > $@

View File

@@ -58,14 +58,14 @@ WITH_ENUMS = mm-bearer.h
mm-private-enums-types.h: Makefile.am $(WITH_ENUMS) $(top_srcdir)/build-aux/mm-enums-template.h mm-private-enums-types.h: Makefile.am $(WITH_ENUMS) $(top_srcdir)/build-aux/mm-enums-template.h
$(AM_V_GEN) glib-mkenums \ $(AM_V_GEN) glib-mkenums \
--fhead "#ifndef __MM_PRIVATE_ENUMS_TYPES_H__\n#define __MM_PRIVATE_ENUMS_TYPES_H__\n" \ --fhead "#include \"mm-bearer.h\"\n#ifndef __MM_PRIVATE_ENUMS_TYPES_H__\n#define __MM_PRIVATE_ENUMS_TYPES_H__\n" \
--template $(top_srcdir)/build-aux/mm-enums-template.h \ --template $(top_srcdir)/build-aux/mm-enums-template.h \
--ftail "#endif /* __MM_PRIVATE_ENUMS_TYPES_H__ */\n" \ --ftail "#endif /* __MM_PRIVATE_ENUMS_TYPES_H__ */\n" \
$(WITH_ENUMS) > $@ $(WITH_ENUMS) > $@
mm-private-enums-types.c: Makefile.am $(top_srcdir)/include/ModemManager-enums.h $(top_srcdir)/build-aux/mm-enums-template.c mm-private-enums-types.h mm-private-enums-types.c: Makefile.am $(top_srcdir)/include/ModemManager-enums.h $(top_srcdir)/build-aux/mm-enums-template.c mm-private-enums-types.h
$(AM_V_GEN) glib-mkenums \ $(AM_V_GEN) glib-mkenums \
--fhead "#include \"mm-bearer.h\"\n#include \"mm-private-enums-types.h\"" \ --fhead "#include \"mm-private-enums-types.h\"" \
--template $(top_srcdir)/build-aux/mm-enums-template.c \ --template $(top_srcdir)/build-aux/mm-enums-template.c \
$(WITH_ENUMS) > $@ $(WITH_ENUMS) > $@