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