From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wei Liu Subject: [PATCH V3 06/13] libxl_internal: make JSON_* types a bit-field Date: Wed, 23 Apr 2014 17:59:16 +0100 Message-ID: <1398272363-12133-7-git-send-email-wei.liu2@citrix.com> References: <1398272363-12133-1-git-send-email-wei.liu2@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1398272363-12133-1-git-send-email-wei.liu2@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org Cc: Wei Liu , ian.jackson@eu.citrix.com, ian.campbell@citrix.com List-Id: xen-devel@lists.xenproject.org Libxl can generate number as type JSON_INTEGER, JSON_DOUBLE or JSON_NUMBER, string as type JSON_STRING or JSON_NULL (if string is null). So make JSON_* type a bit-field and use it in libxl__json_map_get. This is useful when parsing a libxl__json_object to libxl_FOO struct. We can enforce type checking on libxl__json_object in an easy way. Signed-off-by: Wei Liu Acked-by: Ian Campbell --- tools/libxl/libxl_internal.h | 18 +++++++++--------- tools/libxl/libxl_json.c | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 0c10bf7..f37a102 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -1613,16 +1613,16 @@ _hidden yajl_gen_status libxl__yajl_gen_asciiz(yajl_gen hand, const char *str); _hidden yajl_gen_status libxl__yajl_gen_enum(yajl_gen hand, const char *str); typedef enum { - JSON_NULL, - JSON_BOOL, - JSON_INTEGER, - JSON_DOUBLE, + JSON_NULL = (1 << 0), + JSON_BOOL = (1 << 1), + JSON_INTEGER = (1 << 2), + JSON_DOUBLE = (1 << 3), /* number is store in string, it's too big to be a long long or a double */ - JSON_NUMBER, - JSON_STRING, - JSON_MAP, - JSON_ARRAY, - JSON_ANY + JSON_NUMBER = (1 << 4), + JSON_STRING = (1 << 5), + JSON_MAP = (1 << 6), + JSON_ARRAY = (1 << 7), + JSON_ANY = 255 /* this is a mask of all values above, adjust as needed */ } libxl__json_node_type; typedef struct libxl__json_object { diff --git a/tools/libxl/libxl_json.c b/tools/libxl/libxl_json.c index b11ad4b..27cce9c 100644 --- a/tools/libxl/libxl_json.c +++ b/tools/libxl/libxl_json.c @@ -363,7 +363,7 @@ const libxl__json_object *libxl__json_map_get(const char *key, return NULL; if (strcmp(key, node->map_key) == 0) { if (expected_type == JSON_ANY - || (node->obj && node->obj->type == expected_type)) { + || (node->obj && (node->obj->type & expected_type))) { return node->obj; } else { return NULL; -- 1.7.10.4