Home | History | Annotate | Download | only in glib
      1 /* GLIB - Library of useful routines for C programming
      2  * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
      3  *
      4  * This library is free software; you can redistribute it and/or
      5  * modify it under the terms of the GNU Lesser General Public
      6  * License as published by the Free Software Foundation; either
      7  * version 2 of the License, or (at your option) any later version.
      8  *
      9  * This library is distributed in the hope that it will be useful,
     10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     12  * Lesser General Public License for more details.
     13  *
     14  * You should have received a copy of the GNU Lesser General Public
     15  * License along with this library; if not, write to the
     16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
     17  * Boston, MA 02111-1307, USA.
     18  */
     19 
     20 /*
     21  * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
     22  * file for a list of people on the GLib Team.  See the ChangeLog
     23  * files for a list of changes.  These files are distributed with
     24  * GLib at ftp://ftp.gtk.org/pub/gtk/.
     25  */
     26 
     27 #include "config.h"
     28 
     29 #include "glib.h"
     30 #include "galias.h"
     31 
     32 
     33 static GError*
     34 g_error_new_valist (GQuark         domain,
     35                     gint           code,
     36                     const gchar   *format,
     37                     va_list        args)
     38 {
     39   GError *error;
     40 
     41   error = g_slice_new (GError);
     42 
     43   error->domain = domain;
     44   error->code = code;
     45   error->message = g_strdup_vprintf (format, args);
     46 
     47   return error;
     48 }
     49 
     50 /**
     51  * g_error_new:
     52  * @domain: error domain
     53  * @code: error code
     54  * @format: printf()-style format for error message
     55  * @Varargs: parameters for message format
     56  *
     57  * Creates a new #GError with the given @domain and @code,
     58  * and a message formatted with @format.
     59  *
     60  * Return value: a new #GError
     61  **/
     62 GError*
     63 g_error_new (GQuark       domain,
     64              gint         code,
     65              const gchar *format,
     66              ...)
     67 {
     68   GError* error;
     69   va_list args;
     70 
     71   g_return_val_if_fail (format != NULL, NULL);
     72   g_return_val_if_fail (domain != 0, NULL);
     73 
     74   va_start (args, format);
     75   error = g_error_new_valist (domain, code, format, args);
     76   va_end (args);
     77 
     78   return error;
     79 }
     80 
     81 /**
     82  * g_error_new_literal:
     83  * @domain: error domain
     84  * @code: error code
     85  * @message: error message
     86  *
     87  * Creates a new #GError; unlike g_error_new(), @message is not
     88  * a printf()-style format string. Use this
     89  * function if @message contains text you don't have control over,
     90  * that could include printf() escape sequences.
     91  *
     92  * Return value: a new #GError
     93  **/
     94 GError*
     95 g_error_new_literal (GQuark         domain,
     96                      gint           code,
     97                      const gchar   *message)
     98 {
     99   GError* err;
    100 
    101   g_return_val_if_fail (message != NULL, NULL);
    102   g_return_val_if_fail (domain != 0, NULL);
    103 
    104   err = g_slice_new (GError);
    105 
    106   err->domain = domain;
    107   err->code = code;
    108   err->message = g_strdup (message);
    109 
    110   return err;
    111 }
    112 
    113 /**
    114  * g_error_free:
    115  * @error: a #GError
    116  *
    117  * Frees a #GError and associated resources.
    118  *
    119  **/
    120 void
    121 g_error_free (GError *error)
    122 {
    123   g_return_if_fail (error != NULL);
    124 
    125   g_free (error->message);
    126 
    127   g_slice_free (GError, error);
    128 }
    129 
    130 /**
    131  * g_error_copy:
    132  * @error: a #GError
    133  *
    134  * Makes a copy of @error.
    135  *
    136  * Return value: a new #GError
    137  **/
    138 GError*
    139 g_error_copy (const GError *error)
    140 {
    141   GError *copy;
    142 
    143   g_return_val_if_fail (error != NULL, NULL);
    144 
    145   copy = g_slice_new (GError);
    146 
    147   *copy = *error;
    148 
    149   copy->message = g_strdup (error->message);
    150 
    151   return copy;
    152 }
    153 
    154 /**
    155  * g_error_matches:
    156  * @error: a #GError
    157  * @domain: an error domain
    158  * @code: an error code
    159  *
    160  * Returns %TRUE if @error matches @domain and @code, %FALSE
    161  * otherwise.
    162  *
    163  * Return value: whether @error has @domain and @code
    164  **/
    165 gboolean
    166 g_error_matches (const GError *error,
    167                  GQuark        domain,
    168                  gint          code)
    169 {
    170   return error &&
    171     error->domain == domain &&
    172     error->code == code;
    173 }
    174 
    175 #define ERROR_OVERWRITTEN_WARNING "GError set over the top of a previous GError or uninitialized memory.\n" \
    176                "This indicates a bug in someone's code. You must ensure an error is NULL before it's set.\n" \
    177                "The overwriting error message was: %s"
    178 
    179 /**
    180  * g_set_error:
    181  * @err: a return location for a #GError, or %NULL
    182  * @domain: error domain
    183  * @code: error code
    184  * @format: printf()-style format
    185  * @Varargs: args for @format
    186  *
    187  * Does nothing if @err is %NULL; if @err is non-%NULL, then *@err must
    188  * be %NULL. A new #GError is created and assigned to *@err.
    189  **/
    190 void
    191 g_set_error (GError      **err,
    192              GQuark        domain,
    193              gint          code,
    194              const gchar  *format,
    195              ...)
    196 {
    197   GError *new;
    198 
    199   va_list args;
    200 
    201   if (err == NULL)
    202     return;
    203 
    204   va_start (args, format);
    205   new = g_error_new_valist (domain, code, format, args);
    206   va_end (args);
    207 
    208   if (*err == NULL)
    209     *err = new;
    210   else
    211     g_warning (ERROR_OVERWRITTEN_WARNING, new->message);
    212 }
    213 
    214 /**
    215  * g_set_error_literal:
    216  * @err: a return location for a #GError, or %NULL
    217  * @domain: error domain
    218  * @code: error code
    219  * @message: error message
    220  *
    221  * Does nothing if @err is %NULL; if @err is non-%NULL, then *@err must
    222  * be %NULL. A new #GError is created and assigned to *@err.
    223  * Unlike g_set_error(), @message is not a printf()-style format string.
    224  * Use this function if @message contains text you don't have control over,
    225  * that could include printf() escape sequences.
    226  *
    227  * Since: 2.18
    228  **/
    229 void
    230 g_set_error_literal (GError      **err,
    231                      GQuark        domain,
    232                      gint          code,
    233                      const gchar  *message)
    234 {
    235   GError *new;
    236 
    237   if (err == NULL)
    238     return;
    239 
    240   new = g_error_new_literal (domain, code, message);
    241   if (*err == NULL)
    242     *err = new;
    243   else
    244     g_warning (ERROR_OVERWRITTEN_WARNING, new->message);
    245 }
    246 
    247 /**
    248  * g_propagate_error:
    249  * @dest: error return location
    250  * @src: error to move into the return location
    251  *
    252  * If @dest is %NULL, free @src; otherwise, moves @src into *@dest.
    253  * The error variable @dest points to must be %NULL.
    254  **/
    255 void
    256 g_propagate_error (GError       **dest,
    257 		   GError        *src)
    258 {
    259   g_return_if_fail (src != NULL);
    260 
    261   if (dest == NULL)
    262     {
    263       if (src)
    264         g_error_free (src);
    265       return;
    266     }
    267   else
    268     {
    269       if (*dest != NULL)
    270         g_warning (ERROR_OVERWRITTEN_WARNING, src->message);
    271       else
    272         *dest = src;
    273     }
    274 }
    275 
    276 /**
    277  * g_clear_error:
    278  * @err: a #GError return location
    279  *
    280  * If @err is %NULL, does nothing. If @err is non-%NULL,
    281  * calls g_error_free() on *@err and sets *@err to %NULL.
    282  **/
    283 void
    284 g_clear_error (GError **err)
    285 {
    286   if (err && *err)
    287     {
    288       g_error_free (*err);
    289       *err = NULL;
    290     }
    291 }
    292 
    293 static void
    294 g_error_add_prefix (gchar       **string,
    295                     const gchar  *format,
    296                     va_list       ap)
    297 {
    298   gchar *oldstring;
    299   gchar *prefix;
    300 
    301   prefix = g_strdup_vprintf (format, ap);
    302   oldstring = *string;
    303   *string = g_strconcat (prefix, oldstring, NULL);
    304   g_free (oldstring);
    305   g_free (prefix);
    306 }
    307 
    308 /**
    309  * g_prefix_error:
    310  * @err: a return location for a #GError, or %NULL
    311  * @format: printf()-style format string
    312  * @...: arguments to @format
    313  *
    314  * Formats a string according to @format and
    315  * prefix it to an existing error message.  If
    316  * @err is %NULL (ie: no error variable) then do
    317  * nothing.
    318  *
    319  * If *@err is %NULL (ie: an error variable is
    320  * present but there is no error condition) then
    321  * also do nothing.  Whether or not it makes
    322  * sense to take advantage of this feature is up
    323  * to you.
    324  *
    325  * Since: 2.16
    326  **/
    327 void
    328 g_prefix_error (GError      **err,
    329                 const gchar  *format,
    330                 ...)
    331 {
    332   if (err && *err)
    333     {
    334       va_list ap;
    335 
    336       va_start (ap, format);
    337       g_error_add_prefix (&(*err)->message, format, ap);
    338       va_end (ap);
    339     }
    340 }
    341 
    342 /**
    343  * g_propagate_prefixed_error:
    344  * @dest: error return location
    345  * @src: error to move into the return location
    346  * @format: printf()-style format string
    347  * @...: arguments to @format
    348  *
    349  * If @dest is %NULL, free @src; otherwise,
    350  * moves @src into *@dest. *@dest must be %NULL.
    351  * After the move, add a prefix as with
    352  * g_prefix_error().
    353  *
    354  * Since: 2.16
    355  **/
    356 void
    357 g_propagate_prefixed_error (GError      **dest,
    358                             GError       *src,
    359                             const gchar  *format,
    360                             ...)
    361 {
    362   g_propagate_error (dest, src);
    363 
    364   if (dest && *dest)
    365     {
    366       va_list ap;
    367 
    368       va_start (ap, format);
    369       g_error_add_prefix (&(*dest)->message, format, ap);
    370       va_end (ap);
    371     }
    372 }
    373 
    374 #define __G_ERROR_C__
    375 #include "galiasdef.c"
    376