From 6e8beff0a0eb829eb4f4f55df53d97c5a9815e29 Mon Sep 17 00:00:00 2001 From: Calvin Rose Date: Mon, 3 Jun 2019 10:48:16 -0400 Subject: [PATCH] Add optional argument to parser/where to set index. DSLs that use the parser API can use this to more accurately report source location. --- src/core/parse.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/core/parse.c b/src/core/parse.c index 64127350..9b92404e 100644 --- a/src/core/parse.c +++ b/src/core/parse.c @@ -801,9 +801,15 @@ static Janet cfun_parse_flush(int32_t argc, Janet *argv) { } static Janet cfun_parse_where(int32_t argc, Janet *argv) { - janet_fixarity(argc, 1); + janet_arity(argc, 1, 2); JanetParser *p = janet_getabstract(argv, 0, &janet_parse_parsertype); - return janet_wrap_integer(p->offset); + if (argc > 1) { + int32_t offset = janet_getinteger(argv, 1); + p->offset = offset; + return argv[0]; + } else { + return janet_wrap_integer(p->offset); + } } static Janet cfun_parse_state(int32_t argc, Janet *argv) { @@ -921,10 +927,10 @@ static const JanetReg parse_cfuns[] = { }, { "parser/where", cfun_parse_where, - JDOC("(parser/where parser)\n\n" + JDOC("(parser/where parser &opt offset)\n\n" "Returns the current line number and column number of the parser's location " - "in the byte stream as a tuple (line, column). Lines and columns are counted from " - "1, (the first byte is line 1, column 1) and a newline is considered ASCII 0x0A.") + "in the byte stream as an index, counted from 0. " + "If offset is supplied, then the byte offset is updated to that new value.") }, { "parser/eof", cfun_parse_eof,