Optimization of cardinality

This commit is contained in:
Olof hagsand 2024-04-28 23:13:10 +02:00
parent c57188992b
commit f6993de7eb
3 changed files with 21 additions and 47 deletions

View file

@ -281,7 +281,6 @@ yang_stmt *ys_module(yang_stmt *ys);
int ys_real_module(yang_stmt *ys, yang_stmt **ymod);
yang_stmt *ys_spec(yang_stmt *ys);
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_schemanode(yang_stmt *yn, char *argument);
char *yang_find_myprefix(yang_stmt *ys);

View file

@ -1110,7 +1110,6 @@ yn_each(yang_stmt *yparent,
* @param[in] argument String compare w argument. if NULL, match any.
* @retval ys Yang statement, if any
* @see yang_find_datanode
* @see yang_match returns number of matches
*/
yang_stmt *
yang_find(yang_stmt *yn,
@ -1152,38 +1151,6 @@ yang_find(yang_stmt *yn,
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)
*

View file

@ -497,6 +497,7 @@ yang_cardinality(clixon_handle h,
int order;
yang_stmt *yprev = NULL;
int nr;
int yc_count[Y_SPEC] = {0,};
pk = yang_keyword_get(yt);
if (_yc_exist[pk] == 0)
@ -534,8 +535,13 @@ yang_cardinality(clixon_handle h,
if (order < yc->yc_order)
order = yc->yc_order;
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++){
yc = _yc_search[pk][i];
if (yc == NULL)
@ -546,20 +552,22 @@ yang_cardinality(clixon_handle h,
modname, yang_key2str(yc->yc_child), yang_key2str(pk));
goto done;
}
if (yc->yc_max<NMAX &&
(nr = yang_match(yt, yc->yc_child, NULL)) > yc->yc_max){
clixon_err(OE_YANG, 0, "%s: \"%s\" has %d children of type \"%s\", but only %d allowed",
modname,
yang_key2str(pk),
nr,
yang_key2str(yc->yc_child),
yc->yc_max);
goto done;
if (yc->yc_max<NMAX){
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",
modname,
yang_key2str(pk),
nr,
yang_key2str(yc->yc_child),
yc->yc_max);
goto done;
}
}
}
/* 4) Recurse */
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++);
if (yang_cardinality(h, ys, modname) < 0)
goto done;