From 28035bcdf4647245743cf87cea3788331bf67a5f Mon Sep 17 00:00:00 2001 From: Marc-André Lureau Date: Fri, 25 Aug 2017 12:59:01 +0200 Subject: qlit: move qlit from check-qjson to qobject/ Fix code style issues while at it, to please checkpatch. Signed-off-by: Marc-André Lureau Reviewed-by: Markus Armbruster Message-Id: <20170825105913.4060-3-marcandre.lureau@redhat.com> Signed-off-by: Markus Armbruster --- qobject/qlit.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 qobject/qlit.c (limited to 'qobject/qlit.c') diff --git a/qobject/qlit.c b/qobject/qlit.c new file mode 100644 index 0000000000..5917c3584e --- /dev/null +++ b/qobject/qlit.c @@ -0,0 +1,89 @@ +/* + * QLit literal qobject + * + * Copyright IBM, Corp. 2009 + * Copyright (c) 2013, 2015, 2017 Red Hat Inc. + * + * Authors: + * Anthony Liguori + * Markus Armbruster + * Marc-André Lureau + * + * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. + * See the COPYING.LIB file in the top-level directory. + */ + +#include "qemu/osdep.h" + +#include "qapi/qmp/qlit.h" +#include "qapi/qmp/types.h" + +typedef struct QListCompareHelper { + int index; + LiteralQObject *objs; + int result; +} QListCompareHelper; + +static void compare_helper(QObject *obj, void *opaque) +{ + QListCompareHelper *helper = opaque; + + if (helper->result == 0) { + return; + } + + if (helper->objs[helper->index].type == QTYPE_NONE) { + helper->result = 0; + return; + } + + helper->result = + compare_litqobj_to_qobj(&helper->objs[helper->index++], obj); +} + +int compare_litqobj_to_qobj(LiteralQObject *lhs, QObject *rhs) +{ + int64_t val; + + if (!rhs || lhs->type != qobject_type(rhs)) { + return 0; + } + + switch (lhs->type) { + case QTYPE_QNUM: + g_assert(qnum_get_try_int(qobject_to_qnum(rhs), &val)); + return lhs->value.qnum == val; + case QTYPE_QSTRING: + return (strcmp(lhs->value.qstr, + qstring_get_str(qobject_to_qstring(rhs))) == 0); + case QTYPE_QDICT: { + int i; + + for (i = 0; lhs->value.qdict[i].key; i++) { + QObject *obj = qdict_get(qobject_to_qdict(rhs), + lhs->value.qdict[i].key); + + if (!compare_litqobj_to_qobj(&lhs->value.qdict[i].value, obj)) { + return 0; + } + } + + return 1; + } + case QTYPE_QLIST: { + QListCompareHelper helper; + + helper.index = 0; + helper.objs = lhs->value.qlist; + helper.result = 1; + + qlist_iter(qobject_to_qlist(rhs), compare_helper, &helper); + + return helper.result; + } + default: + break; + } + + return 0; +} -- cgit v1.2.3-55-g7522 From 082696e767db4d2b6c8c8c233d28291b83fc2b21 Mon Sep 17 00:00:00 2001 From: Marc-André Lureau Date: Fri, 25 Aug 2017 12:59:02 +0200 Subject: qlit: use QLit prefix consistently Rename from LiteralQ to QLit. Signed-off-by: Marc-André Lureau Reviewed-by: Markus Armbruster Message-Id: <20170825105913.4060-4-marcandre.lureau@redhat.com> Signed-off-by: Markus Armbruster --- include/qapi/qmp/qlit.h | 24 ++++++++++++------------ qobject/qlit.c | 4 ++-- tests/check-qjson.c | 40 ++++++++++++++++++++-------------------- 3 files changed, 34 insertions(+), 34 deletions(-) (limited to 'qobject/qlit.c') diff --git a/include/qapi/qmp/qlit.h b/include/qapi/qmp/qlit.h index 280db5064a..a4ad91321b 100644 --- a/include/qapi/qmp/qlit.h +++ b/include/qapi/qmp/qlit.h @@ -17,33 +17,33 @@ #include "qapi-types.h" #include "qobject.h" -typedef struct LiteralQDictEntry LiteralQDictEntry; -typedef struct LiteralQObject LiteralQObject; +typedef struct QLitDictEntry QLitDictEntry; +typedef struct QLitObject QLitObject; -struct LiteralQObject { +struct QLitObject { int type; union { int64_t qnum; const char *qstr; - LiteralQDictEntry *qdict; - LiteralQObject *qlist; + QLitDictEntry *qdict; + QLitObject *qlist; } value; }; -struct LiteralQDictEntry { +struct QLitDictEntry { const char *key; - LiteralQObject value; + QLitObject value; }; #define QLIT_QNUM(val) \ - (LiteralQObject){.type = QTYPE_QNUM, .value.qnum = (val)} + (QLitObject){.type = QTYPE_QNUM, .value.qnum = (val)} #define QLIT_QSTR(val) \ - (LiteralQObject){.type = QTYPE_QSTRING, .value.qstr = (val)} + (QLitObject){.type = QTYPE_QSTRING, .value.qstr = (val)} #define QLIT_QDICT(val) \ - (LiteralQObject){.type = QTYPE_QDICT, .value.qdict = (val)} + (QLitObject){.type = QTYPE_QDICT, .value.qdict = (val)} #define QLIT_QLIST(val) \ - (LiteralQObject){.type = QTYPE_QLIST, .value.qlist = (val)} + (QLitObject){.type = QTYPE_QLIST, .value.qlist = (val)} -int compare_litqobj_to_qobj(LiteralQObject *lhs, QObject *rhs); +int compare_litqobj_to_qobj(QLitObject *lhs, QObject *rhs); #endif /* QLIT_H */ diff --git a/qobject/qlit.c b/qobject/qlit.c index 5917c3584e..262d64988d 100644 --- a/qobject/qlit.c +++ b/qobject/qlit.c @@ -20,7 +20,7 @@ typedef struct QListCompareHelper { int index; - LiteralQObject *objs; + QLitObject *objs; int result; } QListCompareHelper; @@ -41,7 +41,7 @@ static void compare_helper(QObject *obj, void *opaque) compare_litqobj_to_qobj(&helper->objs[helper->index++], obj); } -int compare_litqobj_to_qobj(LiteralQObject *lhs, QObject *rhs) +int compare_litqobj_to_qobj(QLitObject *lhs, QObject *rhs) { int64_t val; diff --git a/tests/check-qjson.c b/tests/check-qjson.c index 525f79e60b..82b3681327 100644 --- a/tests/check-qjson.c +++ b/tests/check-qjson.c @@ -1065,23 +1065,23 @@ static void simple_dict(void) int i; struct { const char *encoded; - LiteralQObject decoded; + QLitObject decoded; } test_cases[] = { { .encoded = "{\"foo\": 42, \"bar\": \"hello world\"}", - .decoded = QLIT_QDICT(((LiteralQDictEntry[]){ + .decoded = QLIT_QDICT(((QLitDictEntry[]){ { "foo", QLIT_QNUM(42) }, { "bar", QLIT_QSTR("hello world") }, { } })), }, { .encoded = "{}", - .decoded = QLIT_QDICT(((LiteralQDictEntry[]){ + .decoded = QLIT_QDICT(((QLitDictEntry[]){ { } })), }, { .encoded = "{\"foo\": 43}", - .decoded = QLIT_QDICT(((LiteralQDictEntry[]){ + .decoded = QLIT_QDICT(((QLitDictEntry[]){ { "foo", QLIT_QNUM(43) }, { } })), @@ -1163,11 +1163,11 @@ static void simple_list(void) int i; struct { const char *encoded; - LiteralQObject decoded; + QLitObject decoded; } test_cases[] = { { .encoded = "[43,42]", - .decoded = QLIT_QLIST(((LiteralQObject[]){ + .decoded = QLIT_QLIST(((QLitObject[]){ QLIT_QNUM(43), QLIT_QNUM(42), { } @@ -1175,21 +1175,21 @@ static void simple_list(void) }, { .encoded = "[43]", - .decoded = QLIT_QLIST(((LiteralQObject[]){ + .decoded = QLIT_QLIST(((QLitObject[]){ QLIT_QNUM(43), { } })), }, { .encoded = "[]", - .decoded = QLIT_QLIST(((LiteralQObject[]){ + .decoded = QLIT_QLIST(((QLitObject[]){ { } })), }, { .encoded = "[{}]", - .decoded = QLIT_QLIST(((LiteralQObject[]){ - QLIT_QDICT(((LiteralQDictEntry[]){ + .decoded = QLIT_QLIST(((QLitObject[]){ + QLIT_QDICT(((QLitDictEntry[]){ {}, })), {}, @@ -1220,11 +1220,11 @@ static void simple_whitespace(void) int i; struct { const char *encoded; - LiteralQObject decoded; + QLitObject decoded; } test_cases[] = { { .encoded = " [ 43 , 42 ]", - .decoded = QLIT_QLIST(((LiteralQObject[]){ + .decoded = QLIT_QLIST(((QLitObject[]){ QLIT_QNUM(43), QLIT_QNUM(42), { } @@ -1232,12 +1232,12 @@ static void simple_whitespace(void) }, { .encoded = " [ 43 , { 'h' : 'b' }, [ ], 42 ]", - .decoded = QLIT_QLIST(((LiteralQObject[]){ + .decoded = QLIT_QLIST(((QLitObject[]){ QLIT_QNUM(43), - QLIT_QDICT(((LiteralQDictEntry[]){ + QLIT_QDICT(((QLitDictEntry[]){ { "h", QLIT_QSTR("b") }, { }})), - QLIT_QLIST(((LiteralQObject[]){ + QLIT_QLIST(((QLitObject[]){ { }})), QLIT_QNUM(42), { } @@ -1245,13 +1245,13 @@ static void simple_whitespace(void) }, { .encoded = " [ 43 , { 'h' : 'b' , 'a' : 32 }, [ ], 42 ]", - .decoded = QLIT_QLIST(((LiteralQObject[]){ + .decoded = QLIT_QLIST(((QLitObject[]){ QLIT_QNUM(43), - QLIT_QDICT(((LiteralQDictEntry[]){ + QLIT_QDICT(((QLitDictEntry[]){ { "h", QLIT_QSTR("b") }, { "a", QLIT_QNUM(32) }, { }})), - QLIT_QLIST(((LiteralQObject[]){ + QLIT_QLIST(((QLitObject[]){ { }})), QLIT_QNUM(42), { } @@ -1282,10 +1282,10 @@ static void simple_varargs(void) { QObject *embedded_obj; QObject *obj; - LiteralQObject decoded = QLIT_QLIST(((LiteralQObject[]){ + QLitObject decoded = QLIT_QLIST(((QLitObject[]){ QLIT_QNUM(1), QLIT_QNUM(2), - QLIT_QLIST(((LiteralQObject[]){ + QLIT_QLIST(((QLitObject[]){ QLIT_QNUM(32), QLIT_QNUM(42), {}})), -- cgit v1.2.3-55-g7522 From 60cc2eb7afd40b9cbaa35a5e0b54f365ac6e49f1 Mon Sep 17 00:00:00 2001 From: Marc-André Lureau Date: Fri, 25 Aug 2017 12:59:04 +0200 Subject: qlit: rename compare_litqobj_to_qobj() to qlit_equal_qobject() compare_litqobj_to_qobj() lacks a qlit_ prefix. Moreover, "compare" suggests -1, 0, +1 for less than, equal and greater than. The function actually returns non-zero for equal, zero for unequal. Rename to qlit_equal_qobject(). Its return type will be cleaned up in the next patch. Signed-off-by: Marc-André Lureau Reviewed-by: Markus Armbruster Message-Id: <20170825105913.4060-6-marcandre.lureau@redhat.com> Signed-off-by: Markus Armbruster --- include/qapi/qmp/qlit.h | 2 +- qobject/qlit.c | 6 +++--- tests/check-qjson.c | 14 +++++++------- 3 files changed, 11 insertions(+), 11 deletions(-) (limited to 'qobject/qlit.c') diff --git a/include/qapi/qmp/qlit.h b/include/qapi/qmp/qlit.h index f1d6eed317..5a180477c8 100644 --- a/include/qapi/qmp/qlit.h +++ b/include/qapi/qmp/qlit.h @@ -44,6 +44,6 @@ struct QLitDictEntry { #define QLIT_QLIST(val) \ { .type = QTYPE_QLIST, .value.qlist = (val) } -int compare_litqobj_to_qobj(QLitObject *lhs, QObject *rhs); +int qlit_equal_qobject(QLitObject *lhs, QObject *rhs); #endif /* QLIT_H */ diff --git a/qobject/qlit.c b/qobject/qlit.c index 262d64988d..0c4101898d 100644 --- a/qobject/qlit.c +++ b/qobject/qlit.c @@ -38,10 +38,10 @@ static void compare_helper(QObject *obj, void *opaque) } helper->result = - compare_litqobj_to_qobj(&helper->objs[helper->index++], obj); + qlit_equal_qobject(&helper->objs[helper->index++], obj); } -int compare_litqobj_to_qobj(QLitObject *lhs, QObject *rhs) +int qlit_equal_qobject(QLitObject *lhs, QObject *rhs) { int64_t val; @@ -63,7 +63,7 @@ int compare_litqobj_to_qobj(QLitObject *lhs, QObject *rhs) QObject *obj = qdict_get(qobject_to_qdict(rhs), lhs->value.qdict[i].key); - if (!compare_litqobj_to_qobj(&lhs->value.qdict[i].value, obj)) { + if (!qlit_equal_qobject(&lhs->value.qdict[i].value, obj)) { return 0; } } diff --git a/tests/check-qjson.c b/tests/check-qjson.c index 82b3681327..e5ca273cbc 100644 --- a/tests/check-qjson.c +++ b/tests/check-qjson.c @@ -1094,13 +1094,13 @@ static void simple_dict(void) QString *str; obj = qobject_from_json(test_cases[i].encoded, &error_abort); - g_assert(compare_litqobj_to_qobj(&test_cases[i].decoded, obj) == 1); + g_assert(qlit_equal_qobject(&test_cases[i].decoded, obj) == 1); str = qobject_to_json(obj); qobject_decref(obj); obj = qobject_from_json(qstring_get_str(str), &error_abort); - g_assert(compare_litqobj_to_qobj(&test_cases[i].decoded, obj) == 1); + g_assert(qlit_equal_qobject(&test_cases[i].decoded, obj) == 1); qobject_decref(obj); QDECREF(str); } @@ -1203,13 +1203,13 @@ static void simple_list(void) QString *str; obj = qobject_from_json(test_cases[i].encoded, &error_abort); - g_assert(compare_litqobj_to_qobj(&test_cases[i].decoded, obj) == 1); + g_assert(qlit_equal_qobject(&test_cases[i].decoded, obj) == 1); str = qobject_to_json(obj); qobject_decref(obj); obj = qobject_from_json(qstring_get_str(str), &error_abort); - g_assert(compare_litqobj_to_qobj(&test_cases[i].decoded, obj) == 1); + g_assert(qlit_equal_qobject(&test_cases[i].decoded, obj) == 1); qobject_decref(obj); QDECREF(str); } @@ -1265,13 +1265,13 @@ static void simple_whitespace(void) QString *str; obj = qobject_from_json(test_cases[i].encoded, &error_abort); - g_assert(compare_litqobj_to_qobj(&test_cases[i].decoded, obj) == 1); + g_assert(qlit_equal_qobject(&test_cases[i].decoded, obj) == 1); str = qobject_to_json(obj); qobject_decref(obj); obj = qobject_from_json(qstring_get_str(str), &error_abort); - g_assert(compare_litqobj_to_qobj(&test_cases[i].decoded, obj) == 1); + g_assert(qlit_equal_qobject(&test_cases[i].decoded, obj) == 1); qobject_decref(obj); QDECREF(str); @@ -1295,7 +1295,7 @@ static void simple_varargs(void) g_assert(embedded_obj != NULL); obj = qobject_from_jsonf("[%d, 2, %p]", 1, embedded_obj); - g_assert(compare_litqobj_to_qobj(&decoded, obj) == 1); + g_assert(qlit_equal_qobject(&decoded, obj) == 1); qobject_decref(obj); } -- cgit v1.2.3-55-g7522 From d9eba57a6ad6d8fe8cf11bdd8345bbda66deb6d9 Mon Sep 17 00:00:00 2001 From: Marc-André Lureau Date: Fri, 25 Aug 2017 12:59:05 +0200 Subject: qlit: make qlit_equal_qobject return a bool Make it more obvious about the expected return values. Signed-off-by: Marc-André Lureau Reviewed-by: Markus Armbruster Message-Id: <20170825105913.4060-7-marcandre.lureau@redhat.com> Signed-off-by: Markus Armbruster --- include/qapi/qmp/qlit.h | 2 +- qobject/qlit.c | 18 +++++++++--------- tests/check-qjson.c | 14 +++++++------- 3 files changed, 17 insertions(+), 17 deletions(-) (limited to 'qobject/qlit.c') diff --git a/include/qapi/qmp/qlit.h b/include/qapi/qmp/qlit.h index 5a180477c8..35aabbdc9f 100644 --- a/include/qapi/qmp/qlit.h +++ b/include/qapi/qmp/qlit.h @@ -44,6 +44,6 @@ struct QLitDictEntry { #define QLIT_QLIST(val) \ { .type = QTYPE_QLIST, .value.qlist = (val) } -int qlit_equal_qobject(QLitObject *lhs, QObject *rhs); +bool qlit_equal_qobject(QLitObject *lhs, QObject *rhs); #endif /* QLIT_H */ diff --git a/qobject/qlit.c b/qobject/qlit.c index 0c4101898d..a2975bef3f 100644 --- a/qobject/qlit.c +++ b/qobject/qlit.c @@ -21,19 +21,19 @@ typedef struct QListCompareHelper { int index; QLitObject *objs; - int result; + bool result; } QListCompareHelper; static void compare_helper(QObject *obj, void *opaque) { QListCompareHelper *helper = opaque; - if (helper->result == 0) { + if (!helper->result) { return; } if (helper->objs[helper->index].type == QTYPE_NONE) { - helper->result = 0; + helper->result = false; return; } @@ -41,12 +41,12 @@ static void compare_helper(QObject *obj, void *opaque) qlit_equal_qobject(&helper->objs[helper->index++], obj); } -int qlit_equal_qobject(QLitObject *lhs, QObject *rhs) +bool qlit_equal_qobject(QLitObject *lhs, QObject *rhs) { int64_t val; if (!rhs || lhs->type != qobject_type(rhs)) { - return 0; + return false; } switch (lhs->type) { @@ -64,18 +64,18 @@ int qlit_equal_qobject(QLitObject *lhs, QObject *rhs) lhs->value.qdict[i].key); if (!qlit_equal_qobject(&lhs->value.qdict[i].value, obj)) { - return 0; + return false; } } - return 1; + return true; } case QTYPE_QLIST: { QListCompareHelper helper; helper.index = 0; helper.objs = lhs->value.qlist; - helper.result = 1; + helper.result = true; qlist_iter(qobject_to_qlist(rhs), compare_helper, &helper); @@ -85,5 +85,5 @@ int qlit_equal_qobject(QLitObject *lhs, QObject *rhs) break; } - return 0; + return false; } diff --git a/tests/check-qjson.c b/tests/check-qjson.c index e5ca273cbc..59227934ce 100644 --- a/tests/check-qjson.c +++ b/tests/check-qjson.c @@ -1094,13 +1094,13 @@ static void simple_dict(void) QString *str; obj = qobject_from_json(test_cases[i].encoded, &error_abort); - g_assert(qlit_equal_qobject(&test_cases[i].decoded, obj) == 1); + g_assert(qlit_equal_qobject(&test_cases[i].decoded, obj)); str = qobject_to_json(obj); qobject_decref(obj); obj = qobject_from_json(qstring_get_str(str), &error_abort); - g_assert(qlit_equal_qobject(&test_cases[i].decoded, obj) == 1); + g_assert(qlit_equal_qobject(&test_cases[i].decoded, obj)); qobject_decref(obj); QDECREF(str); } @@ -1203,13 +1203,13 @@ static void simple_list(void) QString *str; obj = qobject_from_json(test_cases[i].encoded, &error_abort); - g_assert(qlit_equal_qobject(&test_cases[i].decoded, obj) == 1); + g_assert(qlit_equal_qobject(&test_cases[i].decoded, obj)); str = qobject_to_json(obj); qobject_decref(obj); obj = qobject_from_json(qstring_get_str(str), &error_abort); - g_assert(qlit_equal_qobject(&test_cases[i].decoded, obj) == 1); + g_assert(qlit_equal_qobject(&test_cases[i].decoded, obj)); qobject_decref(obj); QDECREF(str); } @@ -1265,13 +1265,13 @@ static void simple_whitespace(void) QString *str; obj = qobject_from_json(test_cases[i].encoded, &error_abort); - g_assert(qlit_equal_qobject(&test_cases[i].decoded, obj) == 1); + g_assert(qlit_equal_qobject(&test_cases[i].decoded, obj)); str = qobject_to_json(obj); qobject_decref(obj); obj = qobject_from_json(qstring_get_str(str), &error_abort); - g_assert(qlit_equal_qobject(&test_cases[i].decoded, obj) == 1); + g_assert(qlit_equal_qobject(&test_cases[i].decoded, obj)); qobject_decref(obj); QDECREF(str); @@ -1295,7 +1295,7 @@ static void simple_varargs(void) g_assert(embedded_obj != NULL); obj = qobject_from_jsonf("[%d, 2, %p]", 1, embedded_obj); - g_assert(qlit_equal_qobject(&decoded, obj) == 1); + g_assert(qlit_equal_qobject(&decoded, obj)); qobject_decref(obj); } -- cgit v1.2.3-55-g7522 From e2346a19521c6cce417250c75adb0b3a7cd5535a Mon Sep 17 00:00:00 2001 From: Marc-André Lureau Date: Fri, 25 Aug 2017 12:59:06 +0200 Subject: qlit: make qlit_equal_qobject() take const arguments Signed-off-by: Marc-André Lureau Reviewed-by: Markus Armbruster Message-Id: <20170825105913.4060-8-marcandre.lureau@redhat.com> Signed-off-by: Markus Armbruster --- include/qapi/qmp/qlit.h | 2 +- qobject/qlit.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'qobject/qlit.c') diff --git a/include/qapi/qmp/qlit.h b/include/qapi/qmp/qlit.h index 35aabbdc9f..fc1a2d845d 100644 --- a/include/qapi/qmp/qlit.h +++ b/include/qapi/qmp/qlit.h @@ -44,6 +44,6 @@ struct QLitDictEntry { #define QLIT_QLIST(val) \ { .type = QTYPE_QLIST, .value.qlist = (val) } -bool qlit_equal_qobject(QLitObject *lhs, QObject *rhs); +bool qlit_equal_qobject(const QLitObject *lhs, const QObject *rhs); #endif /* QLIT_H */ diff --git a/qobject/qlit.c b/qobject/qlit.c index a2975bef3f..ae2787ef35 100644 --- a/qobject/qlit.c +++ b/qobject/qlit.c @@ -41,7 +41,7 @@ static void compare_helper(QObject *obj, void *opaque) qlit_equal_qobject(&helper->objs[helper->index++], obj); } -bool qlit_equal_qobject(QLitObject *lhs, QObject *rhs) +bool qlit_equal_qobject(const QLitObject *lhs, const QObject *rhs) { int64_t val; -- cgit v1.2.3-55-g7522 From 6c6084c1b0802f5265d5c7dc27f7125d9fd1cceb Mon Sep 17 00:00:00 2001 From: Marc-André Lureau Date: Fri, 25 Aug 2017 12:59:07 +0200 Subject: qlit: add QLIT_QNULL and QLIT_BOOL As they are going to be used in the following patches. Signed-off-by: Marc-André Lureau Reviewed-by: Markus Armbruster Message-Id: <20170825105913.4060-9-marcandre.lureau@redhat.com> Signed-off-by: Markus Armbruster --- include/qapi/qmp/qlit.h | 5 +++++ qobject/qlit.c | 4 ++++ 2 files changed, 9 insertions(+) (limited to 'qobject/qlit.c') diff --git a/include/qapi/qmp/qlit.h b/include/qapi/qmp/qlit.h index fc1a2d845d..b18406bce9 100644 --- a/include/qapi/qmp/qlit.h +++ b/include/qapi/qmp/qlit.h @@ -23,6 +23,7 @@ typedef struct QLitObject QLitObject; struct QLitObject { int type; union { + bool qbool; int64_t qnum; const char *qstr; QLitDictEntry *qdict; @@ -35,6 +36,10 @@ struct QLitDictEntry { QLitObject value; }; +#define QLIT_QNULL \ + { .type = QTYPE_QNULL } +#define QLIT_QBOOL(val) \ + { .type = QTYPE_QBOOL, .value.qbool = (val) } #define QLIT_QNUM(val) \ { .type = QTYPE_QNUM, .value.qnum = (val) } #define QLIT_QSTR(val) \ diff --git a/qobject/qlit.c b/qobject/qlit.c index ae2787ef35..07ad6b05e8 100644 --- a/qobject/qlit.c +++ b/qobject/qlit.c @@ -50,6 +50,8 @@ bool qlit_equal_qobject(const QLitObject *lhs, const QObject *rhs) } switch (lhs->type) { + case QTYPE_QBOOL: + return lhs->value.qbool == qbool_get_bool(qobject_to_qbool(rhs)); case QTYPE_QNUM: g_assert(qnum_get_try_int(qobject_to_qnum(rhs), &val)); return lhs->value.qnum == val; @@ -81,6 +83,8 @@ bool qlit_equal_qobject(const QLitObject *lhs, const QObject *rhs) return helper.result; } + case QTYPE_QNULL: + return true; default: break; } -- cgit v1.2.3-55-g7522 From 5f4bd8093671962093d9ec7d57ef65244b270dd4 Mon Sep 17 00:00:00 2001 From: Marc-André Lureau Date: Fri, 25 Aug 2017 12:59:08 +0200 Subject: qlit: Replace open-coded qnum_get_int() by call Bonus: rids us of a side effect in an assertion. Signed-off-by: Marc-André Lureau Reviewed-by: Markus Armbruster Message-Id: <20170825105913.4060-10-marcandre.lureau@redhat.com> Signed-off-by: Markus Armbruster --- qobject/qlit.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'qobject/qlit.c') diff --git a/qobject/qlit.c b/qobject/qlit.c index 07ad6b05e8..b1d9146220 100644 --- a/qobject/qlit.c +++ b/qobject/qlit.c @@ -43,8 +43,6 @@ static void compare_helper(QObject *obj, void *opaque) bool qlit_equal_qobject(const QLitObject *lhs, const QObject *rhs) { - int64_t val; - if (!rhs || lhs->type != qobject_type(rhs)) { return false; } @@ -53,8 +51,7 @@ bool qlit_equal_qobject(const QLitObject *lhs, const QObject *rhs) case QTYPE_QBOOL: return lhs->value.qbool == qbool_get_bool(qobject_to_qbool(rhs)); case QTYPE_QNUM: - g_assert(qnum_get_try_int(qobject_to_qnum(rhs), &val)); - return lhs->value.qnum == val; + return lhs->value.qnum == qnum_get_int(qobject_to_qnum(rhs)); case QTYPE_QSTRING: return (strcmp(lhs->value.qstr, qstring_get_str(qobject_to_qstring(rhs))) == 0); -- cgit v1.2.3-55-g7522 From 6da8a7a3b444211914418d2b3c7dc615d70a7d2d Mon Sep 17 00:00:00 2001 From: Marc-André Lureau Date: Fri, 25 Aug 2017 12:59:10 +0200 Subject: qlit: Tighten QLit dict vs QDict comparison We check that all members of the QLit dictionary are also in the QDict. We neglect to check the other direction. Comparing the number of members suffices, because QDict can't contain duplicate members, and putting duplicates in a QLit is a programming error. Signed-off-by: Marc-André Lureau Message-Id: <20170825105913.4060-12-marcandre.lureau@redhat.com> [Commit message improved] Signed-off-by: Markus Armbruster --- qobject/qlit.c | 37 +++++++++++++++++++++++-------------- tests/check-qlit.c | 7 +++++++ 2 files changed, 30 insertions(+), 14 deletions(-) (limited to 'qobject/qlit.c') diff --git a/qobject/qlit.c b/qobject/qlit.c index b1d9146220..dc0015f76c 100644 --- a/qobject/qlit.c +++ b/qobject/qlit.c @@ -41,6 +41,27 @@ static void compare_helper(QObject *obj, void *opaque) qlit_equal_qobject(&helper->objs[helper->index++], obj); } +static bool qlit_equal_qdict(const QLitObject *lhs, const QDict *qdict) +{ + int i; + + for (i = 0; lhs->value.qdict[i].key; i++) { + QObject *obj = qdict_get(qdict, lhs->value.qdict[i].key); + + if (!qlit_equal_qobject(&lhs->value.qdict[i].value, obj)) { + return false; + } + } + + /* Note: the literal qdict must not contain duplicates, this is + * considered a programming error and it isn't checked here. */ + if (qdict_size(qdict) != i) { + return false; + } + + return true; +} + bool qlit_equal_qobject(const QLitObject *lhs, const QObject *rhs) { if (!rhs || lhs->type != qobject_type(rhs)) { @@ -55,20 +76,8 @@ bool qlit_equal_qobject(const QLitObject *lhs, const QObject *rhs) case QTYPE_QSTRING: return (strcmp(lhs->value.qstr, qstring_get_str(qobject_to_qstring(rhs))) == 0); - case QTYPE_QDICT: { - int i; - - for (i = 0; lhs->value.qdict[i].key; i++) { - QObject *obj = qdict_get(qobject_to_qdict(rhs), - lhs->value.qdict[i].key); - - if (!qlit_equal_qobject(&lhs->value.qdict[i].value, obj)) { - return false; - } - } - - return true; - } + case QTYPE_QDICT: + return qlit_equal_qdict(lhs, qobject_to_qdict(rhs)); case QTYPE_QLIST: { QListCompareHelper helper; diff --git a/tests/check-qlit.c b/tests/check-qlit.c index d2422bbaf0..d2ecc200d3 100644 --- a/tests/check-qlit.c +++ b/tests/check-qlit.c @@ -28,6 +28,11 @@ static QLitObject qlit = QLIT_QDICT(((QLitDictEntry[]) { { }, })); +static QLitObject qlit_foo = QLIT_QDICT(((QLitDictEntry[]) { + { "foo", QLIT_QNUM(42) }, + { }, +})); + static QObject *make_qobject(void) { QDict *qdict = qdict_new(); @@ -51,6 +56,8 @@ static void qlit_equal_qobject_test(void) g_assert(qlit_equal_qobject(&qlit, qobj)); + g_assert(!qlit_equal_qobject(&qlit_foo, qobj)); + qobject_decref(qobj); } -- cgit v1.2.3-55-g7522 From cbb654052600c376d5ee3401c98a25d09d11a154 Mon Sep 17 00:00:00 2001 From: Marc-André Lureau Date: Fri, 25 Aug 2017 12:59:11 +0200 Subject: qlit: Tighten QLit list vs QList comparison We check that all members of the QLit list are also in the QList. We neglect to check the other direction. Fix that. While there, use QLIST_FOREACH_ENTRY() to simplify the code and break the loop on the first mismatch. Signed-off-by: Marc-André Lureau Message-Id: <20170825105913.4060-13-marcandre.lureau@redhat.com> [Commit message improved] Signed-off-by: Markus Armbruster --- qobject/qlit.c | 53 +++++++++++++++++++---------------------------------- tests/check-qlit.c | 3 +++ 2 files changed, 22 insertions(+), 34 deletions(-) (limited to 'qobject/qlit.c') diff --git a/qobject/qlit.c b/qobject/qlit.c index dc0015f76c..3c4882c784 100644 --- a/qobject/qlit.c +++ b/qobject/qlit.c @@ -18,29 +18,6 @@ #include "qapi/qmp/qlit.h" #include "qapi/qmp/types.h" -typedef struct QListCompareHelper { - int index; - QLitObject *objs; - bool result; -} QListCompareHelper; - -static void compare_helper(QObject *obj, void *opaque) -{ - QListCompareHelper *helper = opaque; - - if (!helper->result) { - return; - } - - if (helper->objs[helper->index].type == QTYPE_NONE) { - helper->result = false; - return; - } - - helper->result = - qlit_equal_qobject(&helper->objs[helper->index++], obj); -} - static bool qlit_equal_qdict(const QLitObject *lhs, const QDict *qdict) { int i; @@ -62,6 +39,23 @@ static bool qlit_equal_qdict(const QLitObject *lhs, const QDict *qdict) return true; } +static bool qlit_equal_qlist(const QLitObject *lhs, const QList *qlist) +{ + QListEntry *e; + int i = 0; + + QLIST_FOREACH_ENTRY(qlist, e) { + QObject *obj = qlist_entry_obj(e); + + if (!qlit_equal_qobject(&lhs->value.qlist[i], obj)) { + return false; + } + i++; + } + + return !e && lhs->value.qlist[i].type == QTYPE_NONE; +} + bool qlit_equal_qobject(const QLitObject *lhs, const QObject *rhs) { if (!rhs || lhs->type != qobject_type(rhs)) { @@ -78,17 +72,8 @@ bool qlit_equal_qobject(const QLitObject *lhs, const QObject *rhs) qstring_get_str(qobject_to_qstring(rhs))) == 0); case QTYPE_QDICT: return qlit_equal_qdict(lhs, qobject_to_qdict(rhs)); - case QTYPE_QLIST: { - QListCompareHelper helper; - - helper.index = 0; - helper.objs = lhs->value.qlist; - helper.result = true; - - qlist_iter(qobject_to_qlist(rhs), compare_helper, &helper); - - return helper.result; - } + case QTYPE_QLIST: + return qlit_equal_qlist(lhs, qobject_to_qlist(rhs)); case QTYPE_QNULL: return true; default: diff --git a/tests/check-qlit.c b/tests/check-qlit.c index d2ecc200d3..c59ec1ab88 100644 --- a/tests/check-qlit.c +++ b/tests/check-qlit.c @@ -58,6 +58,9 @@ static void qlit_equal_qobject_test(void) g_assert(!qlit_equal_qobject(&qlit_foo, qobj)); + qdict_put(qobject_to_qdict(qobj), "bee", qlist_new()); + g_assert(!qlit_equal_qobject(&qlit, qobj)); + qobject_decref(qobj); } -- cgit v1.2.3-55-g7522