Enabled g_mem_set_vtable through the configure option --with-overridable-allocators...
[mono.git] / eglib / src / gerror.c
index 7f3a1f49ffabaa3f21cbdcbef8130ecb36d8974d..43fef97cc434c1a67daa1df2c8e5a8b98f97b439 100644 (file)
  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
-#define _GNU_SOURCE
 #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, ...)
 {
@@ -41,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);
 }
 
@@ -64,7 +86,18 @@ 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);
        }
 }
+
+void
+g_propagate_error (GError **dest, GError *src)
+{
+       if (dest == NULL){
+               if (src)
+                       g_error_free (src);
+       } else {
+               *dest = src;
+       }
+}