aboutsummaryrefslogtreecommitdiff
path: root/vm.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2020-12-14 22:01:50 -0800
committerBruce Hill <bruce@bruce-hill.com>2020-12-14 22:01:50 -0800
commit2fb68fa97f096e5bd0f3ff81d31c3bc61719ae8a (patch)
tree5fc08368fed465d88b115b7dd75f309cec010806 /vm.c
parente638a517bfe60af1975d793bfbfda4d64428d15f (diff)
Moved json code into its own file
Diffstat (limited to 'vm.c')
-rw-r--r--vm.c43
1 files changed, 2 insertions, 41 deletions
diff --git a/vm.c b/vm.c
index e754a62..6d40507 100644
--- a/vm.c
+++ b/vm.c
@@ -4,9 +4,10 @@
#include <ctype.h>
-#include "vm.h"
#include "grammar.h"
+#include "types.h"
#include "utils.h"
+#include "vm.h"
static match_t *match_backref(const char *str, vm_op_t *op, match_t *m, unsigned int flags);
static size_t push_backrefs(grammar_t *g, match_t *m);
@@ -592,46 +593,6 @@ void print_match(file_t *f, match_t *m, print_options_t options)
_print_match(f, m, &state, options);
}
-/*
- * Print a match as JSON
- */
-static int _json_match(FILE *f, const char *text, match_t *m, int comma, int verbose)
-{
- if (!verbose) {
- if (m->op->op != VM_REF) {
- for (match_t *child = m->child; child; child = child->nextsibling) {
- comma |= _json_match(f, text, child, comma, verbose);
- }
- return comma;
- }
- }
-
- if (comma) fprintf(f, ",\n");
- comma = 0;
- fprintf(f, "{\"rule\":\"");
- for (const char *c = m->op->start; c < m->op->end; c++) {
- switch (*c) {
- case '"': fprintf(f, "\\\""); break;
- case '\\': fprintf(f, "\\\\"); break;
- case '\t': fprintf(f, "\\t"); break;
- case '\n': fprintf(f, "↵"); break;
- default: fprintf(f, "%c", *c); break;
- }
- }
- fprintf(f, "\",\"start\":%ld,\"end\":%ld,\"children\":[",
- m->start - text, m->end - text);
- for (match_t *child = m->child; child; child = child->nextsibling) {
- comma |= _json_match(f, text, child, comma, verbose);
- }
- fprintf(f, "]}");
- return 1;
-}
-
-void json_match(FILE *f, const char *text, match_t *m, int verbose)
-{
- _json_match(f, text, m, 0, verbose);
-}
-
static match_t *match_backref(const char *str, vm_op_t *op, match_t *cap, unsigned int flags)
{
check(op->op == VM_BACKREF, "Attempt to match backref against something that's not a backref");