Enabled g_mem_set_vtable through the configure option --with-overridable-allocators...
[mono.git] / eglib / src / gerror.c
index 99dab45499506524925f15c177e8a59e1f443f4f..43fef97cc434c1a67daa1df2c8e5a8b98f97b439 100644 (file)
@@ -28,8 +28,8 @@
 #include <stdio.h>
 #include <stdarg.h>
 #include <string.h>
+#include <config.h>
 #include <glib.h>
-
 GError *
 g_error_new (gpointer domain, gint code, const char *format, ...)
 {
@@ -40,19 +40,42 @@ g_error_new (gpointer domain, gint code, const char *format, ...)
        err->code = code;
 
        va_start (args, format);
-       if (vasprintf (&err->message, format, args) == -1)
+       if (g_vasprintf (&err->message, format, args) == -1)
                err->message = g_strdup_printf ("internal: invalid format string %s", format); 
        va_end (args);
 
        return err;
 }
 
+static GError *
+g_error_vnew (gpointer domain, gint code, const char *format, va_list ap)
+{
+       GError *err = g_new (GError, 1);
+       
+       err->domain = domain;
+       err->code = code;
+
+       if (g_vasprintf (&err->message, format, ap) == -1)
+               err->message = g_strdup_printf ("internal: invalid format string %s", format); 
+
+       return err;
+}
+
+void
+g_clear_error (GError **error)
+{
+       if (error && *error) {
+               g_error_free (*error);
+               *error = NULL;
+       }
+}
+
 void
 g_error_free (GError *error)
 {
        g_return_if_fail (error != NULL);
        
-       free (error->message);
+       g_free (error->message);
        g_free (error);
 }
 
@@ -63,7 +86,7 @@ g_set_error (GError **err, gpointer domain, gint code, const gchar *format, ...)
 
        if (err) {
                va_start (args, format);
-               *err = g_error_new (domain, code, format, args);
+               *err = g_error_vnew (domain, code, format, args);
                va_end (args);
        }
 }