2006-08-31 Atsushi Enomoto <atsushi@ximian.com>
[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 void
52 g_error_free (GError *error)
53 {
54         g_return_if_fail (error != NULL);
55         
56         free (error->message);
57         g_free (error);
58 }
59
60 void
61 g_set_error (GError **err, gpointer domain, gint code, const gchar *format, ...)
62 {
63         va_list args;
64
65         if (err) {
66                 va_start (args, format);
67                 *err = g_error_new (domain, code, format, args);
68                 va_end (args);
69         }
70 }