summaryrefslogtreecommitdiff
path: root/include/qobject/json-parser.h
blob: e078b36b2d57f295ce978622cfbcba8a0a36a9f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/*
 * JSON Parser
 *
 * Copyright IBM, Corp. 2009
 *
 * Authors:
 *  Anthony Liguori   <aliguori@us.ibm.com>
 *
 * 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.
 *
 */

#ifndef QAPI_QMP_JSON_PARSER_H
#define QAPI_QMP_JSON_PARSER_H

typedef struct JSONLexer {
    int start_state, state;
    GString *token;
    int cur_x, cur_y;
    int x, y;
} JSONLexer;

typedef struct JSONParserContext {
    Error *err;
    GQueue *stack;
    va_list *ap;
} JSONParserContext;

typedef struct JSONMessageParser {
    void (*emit)(void *opaque, QObject *json, Error *err);
    void *opaque;
    JSONLexer lexer;
    JSONParserContext parser;
    unsigned int brace_count;
    unsigned int bracket_count;
    unsigned int token_count;
    bool error;
    uint64_t token_size;
} JSONMessageParser;

void json_message_parser_init(JSONMessageParser *parser,
                              void (*emit)(void *opaque, QObject *json,
                                           Error *err),
                              void *opaque, va_list *ap);

void json_message_parser_feed(JSONMessageParser *parser,
                             const char *buffer, size_t size);

void json_message_parser_flush(JSONMessageParser *parser);

void json_message_parser_destroy(JSONMessageParser *parser);

#endif