diff --git a/CHANGELOG.md b/CHANGELOG.md index 42c81c43..f190402e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -134,6 +134,7 @@ * [ \t] ; -\n { _YA->ya_linenum++; } -\r +\n { _YA->ya_linenum++; } +\r {ncname} { clixon_xml_parselval.string = strdup(yytext); return NAME; /* rather be catch-all */ @@ -133,6 +133,10 @@ ncname {namestart}{namechar}* "\< { BEGIN(START); return *clixon_xml_parsetext; } & { _YA->ya_lex_state =STATEA;BEGIN(AMPERSAND);} +[ \t] { clixon_xml_parselval.string = yytext;return WHITESPACE; } +\r\n { clixon_xml_parselval.string = "\n";return WHITESPACE; } +\r { clixon_xml_parselval.string = "\n";return WHITESPACE; } +\n { clixon_xml_parselval.string = yytext; _YA->ya_linenum++;return WHITESPACE; } . { clixon_xml_parselval.string = yytext; return CHARDATA; } /* @see xml_chardata_encode */ diff --git a/lib/src/clixon_xml_parse.y b/lib/src/clixon_xml_parse.y index 9e2eafaa..f9f26126 100644 --- a/lib/src/clixon_xml_parse.y +++ b/lib/src/clixon_xml_parse.y @@ -41,7 +41,7 @@ %start document -%token NAME CHARDATA STRING +%token NAME CHARDATA WHITESPACE STRING %token MY_EOF %token VER ENC SD %token BSLASH ESLASH @@ -357,12 +357,13 @@ prolog : xmldcl misclist ; misclist : misclist misc { clicon_debug(2, "misclist->misclist misc"); } - | { clicon_debug(2, "misclist->"); } + | { clicon_debug(2, "misclist->"); } ; /* [27] Misc ::= Comment | PI | S */ -misc : comment { clicon_debug(2, "misc->comment"); } - | pi { clicon_debug(2, "misc->pi"); } +misc : comment { clicon_debug(2, "misc->comment"); } + | pi { clicon_debug(2, "misc->pi"); } + | WHITESPACE { clicon_debug(2, "misc->white space"); } ; xmldcl : BXMLDCL verinfo encodingdecl sddecl EQMARK @@ -424,6 +425,8 @@ content : element { clicon_debug(2, "content -> element"); } | pi { clicon_debug(2, "content -> pi"); } | CHARDATA { if (xml_parse_content(_YA, $1) < 0) YYABORT; clicon_debug(2, "content -> CHARDATA %s", $1); } + | WHITESPACE { if (xml_parse_content(_YA, $1) < 0) YYABORT; + clicon_debug(2, "content -> WHITESPACE %s", $1); } | { clicon_debug(2, "content -> "); } ; diff --git a/test/test_xml.sh b/test/test_xml.sh index 6416e29f..170c4d92 100755 --- a/test/test_xml.sh +++ b/test/test_xml.sh @@ -3,14 +3,20 @@ # @see https://www.w3.org/TR/2008/REC-xml-20081126 # https://www.w3.org/TR/2009/REC-xml-names-20091208 #PROG="valgrind --leak-check=full --show-leak-kinds=all ../util/clixon_util_xml" -PROG=../util/clixon_util_xml + # include err() and new() functions and creates $dir . ./lib.sh + +PROG="../util/clixon_util_xml -D $DBG" + new "xml parse" expecteof "$PROG" 0 "" "^$" +new "xml parse to json" +expecteof "$PROG -j" 0 "" '^{"a": {"b": null}}$' + new "xml parse strange names" expecteof "$PROG" 0 "<_->" "^<_->$" @@ -23,6 +29,14 @@ expecteof "$PROG" 255 "<9/>" "" new "xml parse name errors" expecteof "$PROG" 255 "" "" +LF=' +' +new "xml parse content with CR LF -> LF, CR->LF (see https://www.w3.org/TR/REC-xml/#sec-line-ends)" +ret=$(echo "a b${LF}c ${LF}d" | $PROG) +if [ "$ret" != "a${LF}b${LF}c${LF}d" ]; then + err 'a$LFb$LFc' "$ret" +fi + XML=$(cat <An example of escaped CENDs @@ -38,6 +52,7 @@ XML=$(cat < EOF ) + new "xml CDATA" expecteof "$PROG" 0 "$XML" "^An example of escaped CENDs y\" so I guess that means that z > x ]]> diff --git a/util/clixon_util_xml.c b/util/clixon_util_xml.c index 8b3e3fa6..c21091c4 100644 --- a/util/clixon_util_xml.c +++ b/util/clixon_util_xml.c @@ -72,6 +72,7 @@ usage(char *argv0) "where options are\n" "\t-h \t\tHelp\n" "\t-D \tDebug\n" + "\t-j \tOutput as JSON\n" "\t-l \tLog on (s)yslog, std(e)rr, std(o)ut (stderr is default)\n", argv0); exit(0); @@ -87,10 +88,11 @@ main(int argc, int retval = -1; int c; int logdst = CLICON_LOG_STDERR; + int json = 0; optind = 1; opterr = 0; - while ((c = getopt(argc, argv, "hD:l:")) != -1) + while ((c = getopt(argc, argv, "hD:jl:")) != -1) switch (c) { case 'h': usage(argv[0]); @@ -99,6 +101,9 @@ main(int argc, if (sscanf(optarg, "%d", &debug) != 1) usage(argv[0]); break; + case 'j': + json++; + break; case 'l': /* Log destination: s|e|o|f */ if ((logdst = clicon_log_opt(optarg[0])) < 0) usage(argv[0]); @@ -114,7 +119,10 @@ main(int argc, } xc = NULL; while ((xc = xml_child_each(xt, xc, -1)) != NULL) - clicon_xml2cbuf(cb, xc, 0, 0); /* print xml */ + if (json) + xml2json_cbuf(cb, xc, 0); /* print xml */ + else + clicon_xml2cbuf(cb, xc, 0, 0); /* print xml */ fprintf(stdout, "%s", cbuf_get(cb)); fflush(stdout); #if 0