[runtime] Move eglib into mono/eglib so it becomes a convenience library similar...
[mono.git] / mono / eglib / 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 <config.h>
32 #include <glib.h>
33 GError *
34 g_error_new (gpointer domain, gint code, const char *format, ...)
35 {
36         va_list args;
37         GError *err = g_new (GError, 1);
38         
39         err->domain = domain;
40         err->code = code;
41
42         va_start (args, format);
43         if (g_vasprintf (&err->message, format, args) == -1)
44                 err->message = g_strdup_printf ("internal: invalid format string %s", format); 
45         va_end (args);
46
47         return err;
48 }
49
50 static GError *
51 g_error_vnew (gpointer domain, gint code, const char *format, va_list ap)
52 {
53         GError *err = g_new (GError, 1);
54         
55         err->domain = domain;
56         err->code = code;
57
58         if (g_vasprintf (&err->message, format, ap) == -1)
59                 err->message = g_strdup_printf ("internal: invalid format string %s", format); 
60
61         return err;
62 }
63
64 void
65 g_clear_error (GError **error)
66 {
67         if (error && *error) {
68                 g_error_free (*error);
69                 *error = NULL;
70         }
71 }
72
73 void
74 g_error_free (GError *error)
75 {
76         g_return_if_fail (error != NULL);
77         
78         g_free (error->message);
79         g_free (error);
80 }
81
82 void
83 g_set_error (GError **err, gpointer domain, gint code, const gchar *format, ...)
84 {
85         va_list args;
86
87         if (err) {
88                 va_start (args, format);
89                 *err = g_error_vnew (domain, code, format, args);
90                 va_end (args);
91         }
92 }
93
94 void
95 g_propagate_error (GError **dest, GError *src)
96 {
97         if (dest == NULL){
98                 if (src)
99                         g_error_free (src);
100         } else {
101                 *dest = src;
102         }
103 }