/*
 * 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 JSON_PARSER_INT_H
#define JSON_PARSER_INT_H

#include "qapi/qmp/json-parser.h"

typedef enum json_token_type {
    JSON_ERROR = 0,             /* must be zero, see json_lexer[] */
    /* Gap for lexer states */
    JSON_LCURLY = 100,
    JSON_MIN = JSON_LCURLY,
    JSON_RCURLY,
    JSON_LSQUARE,
    JSON_RSQUARE,
    JSON_COLON,
    JSON_COMMA,
    JSON_INTEGER,
    JSON_FLOAT,
    JSON_KEYWORD,
    JSON_STRING,
    JSON_INTERP,
    JSON_END_OF_INPUT,
    JSON_MAX = JSON_END_OF_INPUT
} JSONTokenType;

typedef struct JSONToken JSONToken;

/* json-lexer.c */
void json_lexer_init(JSONLexer *lexer, bool enable_interpolation);
void json_lexer_feed(JSONLexer *lexer, const char *buffer, size_t size);
void json_lexer_flush(JSONLexer *lexer);
void json_lexer_destroy(JSONLexer *lexer);

/* json-streamer.c */
void json_message_process_token(JSONLexer *lexer, GString *input,
                                JSONTokenType type, int x, int y);

/* json-parser.c */
JSONToken *json_token(JSONTokenType type, int x, int y, GString *tokstr);
QObject *json_parser_parse(GQueue *tokens, va_list *ap, Error **errp);

#endif
