diff options
author | liquidaty <info@liquidaty.com> | 2023-07-07 15:06:19 +0200 |
---|---|---|
committer | Nicolas Williams <nico@cryptonector.com> | 2023-07-09 21:27:08 -0500 |
commit | 80e9bea3a82401391d0cba65b7a5d08932f0422e (patch) | |
tree | 392a107d3659fc6fa3f11f26de40bba551760d4c | |
parent | b2e7eaff9980bdbaeec9ba5b226ffeab31fdd371 (diff) |
Add --strip-comments optionpull/2548/head
-rw-r--r-- | Makefile.am | 5 | ||||
-rw-r--r-- | src/jv.h | 1 | ||||
-rw-r--r-- | src/jv_parse.c | 7 | ||||
-rw-r--r-- | src/main.c | 5 | ||||
-rwxr-xr-x | tests/commenttest | 15 |
5 files changed, 25 insertions, 8 deletions
diff --git a/Makefile.am b/Makefile.am index 247352f0..fc63dd0f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -132,7 +132,7 @@ endif ### Tests (make check) -TESTS = tests/optionaltest tests/mantest tests/jqtest tests/onigtest tests/shtest tests/utf8test tests/base64test +TESTS = tests/optionaltest tests/mantest tests/jqtest tests/onigtest tests/shtest tests/utf8test tests/base64test tests/commenttest TESTS_ENVIRONMENT = NO_VALGRIND=$(NO_VALGRIND) # This is a magic make variable that causes it to treat tests/man.test as a @@ -215,7 +215,8 @@ EXTRA_DIST = $(DOC_FILES) $(man_MANS) $(TESTS) $(TEST_LOG_COMPILER) \ tests/optional.test tests/optionaltest \ tests/utf8-truncate.jq tests/utf8test \ tests/base64.test tests/base64test \ - tests/jq-f-test.sh tests/shtest + tests/jq-f-test.sh tests/shtest \ + tests/commenttest DISTCHECK_CONFIGURE_FLAGS=--disable-maintainer-mode --with-oniguruma=builtin @@ -223,6 +223,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 43fbc57f..5a427aca 100644 --- a/src/jv_parse.c +++ b/src/jv_parse.c @@ -626,7 +626,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; @@ -676,11 +675,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; } @@ -81,6 +81,7 @@ static void usage(int code, int keep_it_short) { " -M monochrome (don't colorize JSON);\n" " -S sort keys of objects on output;\n" " --tab use tabs for indentation;\n" + " --strip-comments accept and strip comments from input;\n" " --arg a v set variable $a to value <v>;\n" " --argjson a v set variable $a to JSON value <v>;\n" " --slurpfile a f set variable $a to an array of JSON texts read from <f>;\n" @@ -454,6 +455,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_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 |