diff options
Diffstat (limited to 'lasso/utils.h')
-rw-r--r-- | lasso/utils.h | 119 |
1 files changed, 102 insertions, 17 deletions
diff --git a/lasso/utils.h b/lasso/utils.h index 2d9d6382..8a58f95e 100644 --- a/lasso/utils.h +++ b/lasso/utils.h @@ -27,6 +27,19 @@ #include <glib.h> +#ifdef LASSO_DEBUG +#ifdef __GNUC__ +#define lasso_check_type_equality(a,b) \ + { \ + enum { TYPE_MISMATCH = (1 / __builtin_types_compatible_p(typeof(a), typeof(b))) }; \ + } +#else +#define lasso_check_type_equality(a,b) +#endif +#else +#define lasso_check_type_equality(a,b) +#endif + /* Assignment and list appending */ #define lasso_assign_string(dest,src) \ { \ @@ -43,6 +56,7 @@ #define lasso_assign_gobject(dest,src) \ { \ + lasso_check_type_equality(dest, src); \ if (src) \ g_object_ref(src); \ if (dest) \ @@ -52,6 +66,7 @@ #define lasso_assign_new_gobject(dest,src) \ { \ + lasso_check_type_equality(dest, src); \ if (dest) \ g_object_unref(dest); \ dest = (void*)(src); \ @@ -59,29 +74,58 @@ #define lasso_assign_node(dest,src) \ { \ + lasso_check_type_equality(dest, src); \ if (dest) \ xmlFreeNode(dest); \ dest = xmlCopyNode(src, 1); \ } +#define lasso_list_add(dest, src) \ + { \ + lasso_check_type_equality(src, void*); \ + dest = g_list_append(dest, src); \ + } + +#define lasso_list_add_non_null(dest, src) \ + { \ + lasso_check_type_equality(src, void*); \ + if (src != NULL) { \ + dest = g_list_append(dest, src); \ + } else { \ + g_critical("Adding a NULL value to a non-NULL content list: dest=%s src=%s", #dest, #src); \ + } \ + } + #define lasso_list_add_string(dest, src) \ { \ + lasso_check_type_equality(dest, GList*); \ + lasso_check_type_equality(src, gchar*); \ (dest) = g_list_append((dest), g_strdup(src));\ } -#define lasso_list_add_gobject(dest, src) \ +#define lasso_list_add_xml_string(dest, src) \ { \ - dest = g_list_append(dest, g_object_ref(src)); \ + lasso_check_type_equality(dest, GList*); \ + lasso_check_type_equality(src, xmlChar*); \ + (dest) = g_list_append((dest), g_strdup((char*)src));\ } -#define lasso_list_add_new_gobject(dest, src) \ +#define lasso_list_add_gobject(dest, src) \ { \ - dest = g_list_append(dest, src); \ + if (G_IS_OBJECT(src)) { \ + dest = g_list_append(dest, g_object_ref(src)); \ + } else { \ + g_critical("Trying to add to a GList* a non GObject pointer dest=%s src=%s", #dest, #src); \ + } \ } -#define lasso_list_add(dest, src) \ +#define lasso_list_add_new_gobject(dest, src) \ { \ - dest = g_list_append(dest, src); \ + if (G_IS_OBJECT(src)) { \ + dest = g_list_append(dest, src); \ + } else { \ + g_critical("Trying to add to a GList* a non GObject pointer dest=%s src=%s", #dest, #src); \ + } \ } /* Freeing */ @@ -99,21 +143,34 @@ } \ } +#define lasso_release_full2(dest, free_function, type) \ + { \ + lasso_check_type_equality(dest, type); \ + if (dest) { \ + free_function(dest); dest = NULL; \ + } \ + } + #define lasso_release_gobject(dest) \ - lasso_release_full(dest, g_object_unref) + { \ + if (G_IS_OBJECT(dest) || dest == NULL) { \ + lasso_release_full(dest, g_object_unref); \ + } else { \ + g_critical("Trying to unref a non GObject pointer dest=%s", #dest); \ + } \ + } #define lasso_release_string(dest) \ lasso_release_full(dest, g_free) #define lasso_release_list(dest) \ - lasso_release_full(dest, g_list_free) + lasso_release_full2(dest, g_list_free, GList*) #define lasso_release_list_of_full(dest, free_function) \ { \ if (dest) { \ g_list_foreach(dest, (GFunc)free_function, NULL); \ - g_list_free(dest); \ - dest = NULL; \ + lasso_release_list(dest); \ } \ } @@ -127,25 +184,53 @@ lasso_release_list_of_full(dest, xmlFreeNode) #define lasso_release_node(node) \ - lasso_release_full(node, xmlFreeNode) + lasso_release_full2(node, xmlFreeNode, xmlNodePtr) #define lasso_release_doc(doc) \ - lasso_release_full(doc, xmlFreeDoc) + lasso_release_full2(doc, xmlFreeDoc, xmlDocPtr) #define lasso_release_xmlchar(dest) \ - lasso_release_full(dest, xmlFree) + lasso_release_full2(dest, xmlFree, xmlChar*) #define lasso_release_encrypt_context(dest) \ - lasso_release_full(dest, xmlSecEncCtxDestroy) + lasso_release_full2(dest, xmlSecEncCtxDestroy, xmlSecEncCtxPtr) #define lasso_release_signature_context(dest) \ - lasso_release_full(dest, xmlSecDSigCtxDestroy) + lasso_release_full2(dest, xmlSecDSigCtxDestroy,xmlSecDSigCtxPtr) #define lasso_release_key_manager(dest) \ - lasso_release_full(dest, xmlSecKeysMngrDestroy) + lasso_release_full2(dest, xmlSecKeysMngrDestroy, xmlSecKeysMngrPtr) #define lasso_release_output_buffer(dest) \ - lasso_release_full(dest, xmlOutputBufferClose) + lasso_release_full2(dest, xmlOutputBufferClose, xmlOutputBufferPtr) + +#define lasso_release_xpath_object(dest) \ + lasso_release_full2(dest, xmlXPathFreeObject, xmlXPathObjectPtr) + +#define lasso_release_xpath_context(dest) \ + lasso_release_full2(dest, xmlXPathFreeContext, xmlXPathContextPtr) + +#define lasso_release_xpath_job(xpathObject, xpathContext, xmlDocument) \ + lasso_release_xpath_object(xpathObject); \ + lasso_release_xpath_context(xpathContext); \ + lasso_release_doc(xmlDocument) + +#define lasso_transfer_full(dest, src, kind) \ + {\ + lasso_release_##kind((dest)); \ + lasso_check_type_equality(dest, src); \ + (dest) = (void*)(src); \ + (src) = NULL; \ + } + +#define lasso_transfer_xpath_object(dest, src) \ + lasso_transfer_full(dest, src, xpath_object) + +#define lasso_transfer_string(dest, src) \ + lasso_transfer_full(dest, src, string) + +#define lasso_transfer_gobject(dest, src) \ + lasso_transfer_full(dest, src, gobject) /* Bad param handling */ #define lasso_return_val_if_invalid_param(kind, name, val) \ |