|
|
9ae3a8 |
From 95aeff93da762bf7f69317eb674d3eccce672038 Mon Sep 17 00:00:00 2001
|
|
|
9ae3a8 |
From: Markus Armbruster <armbru@redhat.com>
|
|
|
9ae3a8 |
Date: Wed, 27 Jul 2016 07:35:04 +0200
|
|
|
9ae3a8 |
Subject: [PATCH 06/16] qjson: Give each of the six structural chars its own
|
|
|
9ae3a8 |
token type
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
RH-Author: Markus Armbruster <armbru@redhat.com>
|
|
|
9ae3a8 |
Message-id: <1469604913-12442-8-git-send-email-armbru@redhat.com>
|
|
|
9ae3a8 |
Patchwork-id: 71482
|
|
|
9ae3a8 |
O-Subject: [RHEL-7.3 qemu-kvm PATCH v2 06/15] qjson: Give each of the six structural chars its own token type
|
|
|
9ae3a8 |
Bugzilla: 1276036
|
|
|
9ae3a8 |
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
9ae3a8 |
RH-Acked-by: John Snow <jsnow@redhat.com>
|
|
|
9ae3a8 |
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
Simplifies things, because we always check for a specific one.
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
Signed-off-by: Markus Armbruster <armbru@redhat.com>
|
|
|
9ae3a8 |
Message-Id: <1448486613-17634-6-git-send-email-armbru@redhat.com>
|
|
|
9ae3a8 |
Reviewed-by: Eric Blake <eblake@redhat.com>
|
|
|
9ae3a8 |
(cherry picked from commit c54616608af442edf4cfb7397a1909c2653efba0)
|
|
|
9ae3a8 |
Signed-off-by: Markus Armbruster <armbru@redhat.com>
|
|
|
9ae3a8 |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
9ae3a8 |
---
|
|
|
9ae3a8 |
include/qapi/qmp/json-lexer.h | 7 ++++++-
|
|
|
9ae3a8 |
qobject/json-lexer.c | 19 ++++++++++++-------
|
|
|
9ae3a8 |
qobject/json-parser.c | 31 +++++++++----------------------
|
|
|
9ae3a8 |
qobject/json-streamer.c | 32 +++++++++++++++-----------------
|
|
|
9ae3a8 |
4 files changed, 42 insertions(+), 47 deletions(-)
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
diff --git a/include/qapi/qmp/json-lexer.h b/include/qapi/qmp/json-lexer.h
|
|
|
9ae3a8 |
index 61a143f..f3e8dc7 100644
|
|
|
9ae3a8 |
--- a/include/qapi/qmp/json-lexer.h
|
|
|
9ae3a8 |
+++ b/include/qapi/qmp/json-lexer.h
|
|
|
9ae3a8 |
@@ -19,7 +19,12 @@
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
typedef enum json_token_type {
|
|
|
9ae3a8 |
JSON_MIN = 100,
|
|
|
9ae3a8 |
- JSON_OPERATOR = JSON_MIN,
|
|
|
9ae3a8 |
+ JSON_LCURLY = JSON_MIN,
|
|
|
9ae3a8 |
+ JSON_RCURLY,
|
|
|
9ae3a8 |
+ JSON_LSQUARE,
|
|
|
9ae3a8 |
+ JSON_RSQUARE,
|
|
|
9ae3a8 |
+ JSON_COLON,
|
|
|
9ae3a8 |
+ JSON_COMMA,
|
|
|
9ae3a8 |
JSON_INTEGER,
|
|
|
9ae3a8 |
JSON_FLOAT,
|
|
|
9ae3a8 |
JSON_KEYWORD,
|
|
|
9ae3a8 |
diff --git a/qobject/json-lexer.c b/qobject/json-lexer.c
|
|
|
9ae3a8 |
index f106ffb..1bfff02 100644
|
|
|
9ae3a8 |
--- a/qobject/json-lexer.c
|
|
|
9ae3a8 |
+++ b/qobject/json-lexer.c
|
|
|
9ae3a8 |
@@ -257,12 +257,12 @@ static const uint8_t json_lexer[][256] = {
|
|
|
9ae3a8 |
['0'] = IN_ZERO,
|
|
|
9ae3a8 |
['1' ... '9'] = IN_NONZERO_NUMBER,
|
|
|
9ae3a8 |
['-'] = IN_NEG_NONZERO_NUMBER,
|
|
|
9ae3a8 |
- ['{'] = JSON_OPERATOR,
|
|
|
9ae3a8 |
- ['}'] = JSON_OPERATOR,
|
|
|
9ae3a8 |
- ['['] = JSON_OPERATOR,
|
|
|
9ae3a8 |
- [']'] = JSON_OPERATOR,
|
|
|
9ae3a8 |
- [','] = JSON_OPERATOR,
|
|
|
9ae3a8 |
- [':'] = JSON_OPERATOR,
|
|
|
9ae3a8 |
+ ['{'] = JSON_LCURLY,
|
|
|
9ae3a8 |
+ ['}'] = JSON_RCURLY,
|
|
|
9ae3a8 |
+ ['['] = JSON_LSQUARE,
|
|
|
9ae3a8 |
+ [']'] = JSON_RSQUARE,
|
|
|
9ae3a8 |
+ [','] = JSON_COMMA,
|
|
|
9ae3a8 |
+ [':'] = JSON_COLON,
|
|
|
9ae3a8 |
['a' ... 'z'] = IN_KEYWORD,
|
|
|
9ae3a8 |
['%'] = IN_ESCAPE,
|
|
|
9ae3a8 |
[' '] = IN_WHITESPACE,
|
|
|
9ae3a8 |
@@ -299,7 +299,12 @@ static int json_lexer_feed_char(JSONLexer *lexer, char ch, bool flush)
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
switch (new_state) {
|
|
|
9ae3a8 |
- case JSON_OPERATOR:
|
|
|
9ae3a8 |
+ case JSON_LCURLY:
|
|
|
9ae3a8 |
+ case JSON_RCURLY:
|
|
|
9ae3a8 |
+ case JSON_LSQUARE:
|
|
|
9ae3a8 |
+ case JSON_RSQUARE:
|
|
|
9ae3a8 |
+ case JSON_COLON:
|
|
|
9ae3a8 |
+ case JSON_COMMA:
|
|
|
9ae3a8 |
case JSON_ESCAPE:
|
|
|
9ae3a8 |
case JSON_INTEGER:
|
|
|
9ae3a8 |
case JSON_FLOAT:
|
|
|
9ae3a8 |
diff --git a/qobject/json-parser.c b/qobject/json-parser.c
|
|
|
9ae3a8 |
index fa09769..50bf30c 100644
|
|
|
9ae3a8 |
--- a/qobject/json-parser.c
|
|
|
9ae3a8 |
+++ b/qobject/json-parser.c
|
|
|
9ae3a8 |
@@ -64,19 +64,6 @@ static JSONTokenType token_get_type(QObject *obj)
|
|
|
9ae3a8 |
return qdict_get_int(qobject_to_qdict(obj), "type");
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
-static int token_is_operator(QObject *obj, char op)
|
|
|
9ae3a8 |
-{
|
|
|
9ae3a8 |
- const char *val;
|
|
|
9ae3a8 |
-
|
|
|
9ae3a8 |
- if (token_get_type(obj) != JSON_OPERATOR) {
|
|
|
9ae3a8 |
- return 0;
|
|
|
9ae3a8 |
- }
|
|
|
9ae3a8 |
-
|
|
|
9ae3a8 |
- val = token_get_value(obj);
|
|
|
9ae3a8 |
-
|
|
|
9ae3a8 |
- return (val[0] == op) && (val[1] == 0);
|
|
|
9ae3a8 |
-}
|
|
|
9ae3a8 |
-
|
|
|
9ae3a8 |
static int token_is_keyword(QObject *obj, const char *value)
|
|
|
9ae3a8 |
{
|
|
|
9ae3a8 |
if (token_get_type(obj) != JSON_KEYWORD) {
|
|
|
9ae3a8 |
@@ -385,7 +372,7 @@ static int parse_pair(JSONParserContext *ctxt, QDict *dict, va_list *ap)
|
|
|
9ae3a8 |
goto out;
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
- if (!token_is_operator(token, ':')) {
|
|
|
9ae3a8 |
+ if (token_get_type(token) != JSON_COLON) {
|
|
|
9ae3a8 |
parse_error(ctxt, token, "missing : in object pair");
|
|
|
9ae3a8 |
goto out;
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
@@ -420,7 +407,7 @@ static QObject *parse_object(JSONParserContext *ctxt, va_list *ap)
|
|
|
9ae3a8 |
goto out;
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
- if (!token_is_operator(token, '{')) {
|
|
|
9ae3a8 |
+ if (token_get_type(token) != JSON_LCURLY) {
|
|
|
9ae3a8 |
goto out;
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
@@ -432,7 +419,7 @@ static QObject *parse_object(JSONParserContext *ctxt, va_list *ap)
|
|
|
9ae3a8 |
goto out;
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
- if (!token_is_operator(peek, '}')) {
|
|
|
9ae3a8 |
+ if (token_get_type(peek) != JSON_RCURLY) {
|
|
|
9ae3a8 |
if (parse_pair(ctxt, dict, ap) == -1) {
|
|
|
9ae3a8 |
goto out;
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
@@ -443,8 +430,8 @@ static QObject *parse_object(JSONParserContext *ctxt, va_list *ap)
|
|
|
9ae3a8 |
goto out;
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
- while (!token_is_operator(token, '}')) {
|
|
|
9ae3a8 |
- if (!token_is_operator(token, ',')) {
|
|
|
9ae3a8 |
+ while (token_get_type(token) != JSON_RCURLY) {
|
|
|
9ae3a8 |
+ if (token_get_type(token) != JSON_COMMA) {
|
|
|
9ae3a8 |
parse_error(ctxt, token, "expected separator in dict");
|
|
|
9ae3a8 |
goto out;
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
@@ -482,7 +469,7 @@ static QObject *parse_array(JSONParserContext *ctxt, va_list *ap)
|
|
|
9ae3a8 |
goto out;
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
- if (!token_is_operator(token, '[')) {
|
|
|
9ae3a8 |
+ if (token_get_type(token) != JSON_LSQUARE) {
|
|
|
9ae3a8 |
goto out;
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
@@ -494,7 +481,7 @@ static QObject *parse_array(JSONParserContext *ctxt, va_list *ap)
|
|
|
9ae3a8 |
goto out;
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
- if (!token_is_operator(peek, ']')) {
|
|
|
9ae3a8 |
+ if (token_get_type(peek) != JSON_RSQUARE) {
|
|
|
9ae3a8 |
QObject *obj;
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
obj = parse_value(ctxt, ap);
|
|
|
9ae3a8 |
@@ -511,8 +498,8 @@ static QObject *parse_array(JSONParserContext *ctxt, va_list *ap)
|
|
|
9ae3a8 |
goto out;
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
- while (!token_is_operator(token, ']')) {
|
|
|
9ae3a8 |
- if (!token_is_operator(token, ',')) {
|
|
|
9ae3a8 |
+ while (token_get_type(token) != JSON_RSQUARE) {
|
|
|
9ae3a8 |
+ if (token_get_type(token) != JSON_COMMA) {
|
|
|
9ae3a8 |
parse_error(ctxt, token, "expected separator in list");
|
|
|
9ae3a8 |
goto out;
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
diff --git a/qobject/json-streamer.c b/qobject/json-streamer.c
|
|
|
9ae3a8 |
index 2bd22a7..4a161a1 100644
|
|
|
9ae3a8 |
--- a/qobject/json-streamer.c
|
|
|
9ae3a8 |
+++ b/qobject/json-streamer.c
|
|
|
9ae3a8 |
@@ -26,23 +26,21 @@ static void json_message_process_token(JSONLexer *lexer, QString *token, JSONTok
|
|
|
9ae3a8 |
JSONMessageParser *parser = container_of(lexer, JSONMessageParser, lexer);
|
|
|
9ae3a8 |
QDict *dict;
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
- if (type == JSON_OPERATOR) {
|
|
|
9ae3a8 |
- switch (qstring_get_str(token)[0]) {
|
|
|
9ae3a8 |
- case '{':
|
|
|
9ae3a8 |
- parser->brace_count++;
|
|
|
9ae3a8 |
- break;
|
|
|
9ae3a8 |
- case '}':
|
|
|
9ae3a8 |
- parser->brace_count--;
|
|
|
9ae3a8 |
- break;
|
|
|
9ae3a8 |
- case '[':
|
|
|
9ae3a8 |
- parser->bracket_count++;
|
|
|
9ae3a8 |
- break;
|
|
|
9ae3a8 |
- case ']':
|
|
|
9ae3a8 |
- parser->bracket_count--;
|
|
|
9ae3a8 |
- break;
|
|
|
9ae3a8 |
- default:
|
|
|
9ae3a8 |
- break;
|
|
|
9ae3a8 |
- }
|
|
|
9ae3a8 |
+ switch (type) {
|
|
|
9ae3a8 |
+ case JSON_LCURLY:
|
|
|
9ae3a8 |
+ parser->brace_count++;
|
|
|
9ae3a8 |
+ break;
|
|
|
9ae3a8 |
+ case JSON_RCURLY:
|
|
|
9ae3a8 |
+ parser->brace_count--;
|
|
|
9ae3a8 |
+ break;
|
|
|
9ae3a8 |
+ case JSON_LSQUARE:
|
|
|
9ae3a8 |
+ parser->bracket_count++;
|
|
|
9ae3a8 |
+ break;
|
|
|
9ae3a8 |
+ case JSON_RSQUARE:
|
|
|
9ae3a8 |
+ parser->bracket_count--;
|
|
|
9ae3a8 |
+ break;
|
|
|
9ae3a8 |
+ default:
|
|
|
9ae3a8 |
+ break;
|
|
|
9ae3a8 |
}
|
|
|
9ae3a8 |
|
|
|
9ae3a8 |
dict = qdict_new();
|
|
|
9ae3a8 |
--
|
|
|
9ae3a8 |
1.8.3.1
|
|
|
9ae3a8 |
|