[gtk+] Factor out a function



commit f35dff334fc9e52582fd49d47440f4b1f0e7e91b
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Sep 26 23:28:55 2014 -0400

    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

 gtk/gtkbuilder.c |   41 ++++++++++++++++++++++++-----------------
 1 files changed, 24 insertions(+), 17 deletions(-)
---
diff --git a/gtk/gtkbuilder.c b/gtk/gtkbuilder.c
index 7878a43..b07ee5e 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 ();


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]