Optimization of cardinality
This commit is contained in:
parent
c57188992b
commit
f6993de7eb
3 changed files with 21 additions and 47 deletions
|
|
@ -281,7 +281,6 @@ yang_stmt *ys_module(yang_stmt *ys);
|
||||||
int ys_real_module(yang_stmt *ys, yang_stmt **ymod);
|
int ys_real_module(yang_stmt *ys, yang_stmt **ymod);
|
||||||
yang_stmt *ys_spec(yang_stmt *ys);
|
yang_stmt *ys_spec(yang_stmt *ys);
|
||||||
yang_stmt *yang_find(yang_stmt *yn, int keyword, const char *argument);
|
yang_stmt *yang_find(yang_stmt *yn, int keyword, const char *argument);
|
||||||
int yang_match(yang_stmt *yn, int keyword, char *argument);
|
|
||||||
yang_stmt *yang_find_datanode(yang_stmt *yn, char *argument);
|
yang_stmt *yang_find_datanode(yang_stmt *yn, char *argument);
|
||||||
yang_stmt *yang_find_schemanode(yang_stmt *yn, char *argument);
|
yang_stmt *yang_find_schemanode(yang_stmt *yn, char *argument);
|
||||||
char *yang_find_myprefix(yang_stmt *ys);
|
char *yang_find_myprefix(yang_stmt *ys);
|
||||||
|
|
|
||||||
|
|
@ -1110,7 +1110,6 @@ yn_each(yang_stmt *yparent,
|
||||||
* @param[in] argument String compare w argument. if NULL, match any.
|
* @param[in] argument String compare w argument. if NULL, match any.
|
||||||
* @retval ys Yang statement, if any
|
* @retval ys Yang statement, if any
|
||||||
* @see yang_find_datanode
|
* @see yang_find_datanode
|
||||||
* @see yang_match returns number of matches
|
|
||||||
*/
|
*/
|
||||||
yang_stmt *
|
yang_stmt *
|
||||||
yang_find(yang_stmt *yn,
|
yang_find(yang_stmt *yn,
|
||||||
|
|
@ -1152,38 +1151,6 @@ yang_find(yang_stmt *yn,
|
||||||
return yret?yret:yretsub;
|
return yret?yret:yretsub;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! 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_stmt *yn,
|
|
||||||
int keyword,
|
|
||||||
char *argument)
|
|
||||||
{
|
|
||||||
yang_stmt *ys = NULL;
|
|
||||||
int i;
|
|
||||||
int match = 0;
|
|
||||||
|
|
||||||
for (i=0; i<yn->ys_len; i++){
|
|
||||||
ys = yn->ys_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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*! Find child data node with matching argument (container, leaf, list, leaf-list)
|
/*! Find child data node with matching argument (container, leaf, list, leaf-list)
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -497,6 +497,7 @@ yang_cardinality(clixon_handle h,
|
||||||
int order;
|
int order;
|
||||||
yang_stmt *yprev = NULL;
|
yang_stmt *yprev = NULL;
|
||||||
int nr;
|
int nr;
|
||||||
|
int yc_count[Y_SPEC] = {0,};
|
||||||
|
|
||||||
pk = yang_keyword_get(yt);
|
pk = yang_keyword_get(yt);
|
||||||
if (_yc_exist[pk] == 0)
|
if (_yc_exist[pk] == 0)
|
||||||
|
|
@ -535,7 +536,12 @@ yang_cardinality(clixon_handle h,
|
||||||
order = yc->yc_order;
|
order = yc->yc_order;
|
||||||
yprev = ys;
|
yprev = ys;
|
||||||
}
|
}
|
||||||
/* 2) For all in 1 and 1..n list, if 0 such children ->ERROR */
|
/* 2) For all in 1 and 1..n list, if 0 such children -> ERROR
|
||||||
|
*/
|
||||||
|
ys = NULL;
|
||||||
|
while ((ys = yn_each(yt, ys)) != NULL) {
|
||||||
|
yc_count[yang_keyword_get(ys)]++;
|
||||||
|
}
|
||||||
for (i=0; i<Y_SPEC; i++){
|
for (i=0; i<Y_SPEC; i++){
|
||||||
yc = _yc_search[pk][i];
|
yc = _yc_search[pk][i];
|
||||||
if (yc == NULL)
|
if (yc == NULL)
|
||||||
|
|
@ -546,8 +552,9 @@ yang_cardinality(clixon_handle h,
|
||||||
modname, yang_key2str(yc->yc_child), yang_key2str(pk));
|
modname, yang_key2str(yc->yc_child), yang_key2str(pk));
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
if (yc->yc_max<NMAX &&
|
if (yc->yc_max<NMAX){
|
||||||
(nr = yang_match(yt, yc->yc_child, NULL)) > yc->yc_max){
|
nr = yc_count[yc->yc_child];
|
||||||
|
if (nr > yc->yc_max){
|
||||||
clixon_err(OE_YANG, 0, "%s: \"%s\" has %d children of type \"%s\", but only %d allowed",
|
clixon_err(OE_YANG, 0, "%s: \"%s\" has %d children of type \"%s\", but only %d allowed",
|
||||||
modname,
|
modname,
|
||||||
yang_key2str(pk),
|
yang_key2str(pk),
|
||||||
|
|
@ -557,9 +564,10 @@ yang_cardinality(clixon_handle h,
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
/* 4) Recurse */
|
/* 4) Recurse */
|
||||||
i = 0;
|
i = 0;
|
||||||
while (i< yang_len_get(yt)){ /* Note, children may be removed cant use yn_each */
|
while (i < yang_len_get(yt)){ /* Note, children may be removed cant use yn_each */
|
||||||
ys = yang_child_i(yt, i++);
|
ys = yang_child_i(yt, i++);
|
||||||
if (yang_cardinality(h, ys, modname) < 0)
|
if (yang_cardinality(h, ys, modname) < 0)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue