[libvirt] [PATCH v2 2/7] internal: introduce macro helpers to check flag requirements

2015-03-27 Thread Pavel Hrdina
Similar to VIR_EXLUSIVE_FLAGS, it will error out if flag requirement is
not met.

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

diff --git a/src/internal.h b/src/internal.h
index eb8d231..6363e58 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -371,6 +371,49 @@
 goto LABEL; \
 }
 
+/* Macros to help dealing with flag requirements. */
+
+/**
+ * VIR_REQUIRE_FLAG_RET:
+ *
+ * @FLAG1: First flag to be checked.
+ * @FLAG2: Second flag that is required by first flag.
+ * @RET: Return value.
+ *
+ * Check whether required flag is set.  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_REQUIRE_FLAG_RET(FLAG1, FLAG2, RET)\
+if ((flags  FLAG1)  !(flags  FLAG2)) {  \
+virReportInvalidArg(ctl,\
+_(Flag '%s' is required by flag '%s'),\
+#FLAG2, #FLAG1);\
+return RET; \
+}
+
+/**
+ * VIR_REQUIRE_FLAG_GOTO:
+ *
+ * @FLAG1: First flag to be checked.
+ * @FLAG2: Second flag that is required by first flag.
+ * @LABEL: Label to jump to.
+ *
+ * Check whether required flag is set.  The checked flags are compared
+ * with flags variable.
+ *
+ * Returns nothing.  Jumps to a label if required flag is not set.
+ */
+# define VIR_REQUIRE_FLAG_GOTO(FLAG1, FLAG2, LABEL) \
+if ((flags  FLAG1)  !(flags  FLAG2)) {  \
+virReportInvalidArg(ctl,\
+_(Flag '%s' is required by flag '%s'),\
+#FLAG2, #FLAG1);\
+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 2/7] internal: introduce macro helpers to check flag requirements

2015-03-27 Thread Jeff Nelson
On Fri, Mar 27, 2015 at 11:01:23AM +0100, Pavel Hrdina wrote:
 Similar to VIR_EXLUSIVE_FLAGS, it will error out if flag requirement is
 not met.
 
 Signed-off-by: Pavel Hrdina phrd...@redhat.com
 ---
  src/internal.h | 43 +++
  1 file changed, 43 insertions(+)
 
 diff --git a/src/internal.h b/src/internal.h
 index eb8d231..6363e58 100644
 --- a/src/internal.h
 +++ b/src/internal.h
 @@ -371,6 +371,49 @@
  goto LABEL; \
  }
  
 +/* Macros to help dealing with flag requirements. */
 +
 +/**
 + * VIR_REQUIRE_FLAG_RET:
 + *
 + * @FLAG1: First flag to be checked.
 + * @FLAG2: Second flag that is required by first flag.
 + * @RET: Return value.
 + *
 + * Check whether required flag is set.  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_REQUIRE_FLAG_RET(FLAG1, FLAG2, RET)\
 +if ((flags  FLAG1)  !(flags  FLAG2)) {  \
 +virReportInvalidArg(ctl,\
 +_(Flag '%s' is required by flag '%s'),\
 +#FLAG2, #FLAG1);\
 +return RET; \
 +}
 +

I recommend encapsulating this within a do { ... } while (1)
statement. The problem is that the macro hides/exposes an -if-
statement to which an -else- keyword can be bound:

 if (something)
 VIR_REQUIRE_FLAG_RET(f1, f2, foo)
 else  // matches with -if- inside VIR_REQUIRE_FLAG_RET
 // doesn't execute when you think it does

Note that other macros (see definition of virCheckNonNullArgReturn
below) follow this practice.

 +/**
 + * VIR_REQUIRE_FLAG_GOTO:
 + *
 + * @FLAG1: First flag to be checked.
 + * @FLAG2: Second flag that is required by first flag.
 + * @LABEL: Label to jump to.
 + *
 + * Check whether required flag is set.  The checked flags are compared
 + * with flags variable.
 + *
 + * Returns nothing.  Jumps to a label if required flag is not set.
 + */
 +# define VIR_REQUIRE_FLAG_GOTO(FLAG1, FLAG2, LABEL) \
 +if ((flags  FLAG1)  !(flags  FLAG2)) {  \
 +virReportInvalidArg(ctl,\
 +_(Flag '%s' is required by flag '%s'),\
 +#FLAG2, #FLAG1);\
 +goto LABEL; \
 +}
 +

Same feedback as above.

-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


Re: [libvirt] [PATCH v2 2/7] internal: introduce macro helpers to check flag requirements

2015-03-27 Thread Jeff Nelson
On Fri, Mar 27, 2015 at 11:13:07AM -0500, Jeff Nelson wrote:
 On Fri, Mar 27, 2015 at 11:01:23AM +0100, Pavel Hrdina wrote:
  Similar to VIR_EXLUSIVE_FLAGS, it will error out if flag requirement is
  not met.
  
  Signed-off-by: Pavel Hrdina phrd...@redhat.com
  ---
   src/internal.h | 43 +++
   1 file changed, 43 insertions(+)
  
  diff --git a/src/internal.h b/src/internal.h
  index eb8d231..6363e58 100644
  --- a/src/internal.h
  +++ b/src/internal.h
  @@ -371,6 +371,49 @@
   goto LABEL;
   \
   }
   
  +/* Macros to help dealing with flag requirements. */
  +
  +/**
  + * VIR_REQUIRE_FLAG_RET:
  + *
  + * @FLAG1: First flag to be checked.
  + * @FLAG2: Second flag that is required by first flag.
  + * @RET: Return value.
  + *
  + * Check whether required flag is set.  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_REQUIRE_FLAG_RET(FLAG1, FLAG2, RET)   
   \
  +if ((flags  FLAG1)  !(flags  FLAG2)) { 
   \
  +virReportInvalidArg(ctl,   
   \
  +_(Flag '%s' is required by flag '%s'),   
   \
  +#FLAG2, #FLAG1);   
   \
  +return RET;
   \
  +}
  +
 
 I recommend encapsulating this within a do { ... } while (1)

Oops. while(0), not while (1).

-Jeff

 statement. The problem is that the macro hides/exposes an -if-
 statement to which an -else- keyword can be bound:
 
  if (something)
  VIR_REQUIRE_FLAG_RET(f1, f2, foo)
  else  // matches with -if- inside VIR_REQUIRE_FLAG_RET
  // doesn't execute when you think it does
 
 Note that other macros (see definition of virCheckNonNullArgReturn
 below) follow this practice.
 
  +/**
  + * VIR_REQUIRE_FLAG_GOTO:
  + *
  + * @FLAG1: First flag to be checked.
  + * @FLAG2: Second flag that is required by first flag.
  + * @LABEL: Label to jump to.
  + *
  + * Check whether required flag is set.  The checked flags are compared
  + * with flags variable.
  + *
  + * Returns nothing.  Jumps to a label if required flag is not set.
  + */
  +# define VIR_REQUIRE_FLAG_GOTO(FLAG1, FLAG2, LABEL)
   \
  +if ((flags  FLAG1)  !(flags  FLAG2)) { 
   \
  +virReportInvalidArg(ctl,   
   \
  +_(Flag '%s' is required by flag '%s'),   
   \
  +#FLAG2, #FLAG1);   
   \
  +goto LABEL;
   \
  +}
  +
 
 Same feedback as above.
 
 -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

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