59 lines
1.9 KiB
C
59 lines
1.9 KiB
C
#include "include/conf.h"
|
|
|
|
#include "include/temple-expr.h"
|
|
#include "include/temple-tokens.h"
|
|
#include "include/temple-parsers.h"
|
|
|
|
vw_TempleASTNode *vw_TempleParser_parse_comment(vs_Logger *logger,
|
|
const char *input,
|
|
const char *end,
|
|
const char **readp) {
|
|
if (!logger || !input || !end || !readp || !*readp) {
|
|
return NULL;
|
|
}
|
|
|
|
const char *comment_start = *readp + 2; /* skip {# */
|
|
const char *comment_end = vw_Temple_lex_find_end(comment_start, end, "#}", 2);
|
|
|
|
if (!comment_end) {
|
|
vs_flog_error(logger,
|
|
"Error: Unterminated comment at position %zu. Expected '#}'",
|
|
(size_t)(*readp - input));
|
|
return NULL;
|
|
}
|
|
|
|
vw_TempleASTNode *node = vw_TempleASTNode_new_comment(comment_start, comment_end);
|
|
if (!node) {
|
|
return NULL;
|
|
}
|
|
*readp = comment_end + 2; /* skip #} */
|
|
|
|
return node;
|
|
}
|
|
|
|
vw_TempleASTNode *vw_TempleParser_parse_output(vs_Logger *logger,
|
|
const char *input,
|
|
const char *end,
|
|
const char **readp) {
|
|
if (!logger || !input || !end || !readp || !*readp) {
|
|
return NULL;
|
|
}
|
|
|
|
const char *expr_start = *readp + 2; /* skip {{ */
|
|
const char *expr_end = vw_Temple_lex_find_end(expr_start, end, "}}", 2);
|
|
|
|
if (!expr_end) {
|
|
vs_flog_error(logger,
|
|
"Error: Unterminated output expression at position %zu. Expected '}}'",
|
|
(size_t)(*readp - input));
|
|
return NULL;
|
|
}
|
|
|
|
vw_TempleASTNode *node = vw_TempleParser_parse_expr(logger, expr_start, expr_end);
|
|
if (!node) {
|
|
return NULL;
|
|
}
|
|
*readp = expr_end + 2; /* skip }} */
|
|
|
|
return node;
|
|
}
|