diff options
author | Matthias Clasen <mclasen@redhat.com> | 2014-09-26 23:28:55 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2014-09-26 23:30:29 -0400 |
commit | f35dff334fc9e52582fd49d47440f4b1f0e7e91b (patch) | |
tree | 365b4e0c8dbe8080ce2b77ea1057d9d037a6251e /gtk/gtkbuilder.c | |
parent | 0c2f3402c3214ae8daa37a3aa350db31ed5e5ddc (diff) | |
download | gtk+-f35dff334fc9e52582fd49d47440f4b1f0e7e91b.tar.gz |
Factor out a function
Factor out the typename-to-get-type mangling as a separate
function, for easier testing.
Also fix some cases where it doesn't, currently, like
GString -> g_string_get_type and
GdkRGB -> gdk_rgb_get_type
Diffstat (limited to 'gtk/gtkbuilder.c')
-rw-r--r-- | gtk/gtkbuilder.c | 41 |
1 files changed, 24 insertions, 17 deletions
diff --git a/gtk/gtkbuilder.c b/gtk/gtkbuilder.c index 7878a4360e..b07ee5eeab 100644 --- a/gtk/gtkbuilder.c +++ b/gtk/gtkbuilder.c @@ -372,36 +372,43 @@ gtk_builder_get_property (GObject *object, * GtkWindow -> gtk_window_get_type * GtkHBox -> gtk_hbox_get_type * GtkUIManager -> gtk_ui_manager_get_type - * + * GdkRGB -> gdk_rgb_get_type */ -static GType -_gtk_builder_resolve_type_lazily (const gchar *name) +static gchar * +type_name_mangle (const gchar *name) { - static GModule *module = NULL; - GTypeGetFunc func; GString *symbol_name = g_string_new (""); - char c, *symbol; int i; - GType gtype = G_TYPE_INVALID; - if (!module) - module = g_module_open (NULL, 0); - for (i = 0; name[i] != '\0'; i++) { - c = name[i]; /* skip if uppercase, first or previous is uppercase */ - if ((c == g_ascii_toupper (c) && - i > 0 && name[i-1] != g_ascii_toupper (name[i-1])) || + if ((i > 0 && name[i] == g_ascii_toupper (name[i]) && + (name[i-1] != g_ascii_toupper (name[i-1]) || i == 1)) || (i > 2 && name[i] == g_ascii_toupper (name[i]) && - name[i-1] == g_ascii_toupper (name[i-1]) && - name[i-2] == g_ascii_toupper (name[i-2]))) + name[i-1] == g_ascii_toupper (name[i-1]) && + name[i-2] == g_ascii_toupper (name[i-2]) && + name[i+1] != 0 && name[i+1] != g_ascii_toupper (name[i+1]))) g_string_append_c (symbol_name, '_'); - g_string_append_c (symbol_name, g_ascii_tolower (c)); + g_string_append_c (symbol_name, g_ascii_tolower (name[i])); } g_string_append (symbol_name, "_get_type"); + + return g_string_free (symbol_name, FALSE); +} + +static GType +_gtk_builder_resolve_type_lazily (const gchar *name) +{ + static GModule *module = NULL; + GTypeGetFunc func; + gchar *symbol; + GType gtype = G_TYPE_INVALID; + + if (!module) + module = g_module_open (NULL, 0); - symbol = g_string_free (symbol_name, FALSE); + symbol = type_name_mangle (name); if (g_module_symbol (module, symbol, (gpointer)&func)) gtype = func (); |