From ece0bc5bae283954e2e939c46f8dbe3317054307 Mon Sep 17 00:00:00 2001 From: djcb Date: Fri, 13 Apr 2012 21:58:58 +0300 Subject: [PATCH] * introduce mu_util_g_set_error, a g_set_error wrapper --- src/mu-store-read.cc | 4 ++-- src/mu-util.c | 21 +++++++++++++++++++++ src/mu-util.h | 32 +++++++++++++++++++++----------- 3 files changed, 44 insertions(+), 13 deletions(-) diff --git a/src/mu-store-read.cc b/src/mu-store-read.cc index 9ced1fc8..352c301d 100644 --- a/src/mu-store-read.cc +++ b/src/mu-store-read.cc @@ -78,8 +78,8 @@ mu_store_new_read_only (const char* xpath, GError **err) return new _MuStore (xpath); } catch (const MuStoreError& merr) { - g_set_error (err, MU_ERROR_DOMAIN, merr.mu_error(), "%s", - merr.what().c_str()); + mu_util_g_set_error (err, merr.mu_error(), "%s", + merr.what().c_str()); } MU_XAPIAN_CATCH_BLOCK_G_ERROR(err, MU_ERROR_XAPIAN); diff --git a/src/mu-util.c b/src/mu-util.c index 24c74b0f..85f2a829 100644 --- a/src/mu-util.c +++ b/src/mu-util.c @@ -443,6 +443,27 @@ mu_util_fputs_encoded (const char *str, FILE *stream) +void +mu_util_g_set_error (GError **err, MuError errcode, const char *frm, ...) +{ + va_list ap; + char *msg; + + /* don't bother with NULL errors, or errors already set */ + if (!err || *err) + return; + + msg = NULL; + va_start (ap, frm); + g_vasprintf (&msg, frm, ap); + va_end (ap); + + g_set_error (err, MU_ERROR_DOMAIN, errcode, "%s", msg); + + g_free (msg); +} + + static gboolean print_args (FILE *stream, const char *frm, va_list args) { diff --git a/src/mu-util.h b/src/mu-util.h index e9445a98..eb7dcbeb 100644 --- a/src/mu-util.h +++ b/src/mu-util.h @@ -274,7 +274,6 @@ typedef gpointer XapianEnquire; } while (0) - /** * * don't repeat these catch blocks everywhere... @@ -282,8 +281,8 @@ typedef gpointer XapianEnquire; */ #define MU_STORE_CATCH_BLOCK_RETURN(GE,R) \ - catch (const MuStoreError& merr) { \ - g_set_error ((GE), (MU_ERROR_DOMAIN), \ + catch (const MuStoreError& merr) { \ + mu_util_g_set_error ((GE), \ merr.mu_error(), "%s", \ merr.what().c_str()); \ return (R); \ @@ -300,25 +299,25 @@ typedef gpointer XapianEnquire; #define MU_XAPIAN_CATCH_BLOCK_G_ERROR(GE,E) \ catch (const Xapian::DatabaseLockError &xerr) { \ - g_set_error ((GE),(MU_ERROR_DOMAIN), \ + mu_util_g_set_error ((GE), \ MU_ERROR_XAPIAN_CANNOT_GET_WRITELOCK, \ "%s: xapian error '%s'", \ __FUNCTION__, xerr.get_msg().c_str()); \ } catch (const Xapian::DatabaseCorruptError &xerr) { \ - g_set_error ((GE),(MU_ERROR_DOMAIN),MU_ERROR_XAPIAN_CORRUPTION, \ + mu_util_g_set_error ((GE), \ + MU_ERROR_XAPIAN_CORRUPTION, \ "%s: xapian error '%s'", \ __FUNCTION__, xerr.get_msg().c_str()); \ } catch (const Xapian::DatabaseError &xerr) { \ - g_set_error ((GE),0,MU_ERROR_XAPIAN, \ + mu_util_g_set_error ((GE),MU_ERROR_XAPIAN, \ "%s: xapian error '%s'", \ __FUNCTION__, xerr.get_msg().c_str()); \ } catch (const Xapian::Error &xerr) { \ - g_set_error ((GE),(MU_ERROR_DOMAIN),(E), \ + mu_util_g_set_error ((GE),(E), \ "%s: xapian error '%s'", \ __FUNCTION__, xerr.get_msg().c_str()); \ } catch (...) { \ - if ((GE)&&!(*(GE))) \ - g_set_error ((GE),(MU_ERROR_DOMAIN),(MU_ERROR_INTERNAL),\ + mu_util_g_set_error ((GE),(MU_ERROR_INTERNAL), \ "%s: caught exception", __FUNCTION__); \ } @@ -335,13 +334,13 @@ typedef gpointer XapianEnquire; #define MU_XAPIAN_CATCH_BLOCK_G_ERROR_RETURN(GE,E,R) \ catch (const Xapian::Error &xerr) { \ - g_set_error ((GE),(MU_ERROR_DOMAIN),(E), \ + mu_util_g_set_error ((GE),(E), \ "%s: xapian error '%s'", \ __FUNCTION__, xerr.get_msg().c_str()); \ return (R); \ } catch (...) { \ if ((GE)&&!(*(GE))) \ - g_set_error ((GE),(MU_ERROR_DOMAIN), \ + mu_util_g_set_error ((GE), \ (MU_ERROR_INTERNAL), \ "%s: caught exception", __FUNCTION__); \ return (R); \ @@ -438,6 +437,17 @@ enum _MuError { typedef enum _MuError MuError; +/** + * set an error if it's not already set + * + * @param err errptr, or NULL + * @param errcode error code + * @param frm printf-style format, followed by paremeters + */ +void mu_util_g_set_error (GError **err, MuError errcode, const char *frm, ...) + G_GNUC_PRINTF(3,4); + + #define MU_COLOR_RED "\x1b[31m" #define MU_COLOR_GREEN "\x1b[32m" #define MU_COLOR_YELLOW "\x1b[33m"