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