2ec089c9956c1053c96bd0b8ea441d2881d54800
[mono.git] / eglib / src / gerror.c
1 /*
2  * gerror.c: Error support.
3  *
4  * Author:
5  *   Miguel de Icaza (miguel@novell.com)
6  *
7  * (C) 2006 Novell, Inc.
8  *
9  * Permission is hereby granted, free of charge, to any person obtaining
10  * a copy of this software and associated documentation files (the
11  * "Software"), to deal in the Software without restriction, including
12  * without limitation the rights to use, copy, modify, merge, publish,
13  * distribute, sublicense, and/or sell copies of the Software, and to
14  * permit persons to whom the Software is furnished to do so, subject to
15  * the following conditions:
16  *
17  * The above copyright notice and this permission notice shall be
18  * included in all copies or substantial portions of the Software.
19  *
20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
21  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
23  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
24  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
25  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
26  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27  */
28 #include <stdio.h>
29 #include <stdarg.h>
30 #include <string.h>
31 #include <glib.h>
32
33 #include "vasprintf.h"
34
35 GError *
36 g_error_new (gpointer domain, gint code, const char *format, ...)
37 {
38         va_list args;
39         GError *err = g_new (GError, 1);
40         
41         err->domain = domain;
42         err->code = code;
43
44         va_start (args, format);
45         if (vasprintf (&err->message, format, args) == -1)
46                 err->message = g_strdup_printf ("internal: invalid format string %s", format); 
47         va_end (args);
48
49         return err;
50 }
51
52 static GError *
53 g_error_vnew (gpointer domain, gint code, const char *format, va_list ap)
54 {
55         GError *err = g_new (GError, 1);
56         
57         err->domain = domain;
58         err->code = code;
59
60         if (vasprintf (&err->message, format, ap) == -1)
61                 err->message = g_strdup_printf ("internal: invalid format string %s", format); 
62
63         return err;
64 }
65
66 void
67 g_clear_error (GError **error)
68 {
69         if (error && *error) {
70                 g_error_free (*error);
71                 *error = NULL;
72         }
73 }
74
75 void
76 g_error_free (GError *error)
77 {
78         g_return_if_fail (error != NULL);
79         
80         free (error->message);
81         g_free (error);
82 }
83
84 void
85 g_set_error (GError **err, gpointer domain, gint code, const gchar *format, ...)
86 {
87         va_list args;
88
89         if (err) {
90                 va_start (args, format);
91                 *err = g_error_vnew (domain, code, format, args);
92                 va_end (args);
93         }
94 }
95
96 void
97 g_propagate_error (GError **dest, GError *src)
98 {
99         if (dest == NULL){
100                 if (src)
101                         g_error_free (src);
102         } else {
103                 *dest = src;
104         }
105 }