[augeas-devel] augeas: master - More convenience macros for errors
David Lutterkort
lutter at fedoraproject.org
Wed Dec 23 20:28:55 UTC 2009
Gitweb: http://git.fedorahosted.org/git/augeas.git?p=augeas.git;a=commitdiff;h=a801a2be5375da83106f19d4cfbd8dd985680c5c
Commit: a801a2be5375da83106f19d4cfbd8dd985680c5c
Parent: 15ba82cb8731ddbd1d9acd0ac9e769b68ae3a682
Author: David Lutterkort <lutter at redhat.com>
AuthorDate: Tue Nov 24 13:58:19 2009 -0800
Committer: David Lutterkort <lutter at redhat.com>
CommitterDate: Fri Dec 18 16:06:15 2009 -0800
More convenience macros for errors
Add BUG_ON and ERR_RET macros for reporting internal errors
* src/errcode.h (BUG_ON, ERR_RET, HAS_ERR): new macros
* src/errcode.c (bug_on): implementation for BUG_ON
---
src/errcode.c | 24 ++++++++++++++++++++++++
src/errcode.h | 14 ++++++++++++++
2 files changed, 38 insertions(+), 0 deletions(-)
diff --git a/src/errcode.c b/src/errcode.c
index 52f2644..bac2c77 100644
--- a/src/errcode.c
+++ b/src/errcode.c
@@ -48,6 +48,30 @@ void report_error(struct error *err, aug_errcode_t errcode,
va_end(ap);
}
+void bug_on(struct error *err, const char *srcfile, int srclineno,
+ const char *format, ...) {
+ char *msg = NULL;
+ int r;
+ va_list ap;
+
+ if (err->code != AUG_NOERROR)
+ return;
+
+ va_start(ap, format);
+ vreport_error(err, AUG_EINTERNAL, format, ap);
+ va_end(ap);
+
+ if (err->details == NULL) {
+ xasprintf(&err->details, "%s:%d:internal error", srcfile, srclineno);
+ } else {
+ r = xasprintf(&msg, "%s:%d:%s", srcfile, srclineno, err->details);
+ if (r >= 0) {
+ free(err->details);
+ err->details = msg;
+ }
+ }
+}
+
/*
* Local variables:
* indent-tabs-mode: nil
diff --git a/src/errcode.h b/src/errcode.h
index 8913403..e5d2334 100644
--- a/src/errcode.h
+++ b/src/errcode.h
@@ -41,8 +41,16 @@ void report_error(struct error *err, aug_errcode_t errcode,
const char *format, ...)
ATTRIBUTE_FORMAT(printf, 3, 4);
+void bug_on(struct error *err, const char *srcfile, int srclineno,
+ const char *format, ...)
+ ATTRIBUTE_FORMAT(printf, 4, 5);
+
+#define HAS_ERR(obj) ((obj)->error->code != AUG_NOERROR)
+
#define ERR_BAIL(obj) if ((obj)->error->code != AUG_NOERROR) goto error;
+#define ERR_RET(obj) if ((obj)->error->code != AUG_NOERROR) return;
+
#define ERR_NOMEM(cond, obj) \
if (cond) { \
report_error((obj)->error, AUG_ENOMEM, NULL); \
@@ -60,6 +68,12 @@ void report_error(struct error *err, aug_errcode_t errcode,
} \
} while(0)
+#define BUG_ON(cond, obj, fmt ...) \
+ if (cond) { \
+ bug_on((obj)->error, __FILE__, __LINE__, ## fmt); \
+ goto error; \
+ }
+
#endif
More information about the augeas-devel
mailing list