/*
 * This file is part of Beastie <https://purl.org/nxg/dist/beastie>
 * SPDX-FileCopyrightText: 2023 Norman Gray <https://nxg.me.uk>
 * SPDX-License-Identifier: BSD-2-Clause
 */

#ifndef PARSE_MDINLINE_H
#define PARSE_MDINLINE_H 1

#include <stdio.h>              // for FILE*
#include "beastie.h"            // for YYSTYPE and s7_pointer
#include "yycommon.h"           // for YYLTYPE

typedef enum {
    st_none,
    st_link,
    st_em_star, st_em_uscore,
    st_strong_star, st_strong_uscore
} state_stack_t;

// the following should be big enough -- if we overflow, we just discard state
#define MDINLINE_LEXER_STACK_SIZE 8
struct mdinline_extra_s {
    state_stack_t state_stack[MDINLINE_LEXER_STACK_SIZE];
    int stack_depth;
    const char* input_source;
    int initial_line_number;
    void* yyscanbuf;            // cast from YY_BUFFER_STATE
};
typedef struct mdinline_extra_s* mdinline_extra_t;

// defined in parse-mdinline.lex
yyscan_t parse_mdinline_setup_string(mdinline_extra_t extra,
                                     const char* input_source,
                                     const int initial_line_number,
                                     const char*);
void parse_mdinline_finish(mdinline_extra_t, yyscan_t);
int mdinlinelex(YYSTYPE* lvalp, YYLTYPE* ignored, yyscan_t scanner);

// defined in parse-mdinline.y
int mdinlineparse(mdinline_extra_t, s7_pointer* parse_result, s7_pointer metadata, yyscan_t scanner);

#endif /* PARSE_MDINLINE_H */
