[xbuild] Throw ArgumentNullException if target name is null
[mono.git] / eglib / src / gerror.c
index 7f3a1f49ffabaa3f21cbdcbef8130ecb36d8974d..790c388c7ad9fb6bb0230804ecbf4f3ef90f7dc4 100644 (file)
@@ -25,7 +25,6 @@
  * 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>
@@ -48,6 +47,29 @@ g_error_new (gpointer domain, gint code, const char *format, ...)
        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 (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)
 {
@@ -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;
+       }
+}