summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorliquidaty <info@liquidaty.com>2023-07-07 15:06:19 +0200
committerMattias Wadman <mattias.wadman@gmail.com>2024-02-24 18:58:53 +0100
commit8b479ca229665d26a2f192289388c12a5f749a24 (patch)
tree777f4fa57e1a4adfbcd01b850b3755a91eac323e
parente659a5e5088e32400b33a4cc5b66e27c0ed1af30 (diff)
Add --strip-comments option
-rw-r--r--Makefile.am3
-rw-r--r--src/jv.h1
-rw-r--r--src/jv_parse.c7
-rw-r--r--src/main.c5
-rwxr-xr-xtests/commenttest15
5 files changed, 24 insertions, 7 deletions
diff --git a/Makefile.am b/Makefile.am
index f9594a56..4d081128 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -141,7 +141,7 @@ endif
### Tests (make check)
-TESTS = tests/mantest tests/jqtest tests/shtest tests/utf8test tests/base64test
+TESTS = tests/mantest tests/jqtest tests/shtest tests/utf8test tests/base64test tests/commenttest
if !WIN32
TESTS += tests/optionaltest
endif
@@ -233,6 +233,7 @@ EXTRA_DIST = $(DOC_FILES) $(man_MANS) $(TESTS) $(TEST_LOG_COMPILER) \
tests/setup tests/torture/input0.json \
tests/optional.test tests/man.test tests/manonig.test \
tests/jq.test tests/onig.test tests/base64.test \
+ tests/commenttest \
tests/utf8-truncate.jq tests/jq-f-test.sh \
tests/no-main-program.jq tests/yes-main-program.jq
diff --git a/src/jv.h b/src/jv.h
index 083509ec..cf9b8401 100644
--- a/src/jv.h
+++ b/src/jv.h
@@ -234,6 +234,7 @@ enum {
JV_PARSE_SEQ = 1,
JV_PARSE_STREAMING = 2,
JV_PARSE_STREAM_ERRORS = 4,
+ JV_PARSE_STRIP_COMMENTS = 8
};
jv jv_parse(const char* string);
diff --git a/src/jv_parse.c b/src/jv_parse.c
index 64eb8ad8..2f88181f 100644
--- a/src/jv_parse.c
+++ b/src/jv_parse.c
@@ -652,7 +652,6 @@ static pfunc scan_line_comment(struct jv_parser* p, char ch, jv* out) {
return OK;
}
-
static pfunc scan_c_comment_close(struct jv_parser* p, char ch, jv* out) {
if(ch == '/') {
p->scan = scan_json;
@@ -703,11 +702,7 @@ static pfunc scan_json(struct jv_parser* p, char ch, jv* out) {
presult answer = 0;
p->last_ch_was_ws = 0;
if (p->st == JV_PARSER_NORMAL) {
- if(ch == '#') {
- p->scan = scan_line_comment;
- return OK;
- }
- if(ch == '/') {
+ if(ch == '/' && (p->flags & JV_PARSE_STRIP_COMMENTS)) {
p->scan = scan_slash_comment;
return OK;
}
diff --git a/src/main.c b/src/main.c
index 83233080..73338741 100644
--- a/src/main.c
+++ b/src/main.c
@@ -94,6 +94,7 @@ static void usage(int code, int keep_it_short) {
" --stream-errors implies --stream and report parse error as\n"
" an array;\n"
" --seq parse input/output as application/json-seq;\n"
+ " --strip-comments accept and strip comments from input;\n"
" -f, --from-file file load filter from the file;\n"
" -L directory search modules from the directory;\n"
" --arg name value set $name to the string value;\n"
@@ -471,6 +472,10 @@ int main(int argc, char* argv[]) {
parser_flags |= JV_PARSE_STREAMING;
continue;
}
+ if (isoption(argv[i], 0, "strip-comments", &short_opts)) {
+ parser_flags |= JV_PARSE_STRIP_COMMENTS;
+ continue;
+ }
if (isoption(argv[i], 0, "stream-errors", &short_opts)) {
parser_flags |= JV_PARSE_STREAMING | JV_PARSE_STREAM_ERRORS;
continue;
diff --git a/tests/commenttest b/tests/commenttest
new file mode 100755
index 00000000..388f85ad
--- /dev/null
+++ b/tests/commenttest
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+. "${0%/*}/setup" "$@"
+
+if [ "$(echo '{"hi":"there"/*comment*/}' | $VALGRIND $Q $JQ --strip-comments '.hi')" != '"there"' ]; then
+ echo "C-style comment test failed"
+ exit 1
+fi
+
+if [ "$(printf '{"hi"://comment\n"there"}' | $VALGRIND $Q $JQ --strip-comments '.hi')" != '"there"' ]; then
+ echo "C++-style comment test failed"
+ exit 1
+fi
+
+exit 0