C-API change yang_print: print top-level and add pretty-print parameter
Test: Fix valgrind dlclose suppresion
This commit is contained in:
parent
05372c86fc
commit
e27336e054
8 changed files with 92 additions and 40 deletions
|
|
@ -387,19 +387,28 @@ show_yang(clicon_handle h,
|
||||||
cvec *cvv,
|
cvec *cvv,
|
||||||
cvec *argv)
|
cvec *argv)
|
||||||
{
|
{
|
||||||
|
int retval = -1;
|
||||||
yang_stmt *yn;
|
yang_stmt *yn;
|
||||||
char *str = NULL;
|
char *str = NULL;
|
||||||
yang_stmt *yspec;
|
yang_stmt *yspec;
|
||||||
|
|
||||||
yspec = clicon_dbspec_yang(h);
|
yspec = clicon_dbspec_yang(h);
|
||||||
if (cvec_len(argv) > 0){
|
if (cvec_len(argv) > 0){
|
||||||
str = cv_string_get(cvec_i(argv, 0));
|
if ((str = cv_string_get(cvec_i(argv, 0))) != NULL &&
|
||||||
yn = yang_find(yspec, 0, str);
|
(yn = yang_find(yspec, 0, str)) != NULL)
|
||||||
|
if (yang_print_cb(stdout, yn, cligen_output) < 0)
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
else
|
else{
|
||||||
yn = yspec;
|
yn = NULL;
|
||||||
yang_print_cb(stdout, yn, cligen_output); /* Doesnt use cligen_output */
|
while ((yn = yn_each(yspec, yn)) != NULL) {
|
||||||
return 0;
|
if (yang_print_cb(stdout, yn, cligen_output) < 0)
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
retval = 0;
|
||||||
|
done:
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! Common internal show routine for several show cli callbacks
|
/*! Common internal show routine for several show cli callbacks
|
||||||
|
|
|
||||||
|
|
@ -261,7 +261,7 @@ yang_stmt *yang_choice(yang_stmt *y);
|
||||||
int yang_order(yang_stmt *y);
|
int yang_order(yang_stmt *y);
|
||||||
int yang_print_cb(FILE *f, yang_stmt *yn, clicon_output_cb *fn);
|
int yang_print_cb(FILE *f, yang_stmt *yn, clicon_output_cb *fn);
|
||||||
int yang_print(FILE *f, yang_stmt *yn);
|
int yang_print(FILE *f, yang_stmt *yn);
|
||||||
int yang_print_cbuf(cbuf *cb, yang_stmt *yn, int marginal);
|
int yang_print_cbuf(cbuf *cb, yang_stmt *yn, int marginal, int pretty);
|
||||||
int yang_deviation(yang_stmt *ys, void *arg);
|
int yang_deviation(yang_stmt *ys, void *arg);
|
||||||
int yang_spec_print(FILE *f, yang_stmt *yspec);
|
int yang_spec_print(FILE *f, yang_stmt *yspec);
|
||||||
int yang_spec_dump(yang_stmt *yspec, int debuglevel);
|
int yang_spec_dump(yang_stmt *yspec, int debuglevel);
|
||||||
|
|
|
||||||
|
|
@ -721,7 +721,6 @@ json_metadata_encoding(cbuf *cb,
|
||||||
* @param[in] xp XML node, parent of xa
|
* @param[in] xp XML node, parent of xa
|
||||||
* @param[in] yp Yang spec of xp
|
* @param[in] yp Yang spec of xp
|
||||||
* @param[in] level Indentation level
|
* @param[in] level Indentation level
|
||||||
* @param[in] level Indentation level
|
|
||||||
* @param[in] pretty Pretty-print output (2 means debug)
|
* @param[in] pretty Pretty-print output (2 means debug)
|
||||||
* @param[in] modname Name of yang module
|
* @param[in] modname Name of yang module
|
||||||
* @param[in,out] metacb Encode into cbuf
|
* @param[in,out] metacb Encode into cbuf
|
||||||
|
|
|
||||||
|
|
@ -742,8 +742,10 @@ clixon_xml_parse_file(FILE *fp,
|
||||||
* @code
|
* @code
|
||||||
* cxobj *xt = NULL;
|
* cxobj *xt = NULL;
|
||||||
* cxobj *xerr = NULL;
|
* cxobj *xerr = NULL;
|
||||||
* if (clixon_xml_parse_string(str, YB_MODULE, yspec, &xt, &xerr) < 0)
|
* if ((ret = clixon_xml_parse_string(str, YB_MODULE, yspec, &xt, &xerr)) < 0)
|
||||||
* err;
|
* err;
|
||||||
|
* if (ret == 0)
|
||||||
|
* // use xerr
|
||||||
* if (xml_rootchild(xt, 0, &xt) < 0) # If you want to remove TOP
|
* if (xml_rootchild(xt, 0, &xt) < 0) # If you want to remove TOP
|
||||||
* err;
|
* err;
|
||||||
* @endcode
|
* @endcode
|
||||||
|
|
|
||||||
|
|
@ -1774,6 +1774,8 @@ quotedstring(char *s)
|
||||||
* @param[in] f File to print to.
|
* @param[in] f File to print to.
|
||||||
* @param[in] yn Yang node to print
|
* @param[in] yn Yang node to print
|
||||||
* @param[in] fn Callback to make print function
|
* @param[in] fn Callback to make print function
|
||||||
|
* @retval 0 OK
|
||||||
|
* @retval -1 Error
|
||||||
* @see yang_print_cbuf
|
* @see yang_print_cbuf
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
|
|
@ -1788,7 +1790,7 @@ yang_print_cb(FILE *f,
|
||||||
clicon_err(OE_YANG, errno, "cbuf_new");
|
clicon_err(OE_YANG, errno, "cbuf_new");
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
if (yang_print_cbuf(cb, yn, 0) < 0)
|
if (yang_print_cbuf(cb, yn, 0, 1) < 0)
|
||||||
goto done;
|
goto done;
|
||||||
(*fn)(f, "%s", cbuf_get(cb));
|
(*fn)(f, "%s", cbuf_get(cb));
|
||||||
if (cb)
|
if (cb)
|
||||||
|
|
@ -1876,9 +1878,12 @@ yang_spec_dump(yang_stmt *yspec,
|
||||||
* @param[in] cb Cligen buffer. This is where the pretty print is.
|
* @param[in] cb Cligen buffer. This is where the pretty print is.
|
||||||
* @param[in] yn Yang node to print
|
* @param[in] yn Yang node to print
|
||||||
* @param[in] marginal Tab indentation, mainly for recursion.
|
* @param[in] marginal Tab indentation, mainly for recursion.
|
||||||
|
* @param[in] pretty Pretty-print output
|
||||||
|
* @retval 0 OK
|
||||||
|
* @retval -1 Error
|
||||||
* @code
|
* @code
|
||||||
* cbuf *cb = cbuf_new();
|
* cbuf *cb = cbuf_new();
|
||||||
* yang_print_cbuf(cb, yn, 0);
|
* yang_print_cbuf(cb, yn, 0, 1);
|
||||||
* // output is in cbuf_buf(cb);
|
* // output is in cbuf_buf(cb);
|
||||||
* cbuf_free(cb);
|
* cbuf_free(cb);
|
||||||
* @endcode
|
* @endcode
|
||||||
|
|
@ -1886,31 +1891,58 @@ yang_spec_dump(yang_stmt *yspec,
|
||||||
int
|
int
|
||||||
yang_print_cbuf(cbuf *cb,
|
yang_print_cbuf(cbuf *cb,
|
||||||
yang_stmt *yn,
|
yang_stmt *yn,
|
||||||
int marginal)
|
int marginal,
|
||||||
|
int pretty)
|
||||||
{
|
{
|
||||||
yang_stmt *ys = NULL;
|
int retval = -1;
|
||||||
|
yang_stmt *ys;
|
||||||
|
enum rfc_6020 keyw;
|
||||||
|
char *arg;
|
||||||
|
|
||||||
while ((ys = yn_each(yn, ys)) != NULL) {
|
if (yn == NULL || cb == NULL){
|
||||||
if (ys->ys_keyword == Y_UNKNOWN){ /* dont print unknown - proxy for extension*/
|
clicon_err(OE_YANG, EINVAL, "cb or yn is NULL");
|
||||||
cprintf(cb, "%*s", marginal-1, "");
|
goto done;
|
||||||
}
|
|
||||||
else
|
|
||||||
cprintf(cb, "%*s%s", marginal, "", yang_key2str(ys->ys_keyword));
|
|
||||||
if (ys->ys_argument){
|
|
||||||
if (quotedstring(ys->ys_argument))
|
|
||||||
cprintf(cb, " \"%s\"", ys->ys_argument);
|
|
||||||
else
|
|
||||||
cprintf(cb, " %s", ys->ys_argument);
|
|
||||||
}
|
|
||||||
if (ys->ys_len){
|
|
||||||
cprintf(cb, " {\n");
|
|
||||||
yang_print_cbuf(cb, ys, marginal+3);
|
|
||||||
cprintf(cb, "%*s%s\n", marginal, "", "}");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
cprintf(cb, ";\n");
|
|
||||||
}
|
}
|
||||||
return 0;
|
keyw = yang_keyword_get(yn);
|
||||||
|
if (keyw == Y_UNKNOWN){ /* dont print unknown - proxy for extension*/
|
||||||
|
if (pretty)
|
||||||
|
cprintf(cb, "%*s", marginal-1, "");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if (pretty)
|
||||||
|
cprintf(cb, "%*s%s", marginal, "", yang_key2str(keyw));
|
||||||
|
else
|
||||||
|
cprintf(cb, "%s", yang_key2str(keyw));
|
||||||
|
}
|
||||||
|
arg = yang_argument_get(yn);
|
||||||
|
if (arg){
|
||||||
|
if (quotedstring(arg))
|
||||||
|
cprintf(cb, " \"%s\"", arg);
|
||||||
|
else
|
||||||
|
cprintf(cb, " %s", arg);
|
||||||
|
}
|
||||||
|
if (yang_len_get(yn)){
|
||||||
|
cprintf(cb, " {");
|
||||||
|
if (pretty)
|
||||||
|
cprintf(cb, "\n");
|
||||||
|
ys = NULL;
|
||||||
|
while ((ys = yn_each(yn, ys)) != NULL) {
|
||||||
|
if (yang_print_cbuf(cb, ys, marginal + PRETTYPRINT_INDENT, pretty) < 0)
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
if (pretty)
|
||||||
|
cprintf(cb, "%*s%s\n", marginal, "", "}");
|
||||||
|
else
|
||||||
|
cprintf(cb, "}");
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
cprintf(cb, ";");
|
||||||
|
if (pretty)
|
||||||
|
cprintf(cb, "\n");
|
||||||
|
}
|
||||||
|
retval = 0;
|
||||||
|
done:
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! Yang deviation/deviate
|
/*! Yang deviation/deviate
|
||||||
|
|
|
||||||
|
|
@ -918,11 +918,11 @@ yang_parse_find_match(clicon_handle h,
|
||||||
uint32_t *revactual,
|
uint32_t *revactual,
|
||||||
cbuf *fbuf)
|
cbuf *fbuf)
|
||||||
{
|
{
|
||||||
int retval = -1;
|
int retval = -1;
|
||||||
cbuf *regex = NULL;
|
cbuf *regex = NULL;
|
||||||
cxobj *x;
|
cxobj *x;
|
||||||
cxobj *xc;
|
cxobj *xc;
|
||||||
char *dir;
|
char *dir;
|
||||||
cvec *cvv = NULL;
|
cvec *cvv = NULL;
|
||||||
cg_var *cv = NULL;
|
cg_var *cv = NULL;
|
||||||
cg_var *bestcv = NULL;
|
cg_var *bestcv = NULL;
|
||||||
|
|
@ -961,6 +961,8 @@ yang_parse_find_match(clicon_handle h,
|
||||||
*/
|
*/
|
||||||
if (ndp != 0){
|
if (ndp != 0){
|
||||||
cprintf(fbuf, "%s/%s", dir, dp[ndp-1].d_name);
|
cprintf(fbuf, "%s/%s", dir, dp[ndp-1].d_name);
|
||||||
|
if (dp)
|
||||||
|
free(dp);
|
||||||
retval = 1;
|
retval = 1;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -106,7 +106,7 @@ EOF
|
||||||
fi
|
fi
|
||||||
for modstate in true false; do
|
for modstate in true false; do
|
||||||
if $modstate; then
|
if $modstate; then
|
||||||
modstatestr="<yang-library xmlns=\"urn:example:a\"><module-set><name>default</name><content-id>42</content-id><module><name>A</name><revision>2016-01-01</revision><namespace>urn:example:a</namespace></module></module-set></yang-library>"
|
modstatestr="<yang-library xmlns=\"urn:ietf:params:xml:ns:yang:ietf-yang-library\"><module-set><name>default</name><content-id>42</content-id><module><name>A</name><revision>2016-01-01</revision><namespace>urn:example:a</namespace></module></module-set></yang-library>"
|
||||||
# modstatestr="<modules-state xmlns=\"urn:example:a\"><module-set-id>42</module-set-id><module><name>A</name><revision>2016-01-01</revision><namespace>urn:example:a</namespace></module></modules-state>"
|
# modstatestr="<modules-state xmlns=\"urn:example:a\"><module-set-id>42</module-set-id><module><name>A</name><revision>2016-01-01</revision><namespace>urn:example:a</namespace></module></modules-state>"
|
||||||
else
|
else
|
||||||
modstatestr=""
|
modstatestr=""
|
||||||
|
|
|
||||||
|
|
@ -50,4 +50,12 @@
|
||||||
fun:*
|
fun:*
|
||||||
fun:*
|
fun:*
|
||||||
fun:_dl_map_object
|
fun:_dl_map_object
|
||||||
}
|
}
|
||||||
|
{
|
||||||
|
supp8
|
||||||
|
Memcheck:Leak
|
||||||
|
match-leak-kinds: reachable
|
||||||
|
fun:*
|
||||||
|
fun:*
|
||||||
|
fun:_dl_close_worker
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue