* Added PRETTYPRINT_INDENT compile-time option controlling indentation level for XML,JSON and TEXT

* Default value is `3`
This commit is contained in:
Olof hagsand 2022-10-31 14:20:14 +01:00
parent 1830381249
commit 56f4bb45cc
11 changed files with 73 additions and 1152 deletions

View file

@ -77,8 +77,6 @@
#include "clixon_json.h"
#include "clixon_json_parse.h"
#define JSON_INDENT 2 /* maybe we should set this programmatically? */
/* Let xml2json_cbuf_vec() return json array: [a,b].
ALternative is to create a pseudo-object and return that: {top:{a,b}}
*/
@ -731,11 +729,11 @@ json_metadata_encoding(cbuf *cb,
cprintf(cb, "%s\":", name);
if (list)
cprintf(cb, "[");
cprintf(cb, "%*s", pretty?((level+1)*JSON_INDENT):0, "{");
cprintf(cb, "%*s", pretty?((level+1)*PRETTYPRINT_INDENT):0, "{");
cprintf(cb, "\"%s:%s\":%s", modname2, name2, val);
cprintf(cb, "%*s", pretty?((level+1)*JSON_INDENT):0, "}");
cprintf(cb, "%*s", pretty?((level+1)*PRETTYPRINT_INDENT):0, "}");
if (list)
cprintf(cb, "%*s", pretty?(level*JSON_INDENT):0, "]");
cprintf(cb, "%*s", pretty?(level*PRETTYPRINT_INDENT):0, "]");
return 0;
}
@ -896,7 +894,7 @@ xml2json1_cbuf(cbuf *cb,
break;
case NO_ARRAY:
if (!flat){
cprintf(cb, "%*s\"", pretty?(level*JSON_INDENT):0, "");
cprintf(cb, "%*s\"", pretty?(level*PRETTYPRINT_INDENT):0, "");
if (modname)
cprintf(cb, "%s:", modname);
cprintf(cb, "%s\":%s", xml_name(x), pretty?" ":"");
@ -917,14 +915,14 @@ xml2json1_cbuf(cbuf *cb,
break;
case FIRST_ARRAY:
case SINGLE_ARRAY:
cprintf(cb, "%*s\"", pretty?(level*JSON_INDENT):0, "");
cprintf(cb, "%*s\"", pretty?(level*PRETTYPRINT_INDENT):0, "");
if (modname)
cprintf(cb, "%s:", modname);
cprintf(cb, "%s\":%s", xml_name(x), pretty?" ":"");
level++;
cprintf(cb, "[%s%*s",
pretty?"\n":"",
pretty?(level*JSON_INDENT):0, "");
pretty?(level*PRETTYPRINT_INDENT):0, "");
switch (childt){
case NULL_CHILD:
if (nullchild(cb, x, ys) < 0)
@ -943,7 +941,7 @@ xml2json1_cbuf(cbuf *cb,
case LAST_ARRAY:
level++;
cprintf(cb, "%*s",
pretty?(level*JSON_INDENT):0, "");
pretty?(level*PRETTYPRINT_INDENT):0, "");
switch (childt){
case NULL_CHILD:
if (nullchild(cb, x, ys) < 0)
@ -1007,7 +1005,7 @@ xml2json1_cbuf(cbuf *cb,
case ANY_CHILD:
cprintf(cb, "%s%*s}",
pretty?"\n":"",
pretty?(level*JSON_INDENT):0, "");
pretty?(level*PRETTYPRINT_INDENT):0, "");
break;
default:
break;
@ -1023,7 +1021,7 @@ xml2json1_cbuf(cbuf *cb,
case ANY_CHILD:
cprintf(cb, "%s%*s}",
pretty?"\n":"",
pretty?(level*JSON_INDENT):0, "");
pretty?(level*PRETTYPRINT_INDENT):0, "");
level--;
break;
default:
@ -1040,7 +1038,7 @@ xml2json1_cbuf(cbuf *cb,
case ANY_CHILD:
cprintf(cb, "%s%*s}",
pretty?"\n":"",
pretty?(level*JSON_INDENT):0, "");
pretty?(level*PRETTYPRINT_INDENT):0, "");
cprintf(cb, "%s",pretty?"\n":"");
level--;
break;
@ -1048,7 +1046,7 @@ xml2json1_cbuf(cbuf *cb,
break;
}
cprintf(cb, "%*s]",
pretty?(level*JSON_INDENT):0,"");
pretty?(level*PRETTYPRINT_INDENT):0,"");
break;
default:
break;
@ -1095,7 +1093,7 @@ xml2json_cbuf1(cbuf *cb,
goto ok;
}
cprintf(cb, "%*s{%s",
pretty?level*JSON_INDENT:0,"",
pretty?level*PRETTYPRINT_INDENT:0,"",
pretty?"\n":"");
if (y != NULL){
@ -1120,7 +1118,7 @@ xml2json_cbuf1(cbuf *cb,
goto done;
cprintf(cb, "%s%*s}%s",
pretty?"\n":"",
pretty?level*JSON_INDENT:0,"",
pretty?level*PRETTYPRINT_INDENT:0,"",
pretty?"\n":"");
ok:
retval = 0;
@ -1239,11 +1237,7 @@ xml2json_cbuf_vec(cbuf *cb,
if (xml2json1_cbuf(cb,
xp,
NO_ARRAY,
#if 1
level,
#else
level+1,
#endif
pretty,
1, NULL, NULL) < 0)
goto done;

View file

@ -71,8 +71,11 @@
/* Size of json read buffer when reading from file*/
#define BUFLEN 1024
/* Name of xml top object created by parse functions */
#define TOP_SYMBOL "top"
/* Name of xml top object created by parse functions
* See also DATASTORE_TOP_SYMBOL which is the clixon datastore top symbol. By default also config
*/
#define TEXT_TOP_SYMBOL "top"
/*! x is element and has eactly one child which in turn has none
* @see child_type in clixon_json.c
@ -100,7 +103,7 @@ tleaf(cxobj *x)
* @param[in] xn XML object to print
* @param[in] fn Callback to make print function
* @param[in] f File to print to
* @param[in] level Print 4 spaces per level in front of each line
* @param[in] level Print PRETTYPRINT_INDENT spaces per level in front of each line
* @param[in] autocliext How to handle autocli extensions: 0: ignore 1: follow
* @param[in,out] leafl Leaflist state for keeping track of when [] ends
* @param[in,out] leaflname Leaflist state for []
@ -171,7 +174,7 @@ xml2txt1(cxobj *xn,
else{
*leafl = 0;
*leaflname = NULL;
(*fn)(f, "%*s\n", 4*(level), "]");
(*fn)(f, "%*s\n", PRETTYPRINT_INDENT*(level), "]");
}
}
xc = NULL; /* count children (elements and bodies, not attributes) */
@ -191,13 +194,13 @@ xml2txt1(cxobj *xn,
else
cprintf(cb, "%s", value);
if (*leafl) /* Skip keyword if leaflist */
(*fn)(f, "%*s%s\n", 4*level, "", cbuf_get(cb));
(*fn)(f, "%*s%s\n", PRETTYPRINT_INDENT*level, "", cbuf_get(cb));
else
(*fn)(f, "%s;\n", cbuf_get(cb));
break;
}
case CX_ELMNT:
(*fn)(f, "%*s%s", 4*level, "", xml_name(xn));
(*fn)(f, "%*s%s", PRETTYPRINT_INDENT*level, "", xml_name(xn));
cvi = NULL; /* Lists only */
while ((cvi = cvec_each(cvk, cvi)) != NULL) {
if ((xc = xml_find_type(xn, NULL, cv_string_get(cvi), CX_ELMNT)) != NULL)
@ -211,7 +214,7 @@ xml2txt1(cxobj *xn,
goto ok;
}
if (*leafl == 0){
(*fn)(f, "%*s", 4*level, "");
(*fn)(f, "%*s", PRETTYPRINT_INDENT*level, "");
#ifndef TEXT_SYNTAX_NOPREFIX
if (prefix)
(*fn)(f, "%s:", prefix);
@ -247,10 +250,10 @@ xml2txt1(cxobj *xn,
/* Stop leaf-list printing (ie []) if no longer leaflist and same name */
if (yn && yang_keyword_get(yn) != Y_LEAF_LIST && *leafl != 0){
*leafl = 0;
(*fn)(f, "%*s\n", 4*(level+1), "]");
(*fn)(f, "%*s\n", PRETTYPRINT_INDENT*(level+1), "]");
}
if (!tleaf(xn))
(*fn)(f, "%*s}\n", 4*level, "");
(*fn)(f, "%*s}\n", PRETTYPRINT_INDENT*level, "");
ok:
retval = 0;
done:
@ -263,7 +266,7 @@ xml2txt1(cxobj *xn,
*
* @param[in] f File to print to
* @param[in] xn XML object to print
* @param[in] level Print 4 spaces per level in front of each line
* @param[in] level Print PRETTYPRINT_INDENT spaces per level in front of each line
* @param[in] fn File print function (if NULL, use fprintf)
* @param[in] skiptop 0: Include top object 1: Skip top-object, only children,
* @param[in] autocliext How to handle autocli extensions: 0: ignore 1: follow
@ -563,7 +566,7 @@ clixon_text_syntax_parse_file(FILE *fp,
textbuf[len++] = ch;
if (ret == 0){
if (*xt == NULL)
if ((*xt = xml_new(TOP_SYMBOL, NULL, CX_ELMNT)) == NULL)
if ((*xt = xml_new(TEXT_TOP_SYMBOL, NULL, CX_ELMNT)) == NULL)
goto done;
if (len){
if ((ret = _text_syntax_parse(ptr, yb, yspec, *xt, xerr)) < 0)

View file

@ -80,8 +80,6 @@
*/
/* Size of xml read buffer */
#define BUFLEN 1024
/* Indentation for xml pretty-print. Consider option? */
#define XML_INDENT 3
/*------------------------------------------------------------------------
* XML printing functions. Output a parse tree to file, string cligen buf
@ -147,7 +145,7 @@ xml2file_recurse(FILE *f,
(*fn)(f, "%s=\"%s\"", name, xml_value(x));
break;
case CX_ELMNT:
(*fn)(f, "%*s<", pretty?(level*XML_INDENT):0, "");
(*fn)(f, "%*s<", pretty?(level*PRETTYPRINT_INDENT):0, "");
if (namespace)
(*fn)(f, "%s:", namespace);
(*fn)(f, "%s", name);
@ -187,7 +185,7 @@ xml2file_recurse(FILE *f,
goto done;
}
if (pretty && hasbody==0)
(*fn)(f, "%*s", level*XML_INDENT, "");
(*fn)(f, "%*s", level*PRETTYPRINT_INDENT, "");
(*fn)(f, "</");
if (namespace)
(*fn)(f, "%s:", namespace);
@ -249,7 +247,6 @@ clixon_xml2file(FILE *f,
retval = 0;
done:
return retval;
}
/*! Print an XML tree structure to an output stream
@ -356,7 +353,7 @@ clixon_xml2cbuf1(cbuf *cb,
break;
case CX_ELMNT:
if (pretty)
cprintf(cb, "%*s<", level*XML_INDENT, "");
cprintf(cb, "%*s<", level*PRETTYPRINT_INDENT, "");
else
cbuf_append_str(cb, "<");
if (namespace){
@ -396,7 +393,7 @@ clixon_xml2cbuf1(cbuf *cb,
if (clixon_xml2cbuf1(cb, xc, level+1, pretty, depth-1) < 0)
goto done;
if (pretty && hasbody == 0)
cprintf(cb, "%*s", level*XML_INDENT, "");
cprintf(cb, "%*s", level*PRETTYPRINT_INDENT, "");
cbuf_append_str(cb, "</");
if (namespace){
cbuf_append_str(cb, namespace);
@ -476,7 +473,7 @@ xmltree2cbuf(cbuf *cb,
cxobj *xc;
int i;
for (i=0; i<level*XML_INDENT; i++)
for (i=0; i<level*PRETTYPRINT_INDENT; i++)
cprintf(cb, " ");
if (xml_type(x) != CX_BODY)
cprintf(cb, "%s", xml_type2str(xml_type(x)));
@ -495,7 +492,7 @@ xmltree2cbuf(cbuf *cb,
while ((xc = xml_child_each(x, xc, -1)) != NULL)
xmltree2cbuf(cb, xc, level+1);
if (xml_child_nr(x)){
for (i=0; i<level*XML_INDENT; i++)
for (i=0; i<level*PRETTYPRINT_INDENT; i++)
cprintf(cb, " ");
cprintf(cb, "}\n");
}