grim/gplate

Parents 0dca6bccdacb
Children 9f332074120d
Made the tag hash table store the prefix and suffix for each tag
--- 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 @@
typedef struct {
GType function;
GType tag;
-} GPlateLibraryData;
+} GPlateFunctionData;
+
+typedef struct {
+ GType tag;
+ gchar *prefix;
+ gchar *suffix;
+} GPlateTagData;
/******************************************************************************
* Globals
@@ -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;
data->tag = tag;
@@ -52,7 +58,38 @@
}
static void
-gplate_library_data_free(GPlateLibraryData *data) {
+gplate_function_data_free(GPlateFunctionData *data) {
+ g_free(data);
+}
+
+/******************************************************************************
+ * GPlateTagData API
+ *****************************************************************************/
+static GPlateTagData *
+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->tag = tag;
+ data->prefix = (prefix) ? g_strdup(prefix) : NULL;
+ data->suffix = (suffix) ? g_strdup(suffix) : NULL;
+
+ g_type_class_unref(klass);
+
+ return data;
+}
+
+static void
+gplate_tag_data_free(GPlateTagData *data) {
+ g_free(data->prefix);
+ g_free(data->suffix);
g_free(data);
}
@@ -64,11 +101,12 @@
if(G_UNLIKELY(functions == NULL)) {
functions =
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 @@
gboolean
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 @@
return FALSE;
}
- 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 @@
*/
gboolean
gplate_library_add_tag(GType tag, GError **error) {
- gpointer data;
+ GPlateTagData *data = NULL;
gplate_library_lazy_init();
@@ -212,9 +250,9 @@
return FALSE;
}
- 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);
return TRUE;
}
@@ -257,7 +295,7 @@
*/
gboolean
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 @@
*/
gboolean
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,
GError **error)
{
- GPlateLibraryData *data = NULL;
+ GPlateFunctionData *data = NULL;
g_return_val_if_fail(name, FALSE);
@@ -460,10 +498,10 @@
static void
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);
}
void
--- 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 @@
G_BEGIN_DECLS
-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);