--- a/gplate/gplate-library.c Fri Feb 08 02:38:11 2008 -0600
+++ b/gplate/gplate-library.c Fri Feb 08 03:13:40 2008 -0600
@@ -30,7 +30,13 @@
/******************************************************************************
@@ -39,11 +45,11 @@
static GHashTable *tags = NULL;
/******************************************************************************
- * GPlateLibraryData API
+ * GPlateFunctionData API *****************************************************************************/
-static GPlateLibraryData *
-gplate_library_data_new(GType function, GType tag) {
- GPlateLibraryData *data = g_new(GPlateLibraryData, 1);
+static GPlateFunctionData * +gplate_function_data_new(GType function, GType tag) { + GPlateFunctionData *data = g_new(GPlateFunctionData, 1); data->function = function;
@@ -52,7 +58,38 @@
-gplate_library_data_free(GPlateLibraryData *data) {
+gplate_function_data_free(GPlateFunctionData *data) { +/****************************************************************************** + *****************************************************************************/ +gplate_tag_data_new(GType tag) { + GPlateTagData *data = NULL; + GPlateTagClass *klass = NULL; + const gchar *prefix = NULL, *suffix = NULL; + klass = g_type_class_ref(tag); + prefix = gplate_tag_class_get_prefix(klass); + suffix = gplate_tag_class_get_suffix(klass); + data = g_new(GPlateTagData, 1); + data->prefix = (prefix) ? g_strdup(prefix) : NULL; + data->suffix = (suffix) ? g_strdup(suffix) : NULL; + g_type_class_unref(klass); +gplate_tag_data_free(GPlateTagData *data) { @@ -64,11 +101,12 @@
if(G_UNLIKELY(functions == NULL)) {
g_hash_table_new_full(g_str_hash, g_str_equal, g_free,
- (GDestroyNotify)gplate_library_data_free);
+ (GDestroyNotify)gplate_function_data_free); if(G_UNLIKELY(tags == NULL)) {
- tags = g_hash_table_new(g_direct_hash, g_direct_equal);
+ tags = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, + (GDestroyNotify)gplate_tag_data_free); @@ -117,7 +155,7 @@
gplate_library_add_function(const gchar *name, GType function, GError **error)
- GPlateLibraryData *data = NULL;
+ GPlateFunctionData *data = NULL; g_return_val_if_fail(name, FALSE);
@@ -145,7 +183,7 @@
- data = gplate_library_data_new(function, G_TYPE_INVALID);
+ data = gplate_function_data_new(function, G_TYPE_INVALID); g_hash_table_insert(functions, g_strdup(name), data);
@@ -193,7 +231,7 @@
gplate_library_add_tag(GType tag, GError **error) {
+ GPlateTagData *data = NULL; gplate_library_lazy_init();
@@ -212,9 +250,9 @@
- data = GSIZE_TO_POINTER(tag);
+ data = gplate_tag_data_new(tag); - g_hash_table_insert(tags, data, data);
+ g_hash_table_insert(tags, GSIZE_TO_POINTER(data->tag), data); @@ -257,7 +295,7 @@
gplate_library_bind_function(const gchar *name, GType tag, GError **error) {
- GPlateLibraryData *data = NULL;
+ GPlateFunctionData *data = NULL; gplate_library_lazy_init();
@@ -298,7 +336,7 @@
gplate_library_unbind_function(const gchar *name, GError **error) {
- GPlateLibraryData *data = NULL;
+ GPlateFunctionData *data = NULL; g_return_val_if_fail(name, FALSE);
@@ -385,7 +423,7 @@
gplate_library_lookup_function(const gchar *name, GType *function, GType *tag,
- GPlateLibraryData *data = NULL;
+ GPlateFunctionData *data = NULL; g_return_val_if_fail(name, FALSE);
@@ -460,10 +498,10 @@
gplate_library_tags_foreach_helper(gpointer k, gpointer v, gpointer d) {
- GPlateLibraryTagsForeachData *data = (GPlateLibraryTagsForeachData *)d;
- GType t = GPOINTER_TO_SIZE(k);
+ GPlateTagData *data = (GPlateTagData *)v; + GPlateLibraryTagsForeachData *fhd = (GPlateLibraryTagsForeachData *)d; - data->func(t, data->data);
+ fhd->func(data->tag, data->prefix, data->suffix, fhd->data); --- a/gplate/gplate-library.h Fri Feb 08 02:38:11 2008 -0600
+++ b/gplate/gplate-library.h Fri Feb 08 03:13:40 2008 -0600
@@ -26,7 +26,7 @@
-typedef void (*GPlateLibraryTagsForeachFunc)(GType tag, gpointer data);
+typedef void (*GPlateLibraryTagsForeachFunc)(GType tag, const gchar *prefix, const gchar *suffix, gpointer data); gboolean gplate_library_add_function(const gchar *name, GType function, GError **error);
gboolean gplate_library_remove_function(const gchar *name, GError **error);