diff --git a/CHANGELOG.md b/CHANGELOG.md index 898854f7..2e7b8d51 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ ### Minor changes: * CDATA xml support (patch by David Cornejo, Netgate) + * Encode and decode (parsing) support * Validation of yang bits type space-separated list value * Added -U command line to clixon_cli and clixon_netconf for NACM pseudo-user tests * Added a generated CLI show command that works on the generated parse tree with auto completion. diff --git a/apps/cli/cli_generate.c b/apps/cli/cli_generate.c index f387cdf7..dc1cbca3 100644 --- a/apps/cli/cli_generate.c +++ b/apps/cli/cli_generate.c @@ -243,6 +243,8 @@ yang2cli_var_sub(clicon_handle h, if ((id=strchr(name, ':')) != NULL) *id = '\0'; cprintf(cb, "%s:%s", name, id+1); + if (name) + free(name); } } } diff --git a/lib/src/clixon_string.c b/lib/src/clixon_string.c index 1f0db0cc..2386d561 100644 --- a/lib/src/clixon_string.c +++ b/lib/src/clixon_string.c @@ -297,31 +297,56 @@ xml_chardata_encode(char *str, int l; int len; int i, j; + int cdata; /* when set, skip encoding */ - len = 0; + /* First compute length (do nothing) */ + len = 0; cdata = 0; for (i=0; i': - len += strlen("> "); - break; - default: + if (cdata){ + if (strncmp(&str[i], "]]>", strlen("]]>")) == 0) + cdata = 0; len++; } + else + switch (str[i]){ + case '&': + len += strlen("& "); + break; + case '<': + if (strncmp(&str[i], "': + len += strlen("> "); + break; + default: + len++; + } } len++; /* trailing \0 */ + /* We know length, allocate encoding buffer */ if ((esc = malloc(len)) == NULL){ clicon_err(OE_UNIX, errno, "malloc"); goto done; } memset(esc, 0, len); - j = 0; + + /* Same code again, but now actually encode into output buffer */ + j = 0; cdata = 0; for (i=0; i", strlen("]]>")) == 0){ + cdata = 0; + esc[j++] = str[i++]; + esc[j++] = str[i++]; + } + esc[j++] = str[i]; + } + else switch (str[i]){ case '&': if ((l=snprintf(&esc[j], 7, "& ")) < 0){ @@ -331,6 +356,11 @@ xml_chardata_encode(char *str, j += l; break; case '<': + if (strncmp(&str[i], """