* Yang parser is stricter (see cardinality below) which may break parsing of slack yang specs.
* YANG parser cardinality checked (only modules level yet) * See https://github.com/clicon/clixon/issues/48
This commit is contained in:
parent
9c57902b96
commit
a8f0aad411
28 changed files with 159 additions and 47 deletions
|
|
@ -70,6 +70,7 @@ SRC = clixon_sig.c clixon_log.c clixon_err.c clixon_event.c \
|
|||
clixon_string.c clixon_handle.c \
|
||||
clixon_xml.c clixon_xml_sort.c clixon_xml_map.c clixon_file.c \
|
||||
clixon_json.c clixon_yang.c clixon_yang_type.c clixon_yang_module.c \
|
||||
clixon_yang_cardinality.c \
|
||||
clixon_hash.c clixon_options.c clixon_plugin.c \
|
||||
clixon_proto.c clixon_proto_client.c \
|
||||
clixon_xpath.c clixon_xpath_ctx.c clixon_sha1.c \
|
||||
|
|
|
|||
|
|
@ -76,12 +76,17 @@
|
|||
#include "clixon_options.h"
|
||||
#include "clixon_yang_type.h"
|
||||
#include "clixon_yang_parse.h"
|
||||
#include "clixon_yang_cardinality.h"
|
||||
|
||||
/* Size of json read buffer when reading from file*/
|
||||
#define BUFLEN 1024
|
||||
|
||||
/*
|
||||
* Local variables
|
||||
*/
|
||||
/* Mapping between yang keyword string <--> clicon constants */
|
||||
static const map_str2int ykmap[] = {
|
||||
{"anydata", Y_ANYDATA},
|
||||
{"anyxml", Y_ANYXML},
|
||||
{"argument", Y_ARGUMENT},
|
||||
{"augment", Y_AUGMENT},
|
||||
|
|
@ -393,9 +398,11 @@ yn_each(yang_node *yn,
|
|||
* @param[in] yn Yang node, current context node.
|
||||
* @param[in] keyword if 0 match any keyword
|
||||
* @param[in] argument String compare w argument. if NULL, match any.
|
||||
* @retval ys Yang statement, if any
|
||||
* This however means that if you actually want to match only a yang-stmt with
|
||||
* argument==NULL you cannot, but I have not seen any such examples.
|
||||
* @see yang_find_datanode
|
||||
* @see yang_match returns number of matches
|
||||
*/
|
||||
yang_stmt *
|
||||
yang_find(yang_node *yn,
|
||||
|
|
@ -420,6 +427,38 @@ yang_find(yang_node *yn,
|
|||
}
|
||||
return match ? ys : NULL;
|
||||
}
|
||||
|
||||
/*! Count number of children that matches keyword and argument
|
||||
*
|
||||
* @param[in] yn Yang node, current context node.
|
||||
* @param[in] keyword if 0 match any keyword
|
||||
* @param[in] argument String compare w argument. if NULL, match any.
|
||||
* @retval n Number of matches
|
||||
* This however means that if you actually want to match only a yang-stmt with
|
||||
* argument==NULL you cannot, but I have not seen any such examples.
|
||||
* @see yang_find
|
||||
*/
|
||||
int
|
||||
yang_match(yang_node *yn,
|
||||
int keyword,
|
||||
char *argument)
|
||||
{
|
||||
yang_stmt *ys = NULL;
|
||||
int i;
|
||||
int match = 0;
|
||||
|
||||
for (i=0; i<yn->yn_len; i++){
|
||||
ys = yn->yn_stmt[i];
|
||||
if (keyword == 0 || ys->ys_keyword == keyword){
|
||||
if (argument == NULL)
|
||||
match++;
|
||||
else
|
||||
if (ys->ys_argument && strcmp(argument, ys->ys_argument) == 0)
|
||||
match++;
|
||||
}
|
||||
}
|
||||
return match;
|
||||
}
|
||||
#ifdef NOTYET
|
||||
/*! Prototype more generic than yang_find_datanode and yang_find_schemanode
|
||||
*/
|
||||
|
|
@ -2140,6 +2179,11 @@ yang_parse(clicon_handle h,
|
|||
if (yang_parse_recurse(ymod, dir, ysp) < 0)
|
||||
goto done;
|
||||
|
||||
/* Check cardinality maybe this should be done after grouping/augment */
|
||||
for (i=modnr; i<ysp->yp_len; i++) /* XXX */
|
||||
if (yang_cardinality(h, ysp->yp_stmt[i], ysp->yp_stmt[i]->ys_argument) < 0)
|
||||
goto done;
|
||||
|
||||
/* Step 2: check features: check if enabled and remove disabled features */
|
||||
for (i=modnr; i<ysp->yp_len; i++) /* XXX */
|
||||
if (yang_features(h, ysp->yp_stmt[i]) < 0)
|
||||
|
|
|
|||
|
|
@ -112,6 +112,7 @@ clixon_yang_parsewrap(void)
|
|||
|
||||
/* RFC 6020 keywords */
|
||||
<KEYWORD>action { BEGIN(ARGUMENT); return K_ACTION; }
|
||||
<KEYWORD>anydata { BEGIN(ARGUMENT); return K_ANYDATA; }
|
||||
<KEYWORD>anyxml { BEGIN(ARGUMENT); return K_ANYXML; }
|
||||
<KEYWORD>argument { BEGIN(ARGUMENT); return K_ARGUMENT; }
|
||||
<KEYWORD>augment { BEGIN(ARGUMENT); return K_AUGMENT; }
|
||||
|
|
|
|||
|
|
@ -65,6 +65,7 @@
|
|||
* - Cant use the symbols in this file because yacc needs token definitions
|
||||
*/
|
||||
%token K_ACTION
|
||||
%token K_ANYDATA
|
||||
%token K_ANYXML
|
||||
%token K_ARGUMENT
|
||||
%token K_AUGMENT
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue