diff mbox

[1/5] qapi: Add qapi_enum_parse_full

Message ID 20180509055802.28423-2-famz@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Fam Zheng May 9, 2018, 5:57 a.m. UTC
This variant of qapi_enum_parse can do case insensitive compare.

Signed-off-by: Fam Zheng <famz@redhat.com>
---
 include/qapi/util.h |  2 ++
 qapi/qapi-util.c    | 20 ++++++++++++++++----
 2 files changed, 18 insertions(+), 4 deletions(-)

Comments

Markus Armbruster May 9, 2018, 11:53 a.m. UTC | #1
Fam Zheng <famz@redhat.com> writes:

> This variant of qapi_enum_parse can do case insensitive compare.

I'm curious why we need that.  We'll see when we get to the new
function's uses.

> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
>  include/qapi/util.h |  2 ++
>  qapi/qapi-util.c    | 20 ++++++++++++++++----
>  2 files changed, 18 insertions(+), 4 deletions(-)
>
> diff --git a/include/qapi/util.h b/include/qapi/util.h
> index a7c3c64148..2cec231919 100644
> --- a/include/qapi/util.h
> +++ b/include/qapi/util.h
> @@ -19,6 +19,8 @@ typedef struct QEnumLookup {
>  const char *qapi_enum_lookup(const QEnumLookup *lookup, int val);
>  int qapi_enum_parse(const QEnumLookup *lookup, const char *buf,
>                      int def, Error **errp);
> +int qapi_enum_parse_full(const QEnumLookup *lookup, const char *buf,
> +                         int def, bool ignore_case, Error **errp);
>  
>  int parse_qapi_name(const char *name, bool complete);
>  
> diff --git a/qapi/qapi-util.c b/qapi/qapi-util.c
> index e9b266bb70..6180957edb 100644
> --- a/qapi/qapi-util.c
> +++ b/qapi/qapi-util.c
> @@ -21,8 +21,8 @@ const char *qapi_enum_lookup(const QEnumLookup *lookup, int val)
>      return lookup->array[val];
>  }
>  
> -int qapi_enum_parse(const QEnumLookup *lookup, const char *buf,
> -                    int def, Error **errp)
> +int qapi_enum_parse_full(const QEnumLookup *lookup, const char *buf,
> +                         int def, bool ignore_case, Error **errp)
>  {
>      int i;
>  
> @@ -31,8 +31,14 @@ int qapi_enum_parse(const QEnumLookup *lookup, const char *buf,
>      }
>  
>      for (i = 0; i < lookup->size; i++) {
> -        if (!strcmp(buf, lookup->array[i])) {
> -            return i;
> +        if (ignore_case) {
> +            if (!strcasecmp(buf, lookup->array[i])) {
> +                return i;
> +            }
> +        } else {
> +            if (!strcmp(buf, lookup->array[i])) {
> +                return i;
> +            }
>          }
>      }
>  
> @@ -40,6 +46,12 @@ int qapi_enum_parse(const QEnumLookup *lookup, const char *buf,
>      return def;
>  }
>  
> +int qapi_enum_parse(const QEnumLookup *lookup, const char *buf,
> +                    int def, Error **errp)
> +{
> +    return qapi_enum_parse_full(lookup, buf, def, false, errp);
> +}
> +
>  /*
>   * Parse a valid QAPI name from @str.
>   * A valid name consists of letters, digits, hyphen and underscore.

What's "full" about qapi_enum_parse_full()?

Existing parse_unit_full() differs from parse_uint() in that it always
consumes the full string.  Hmm.

Do we expect to pass anything but literal false or true to @ignore_case?
If not, then a more convenient interface is two functions, just like we
have strcmp() and strcasecmp().  They could still call a common internal
helper to avoid code duplication.  Consider passing strcmp, strcasecmp
instead of false, true to it then.
diff mbox

Patch

diff --git a/include/qapi/util.h b/include/qapi/util.h
index a7c3c64148..2cec231919 100644
--- a/include/qapi/util.h
+++ b/include/qapi/util.h
@@ -19,6 +19,8 @@  typedef struct QEnumLookup {
 const char *qapi_enum_lookup(const QEnumLookup *lookup, int val);
 int qapi_enum_parse(const QEnumLookup *lookup, const char *buf,
                     int def, Error **errp);
+int qapi_enum_parse_full(const QEnumLookup *lookup, const char *buf,
+                         int def, bool ignore_case, Error **errp);
 
 int parse_qapi_name(const char *name, bool complete);
 
diff --git a/qapi/qapi-util.c b/qapi/qapi-util.c
index e9b266bb70..6180957edb 100644
--- a/qapi/qapi-util.c
+++ b/qapi/qapi-util.c
@@ -21,8 +21,8 @@  const char *qapi_enum_lookup(const QEnumLookup *lookup, int val)
     return lookup->array[val];
 }
 
-int qapi_enum_parse(const QEnumLookup *lookup, const char *buf,
-                    int def, Error **errp)
+int qapi_enum_parse_full(const QEnumLookup *lookup, const char *buf,
+                         int def, bool ignore_case, Error **errp)
 {
     int i;
 
@@ -31,8 +31,14 @@  int qapi_enum_parse(const QEnumLookup *lookup, const char *buf,
     }
 
     for (i = 0; i < lookup->size; i++) {
-        if (!strcmp(buf, lookup->array[i])) {
-            return i;
+        if (ignore_case) {
+            if (!strcasecmp(buf, lookup->array[i])) {
+                return i;
+            }
+        } else {
+            if (!strcmp(buf, lookup->array[i])) {
+                return i;
+            }
         }
     }
 
@@ -40,6 +46,12 @@  int qapi_enum_parse(const QEnumLookup *lookup, const char *buf,
     return def;
 }
 
+int qapi_enum_parse(const QEnumLookup *lookup, const char *buf,
+                    int def, Error **errp)
+{
+    return qapi_enum_parse_full(lookup, buf, def, false, errp);
+}
+
 /*
  * Parse a valid QAPI name from @str.
  * A valid name consists of letters, digits, hyphen and underscore.