File:  [Qemu by Fabrice Bellard] / qemu / json-streamer.c
Revision 1.1: download - view: text, annotated - select for diffs
Tue Apr 24 17:34:58 2018 UTC (2 years, 1 month ago) by root
CVS tags: MAIN, HEAD
Initial revision

    1: /*
    2:  * JSON streaming support
    3:  *
    4:  * Copyright IBM, Corp. 2009
    5:  *
    6:  * Authors:
    7:  *  Anthony Liguori   <aliguori@us.ibm.com>
    8:  *
    9:  * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
   10:  * See the COPYING.LIB file in the top-level directory.
   11:  *
   12:  */
   13: 
   14: #include "qlist.h"
   15: #include "qint.h"
   16: #include "qdict.h"
   17: #include "qemu-common.h"
   18: #include "json-lexer.h"
   19: #include "json-streamer.h"
   20: 
   21: static void json_message_process_token(JSONLexer *lexer, QString *token, JSONTokenType type, int x, int y)
   22: {
   23:     JSONMessageParser *parser = container_of(lexer, JSONMessageParser, lexer);
   24:     QDict *dict;
   25: 
   26:     if (type == JSON_OPERATOR) {
   27:         switch (qstring_get_str(token)[0]) {
   28:         case '{':
   29:             parser->brace_count++;
   30:             break;
   31:         case '}':
   32:             parser->brace_count--;
   33:             break;
   34:         case '[':
   35:             parser->bracket_count++;
   36:             break;
   37:         case ']':
   38:             parser->bracket_count--;
   39:             break;
   40:         default:
   41:             break;
   42:         }
   43:     }
   44: 
   45:     dict = qdict_new();
   46:     qdict_put_obj(dict, "type", QOBJECT(qint_from_int(type)));
   47:     QINCREF(token);
   48:     qdict_put_obj(dict, "token", QOBJECT(token));
   49:     qdict_put_obj(dict, "x", QOBJECT(qint_from_int(x)));
   50:     qdict_put_obj(dict, "y", QOBJECT(qint_from_int(y)));
   51: 
   52:     qlist_append(parser->tokens, dict);
   53: 
   54:     if (parser->brace_count == 0 &&
   55:         parser->bracket_count == 0) {
   56:         parser->emit(parser, parser->tokens);
   57:         QDECREF(parser->tokens);
   58:         parser->tokens = qlist_new();
   59:     }
   60: }
   61: 
   62: void json_message_parser_init(JSONMessageParser *parser,
   63:                               void (*func)(JSONMessageParser *, QList *))
   64: {
   65:     parser->emit = func;
   66:     parser->brace_count = 0;
   67:     parser->bracket_count = 0;
   68:     parser->tokens = qlist_new();
   69: 
   70:     json_lexer_init(&parser->lexer, json_message_process_token);
   71: }
   72: 
   73: int json_message_parser_feed(JSONMessageParser *parser,
   74:                              const char *buffer, size_t size)
   75: {
   76:     return json_lexer_feed(&parser->lexer, buffer, size);
   77: }
   78: 
   79: int json_message_parser_flush(JSONMessageParser *parser)
   80: {
   81:     return json_lexer_flush(&parser->lexer);
   82: }
   83: 
   84: void json_message_parser_destroy(JSONMessageParser *parser)
   85: {
   86:     json_lexer_destroy(&parser->lexer);
   87:     QDECREF(parser->tokens);
   88: }

unix.superglobalmegacorp.com