/*
 * 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_MARKDOWN_H
#define PARSE_MARKDOWN_H 1

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

struct markdown_extra_s {
    char vspace_p;              // are we skipping vertical space?
    int bq_level;              // current number of blockquote indents
    char found_annotation_p;    // did we just find an annotation?
    char* string_buf;           // non-NULL when parsing a string
    const char* filename;       // input file name, or NULL for stdin
    FILE* infile;
};
typedef struct markdown_extra_s* markdown_extra_t;

// defined in parse-markdown.lex
yyscan_t parse_markdown_setup_file(markdown_extra_t, const char*);
yyscan_t parse_markdown_setup_string(markdown_extra_t, const char*, size_t);
void parse_markdown_finish(markdown_extra_t, yyscan_t);
int markdownlex(YYSTYPE* lvalp, YYLTYPE* llocp, yyscan_t scanner);
int markdownget_lineno(yyscan_t);

// defined in parse-markdown.y
int markdownparse(markdown_extra_t, s7_pointer* parse_result, s7_pointer metadata,
                  s7_pointer input_source,
                  yyscan_t scanner);

#endif /* PARSE_MARKDOWN_H */
