[libvirt] [PATCH v2 1/7] internal: introduce macro helpers to reject exclusive flags

2015-03-27 Thread Pavel Hrdina
Inspired by commit 7e437ee7 that introduced similar macros for virsh
commands so we don't have to repeat the same code all over.

Signed-off-by: Pavel Hrdina phrd...@redhat.com
---
 src/internal.h | 44 
 1 file changed, 44 insertions(+)

diff --git a/src/internal.h b/src/internal.h
index 4d473af..eb8d231 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -327,6 +327,50 @@
 }   \
 } while (0)
 
+/* Macros to help dealing with mutually exclusive flags. */
+
+/**
+ * VIR_EXCLUSIVE_FLAGS_RET:
+ *
+ * @FLAG1: First flag to be checked.
+ * @FLAG2: Second flag to be checked.
+ * @RET: Return value.
+ *
+ * Reject mutually exclusive API flags.  The checked flags are compared
+ * with flags variable.
+ *
+ * This helper does an early return and therefore it has to be called
+ * before anything that would require cleanup.
+ */
+# define VIR_EXCLUSIVE_FLAGS_RET(FLAG1, FLAG2, RET) \
+if ((flags  FLAG1)  (flags  FLAG2)) {   \
+virReportInvalidArg(ctl,\
+_(Flags '%s' and '%s' are mutually exclusive),\
+#FLAG1, #FLAG2);\
+return RET; \
+}
+
+/**
+ * VIR_EXCLUSIVE_FLAGS_GOTO:
+ *
+ * @FLAG1: First flag to be checked.
+ * @FLAG2: Second flag to be checked.
+ * @LABEL: Label to jump to.
+ *
+ * Reject mutually exclusive API flags.  The checked flags are compared
+ * with flags variable.
+ *
+ * Returns nothing.  Jumps to a label if unsupported flags were
+ * passed to it.
+ */
+# define VIR_EXCLUSIVE_FLAGS_GOTO(FLAG1, FLAG2, LABEL)  \
+if ((flags  FLAG1)  (flags  FLAG2)) {   \
+virReportInvalidArg(ctl,\
+_(Flags '%s' and '%s' are mutually exclusive),\
+#FLAG1, #FLAG2);\
+goto LABEL; \
+}
+
 # define virCheckNonNullArgReturn(argname, retval)  \
 do {\
 if (argname == NULL) {  \
-- 
2.0.5

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


Re: [libvirt] [PATCH v2 1/7] internal: introduce macro helpers to reject exclusive flags

2015-03-27 Thread Jeff Nelson
On Fri, Mar 27, 2015 at 11:01:22AM +0100, Pavel Hrdina wrote:
 Inspired by commit 7e437ee7 that introduced similar macros for virsh
 commands so we don't have to repeat the same code all over.
 
 Signed-off-by: Pavel Hrdina phrd...@redhat.com
 ---
  src/internal.h | 44 
  1 file changed, 44 insertions(+)
 
 diff --git a/src/internal.h b/src/internal.h
 index 4d473af..eb8d231 100644
 --- a/src/internal.h
 +++ b/src/internal.h
 @@ -327,6 +327,50 @@
  }   \
  } while (0)
  
 +/* Macros to help dealing with mutually exclusive flags. */
 +
 +/**
 + * VIR_EXCLUSIVE_FLAGS_RET:
 + *
 + * @FLAG1: First flag to be checked.
 + * @FLAG2: Second flag to be checked.
 + * @RET: Return value.
 + *
 + * Reject mutually exclusive API flags.  The checked flags are compared
 + * with flags variable.
 + *
 + * This helper does an early return and therefore it has to be called
 + * before anything that would require cleanup.
 + */
 +# define VIR_EXCLUSIVE_FLAGS_RET(FLAG1, FLAG2, RET) \
 +if ((flags  FLAG1)  (flags  FLAG2)) {   \
 +virReportInvalidArg(ctl,\
 +_(Flags '%s' and '%s' are mutually exclusive),\
 +#FLAG1, #FLAG2);\
 +return RET; \
 +}

Please encapsulate within a do { ... } while(0) statement. You've
left an -if- statement hidden within the macro definition; the next
-else- to come along will be matched to it:

if (fred)
  VIR_EXCLUSIVE_FLAGS_GOTO(a,b,c)
else // matches -if- *inside* macro
  // doesn't execute when you think it does


 +
 +/**
 + * VIR_EXCLUSIVE_FLAGS_GOTO:
 + *
 + * @FLAG1: First flag to be checked.
 + * @FLAG2: Second flag to be checked.
 + * @LABEL: Label to jump to.
 + *
 + * Reject mutually exclusive API flags.  The checked flags are compared
 + * with flags variable.
 + *
 + * Returns nothing.  Jumps to a label if unsupported flags were
 + * passed to it.
 + */
 +# define VIR_EXCLUSIVE_FLAGS_GOTO(FLAG1, FLAG2, LABEL)  \
 +if ((flags  FLAG1)  (flags  FLAG2)) {   \
 +virReportInvalidArg(ctl,\
 +_(Flags '%s' and '%s' are mutually exclusive),\
 +#FLAG1, #FLAG2);\
 +goto LABEL; \
 +}
 +

Same feedback as above. Note the macro definition below does this properly.

-Jeff

  # define virCheckNonNullArgReturn(argname, retval)  \
  do {\
  if (argname == NULL) {  \
 -- 
 2.0.5
 
 --
 libvir-list mailing list
 libvir-list@redhat.com
 https://www.redhat.com/mailman/listinfo/libvir-list

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list