/*
 * 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
