This patch makes NIH_{SHOULD,ZERO,MUST} return the values of their arguments, so
NIH_MUST (foo = bar()); becomes foo = NIH_MUST (bar()); --CJD === modified file 'nih/error.h' --- nih/error.h 2008-05-18 11:38:29 +0000 +++ nih/error.h 2009-02-17 21:09:01 +0000 @@ -95,18 +95,20 @@ /* Force a true value, checking for ENOMEM on a false one */ -#define NIH_SHOULD(_e) \ - while (! (_e)) { \ - NihError *_nih_should_err; \ - \ - _nih_should_err = nih_error_get (); \ - if (_nih_should_err->number == ENOMEM) { \ - nih_free (_nih_should_err); \ - } else { \ - nih_error_raise_again (_nih_should_err); \ - break; \ - } \ - } +#define NIH_SHOULD(_e) ({ \ + typeof (_e) ret; \ + while (! (ret = (_e))) { \ + NihError *err; \ + \ + err = nih_error_get (); \ + if (err->number != ENOMEM) { \ + nih_free (err); \ + ret = (typeof (ret))0; \ + } \ + nih_free (err); \ + } \ + ret; \ +)} NIH_BEGIN_EXTERN === modified file 'nih/macros.h' --- nih/macros.h 2007-03-08 12:07:16 +0000 +++ nih/macros.h 2009-02-17 21:09:16 +0000 @@ -65,10 +65,17 @@ #define NIH_LIKELY(_e) __builtin_expect ((_e) ? TRUE : FALSE, TRUE) #define NIH_UNLIKELY(_e) __builtin_expect ((_e) ? TRUE : FALSE, FALSE) -/* Force a true or false value, _e must be an assignment expression */ -#define NIH_MUST(_e) while (! (_e)) -#define NIH_ZERO(_e) while ((_e)) - +/* Force a true or false value */ +#define NIH_MUST(_e) ({ \ + typeof (_e) ret; \ + while (! (ret = (_e))); \ + ret; \ +}) +#define NIH_ZERO(_e) ({ \ + typeof (_e) ret; \ + while (ret = (_e)); \ + ret; \ +}) /* Make gettext friendlier */ #if ENABLE_NLS -- upstart-devel mailing list upstart-devel@lists.ubuntu.com Modify settings or unsubscribe at: https://lists.ubuntu.com/mailman/listinfo/upstart-devel