From f6993de7eb1e0a6f154ff051a2ac5ec72c139f1d Mon Sep 17 00:00:00 2001 From: Olof hagsand Date: Sun, 28 Apr 2024 23:13:10 +0200 Subject: [PATCH] Optimization of cardinality --- lib/clixon/clixon_yang.h | 1 - lib/src/clixon_yang.c | 33 ------------------------------ lib/src/clixon_yang_cardinality.c | 34 +++++++++++++++++++------------ 3 files changed, 21 insertions(+), 47 deletions(-) diff --git a/lib/clixon/clixon_yang.h b/lib/clixon/clixon_yang.h index 871ab436..9ef63a67 100644 --- a/lib/clixon/clixon_yang.h +++ b/lib/clixon/clixon_yang.h @@ -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); diff --git a/lib/src/clixon_yang.c b/lib/src/clixon_yang.c index 4d6bfc43..4a53782d 100644 --- a/lib/src/clixon_yang.c +++ b/lib/src/clixon_yang.c @@ -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; iys_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) * diff --git a/lib/src/clixon_yang_cardinality.c b/lib/src/clixon_yang_cardinality.c index 09f60cb2..73e4aae4 100644 --- a/lib/src/clixon_yang_cardinality.c +++ b/lib/src/clixon_yang_cardinality.c @@ -497,11 +497,12 @@ 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) goto ok; - /* 1) For all children, if neither in 0..n, 0..1, 1 or 1..n ->ERROR + /* 1) For all children, if neither in 0..n, 0..1, 1 or 1..n ->ERROR * Also: check monotonically increasing order */ order = 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; iyc_child), yang_key2str(pk)); goto done; } - if (yc->yc_maxyc_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_maxyc_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;