From 65c809b1c3262eadb1f54a28c1e1ee19eb5ef11f Mon Sep 17 00:00:00 2001 From: Olof hagsand Date: Wed, 24 Apr 2019 15:13:19 +0200 Subject: [PATCH] Removed external direct access to the yang_stmt struct. --- CHANGELOG.md | 1 + lib/clixon/clixon_xml_map.h | 3 ++ lib/clixon/clixon_yang.h | 75 +------------------------------ lib/clixon/clixon_yang_type.h | 3 +- lib/src/clixon_datastore_read.c | 4 +- lib/src/clixon_datastore_write.c | 11 ++--- lib/src/clixon_json.c | 8 ++-- lib/src/clixon_nacm.c | 2 +- lib/src/clixon_xml_changelog.c | 2 +- lib/src/clixon_xml_map.c | 29 ++++++------ lib/src/clixon_xml_sort.c | 21 +++++---- lib/src/clixon_yang.c | 1 + lib/src/clixon_yang_cardinality.c | 16 +++---- lib/src/clixon_yang_internal.h | 26 +++++++++++ lib/src/clixon_yang_module.c | 1 + lib/src/clixon_yang_parse.y | 1 + lib/src/clixon_yang_type.c | 1 + 17 files changed, 85 insertions(+), 120 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7445019b..652a597d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -52,6 +52,7 @@ * Change all y->ys_argument to yang_argument_get(y) * Change all y->ys_cv to yang_cv_get(y) * Change all y->ys_cvec to yang_cvec_get(y) + * Removed external direct access to the yang_stmt struct. * xmldb_get() removed unnecessary config option: * Change all calls to dbget from: `xmldb_get(h, db, xpath, 0|1, &xret, msd)` to `xmldb_get(h, db, xpath, &xret, msd)` diff --git a/lib/clixon/clixon_xml_map.h b/lib/clixon/clixon_xml_map.h index c1398cd2..7d6bc9f6 100644 --- a/lib/clixon/clixon_xml_map.h +++ b/lib/clixon/clixon_xml_map.h @@ -38,6 +38,9 @@ #ifndef _CLIXON_XML_MAP_H_ #define _CLIXON_XML_MAP_H_ +/* declared in clixon_yang_internal */ +typedef enum yang_class yang_class; + /* * Prototypes */ diff --git a/lib/clixon/clixon_yang.h b/lib/clixon/clixon_yang.h index f9472bba..44919010 100644 --- a/lib/clixon/clixon_yang.h +++ b/lib/clixon/clixon_yang.h @@ -40,16 +40,10 @@ #define _CLIXON_YANG_H_ -/* - * Actually cligen variable stuff XXX - */ -#define V_UNIQUE 0x01 /* Variable flag */ -#define V_UNSET 0x08 /* Variable is unset, ie no default */ /* * Types */ -struct xml; /*! YANG keywords from RFC6020. * See also keywords generated by yacc/bison in clicon_yang_parse.tab.h, but they start with K_ * instead of Y_ @@ -142,85 +136,20 @@ enum yang_class{ }; typedef enum yang_class yang_class; -#define YANG_FLAG_MARK 0x01 /* Marker for dynamic algorithms, eg expand */ +struct xml; /* Yang data node * See RFC7950 Sec 3: * o data node: A node in the schema tree that can be instantiated in a * data tree. One of container, leaf, leaf-list, list, anydata, and * anyxml. + * XXX move to function */ #define yang_datanode(y) ((y)->ys_keyword == Y_CONTAINER || (y)->ys_keyword == Y_LEAF || (y)->ys_keyword == Y_LIST || (y)->ys_keyword == Y_LEAF_LIST || (y)->ys_keyword == Y_ANYXML || (y)->ys_keyword == Y_ANYDATA) -/* Yang data definition statement - * See RFC 7950 Sec 3: - * o data definition statement: A statement that defines new data - * nodes. One of "container", "leaf", "leaf-list", "list", "choice", - * "case", "augment", "uses", "anydata", and "anyxml". - */ -#define yang_datadefinition(y) (yang_datanode(y) || (y)->ys_keyword == Y_CHOICE || (y)->ys_keyword == Y_CASE || (y)->ys_keyword == Y_AUGMENT || (y)->ys_keyword == Y_USES) - -/* Yang schema node . - * See RFC 7950 Sec 3: - * o schema node: A node in the schema tree. One of action, container, - * leaf, leaf-list, list, choice, case, rpc, input, output, - * notification, anydata, and anyxml. - */ -#define yang_schemanode(y) (yang_datanode(y) || (y)->ys_keyword == Y_RPC || (y)->ys_keyword == Y_CHOICE || (y)->ys_keyword == Y_CASE || (y)->ys_keyword == Y_INPUT || (y)->ys_keyword == Y_OUTPUT || (y)->ys_keyword == Y_NOTIFICATION) - typedef struct yang_stmt yang_stmt; /* Defined in clixon_yang_internal */ -/*! Yang type cache. Yang type statements can cache all typedef info here - * @note unions not cached -*/ -struct yang_type_cache{ - int yc_options; /* See YANG_OPTIONS_* that determines pattern/ - fraction fields. */ - cvec *yc_cvv; /* Range and length restriction. (if YANG_OPTION_ - LENGTH|RANGE. Can be a vector if multiple - ranges*/ - char *yc_pattern; /* regex (posix) (if YANG_OPTIONS_PATTERN) */ - uint8_t yc_fraction; /* Fraction digits for decimal64 (if - YANG_OPTIONS_FRACTION_DIGITS */ - yang_stmt *yc_resolved; /* Resolved type object, can be NULL - note direct ptr */ -}; -typedef struct yang_type_cache yang_type_cache; - -/*! yang statement - */ - -struct yang_stmt{ - int ys_len; /* Number of children */ - struct yang_stmt **ys_stmt; /* Vector of children statement pointers */ - struct yang_stmt *ys_parent; /* Backpointer to parent: yang-stmt or yang-spec */ - enum rfc_6020 ys_keyword; /* See clicon_yang_parse.tab.h */ - - char *ys_argument; /* String / argument depending on keyword */ - int ys_flags; /* Flags according to YANG_FLAG_* above */ - yang_stmt *ys_module; /* Shortcut to "my" module. Augmented - nodes can belong to other - modules than the ancestor module */ - - char *ys_extra; /* For unknown */ - cg_var *ys_cv; /* cligen variable. See ys_populate() - Following stmts have cv:s: - leaf: for default value - leaf-list, - config: boolean true or false - mandatory: boolean true or false - fraction-digits for fraction-digits - unknown-stmt (argument) - */ - cvec *ys_cvec; /* List of stmt-specific variables - Y_RANGE: range_min, range_max - Y_LIST: vector of keys - Y_TYPE & identity: store all derived types - */ - yang_type_cache *ys_typecache; /* If ys_keyword==Y_TYPE, cache all typedef data except unions */ - int _ys_vector_i; /* internal use: yn_each */ -}; - typedef int (yang_applyfn_t)(yang_stmt *ys, void *arg); /* diff --git a/lib/clixon/clixon_yang_type.h b/lib/clixon/clixon_yang_type.h index 2e859e47..86597f1b 100644 --- a/lib/clixon/clixon_yang_type.h +++ b/lib/clixon/clixon_yang_type.h @@ -49,7 +49,8 @@ /* * Types */ - +/* declared in clixon_yang_internal */ +typedef struct yang_type_cache yang_type_cache; /* * Prototypes diff --git a/lib/src/clixon_datastore_read.c b/lib/src/clixon_datastore_read.c index 80d3e3c6..d222f544 100644 --- a/lib/src/clixon_datastore_read.c +++ b/lib/src/clixon_datastore_read.c @@ -70,11 +70,11 @@ #include "clixon_data.h" #include "clixon_xpath_ctx.h" #include "clixon_xpath.h" -#include "clixon_xml_map.h" #include "clixon_json.h" #include "clixon_nacm.h" #include "clixon_netconf_lib.h" #include "clixon_yang_module.h" +#include "clixon_xml_map.h" #include "clixon_datastore.h" #include "clixon_datastore_read.h" @@ -184,7 +184,7 @@ xml_copy_marked(cxobj *x0, } /* (3) Special case: key nodes in lists are copied if any * node in list is marked */ - if (mark && yt && yt->ys_keyword == Y_LIST){ + if (mark && yt && yang_keyword_get(yt) == Y_LIST){ /* XXX: I think yang_key_match is suboptimal here */ if ((iskey = yang_key_match(yt, name)) < 0) goto done; diff --git a/lib/src/clixon_datastore_write.c b/lib/src/clixon_datastore_write.c index b1727945..13fa6440 100644 --- a/lib/src/clixon_datastore_write.c +++ b/lib/src/clixon_datastore_write.c @@ -71,11 +71,11 @@ #include "clixon_data.h" #include "clixon_xpath_ctx.h" #include "clixon_xpath.h" -#include "clixon_xml_map.h" #include "clixon_json.h" #include "clixon_nacm.h" #include "clixon_netconf_lib.h" #include "clixon_yang_module.h" +#include "clixon_xml_map.h" #include "clixon_datastore.h" #include "clixon_datastore_write.h" @@ -136,7 +136,7 @@ text_modify(clicon_handle h, if (xml_operation(opstr, &op) < 0) goto done; x1name = xml_name(x1); - if (y0->ys_keyword == Y_LEAF_LIST || y0->ys_keyword == Y_LEAF){ + if (yang_keyword_get(y0) == Y_LEAF_LIST || yang_keyword_get(y0) == Y_LEAF){ x1bstr = xml_body(x1); switch(op){ case OP_CREATE: @@ -174,7 +174,7 @@ text_modify(clicon_handle h, #if 0 /* If it is key I dont want to mark it */ - if ((iamkey=yang_key_match(y0->ys_parent, x1name)) < 0) + if ((iamkey=yang_key_match(yang_parent_get(y0), x1name)) < 0) goto done; if (!iamkey && op==OP_NONE) #else @@ -255,7 +255,8 @@ text_modify(clicon_handle h, can be modified in its entirety only. Any "operation" attributes present on subelements of an anyxml node are ignored by the NETCONF server.*/ - if (y0->ys_keyword == Y_ANYXML || y0->ys_keyword == Y_ANYDATA){ + if (yang_keyword_get(y0) == Y_ANYXML || + yang_keyword_get(y0) == Y_ANYDATA){ if (op == OP_NONE) break; if (op==OP_MERGE && !permit && xnacm){ @@ -546,7 +547,7 @@ xml_container_presence(cxobj *x, goto done; } /* Mark node that is: container, have no children, dont have presence */ - if (y->ys_keyword == Y_CONTAINER && + if (yang_keyword_get(y) == Y_CONTAINER && xml_child_nr_notype(x, CX_ATTR)==0 && yang_find(y, Y_PRESENCE, NULL) == NULL) xml_flag_set(x, XML_FLAG_MARK); /* Mark, remove later */ diff --git a/lib/src/clixon_json.c b/lib/src/clixon_json.c index 428831e4..530b342c 100644 --- a/lib/src/clixon_json.c +++ b/lib/src/clixon_json.c @@ -208,7 +208,7 @@ array_eval(cxobj *xprev, array = LAST_ARRAY; else if (eqnext) array = FIRST_ARRAY; - else if (ys && ys->ys_keyword == Y_LIST) + else if (ys && yang_keyword_get(ys) == Y_LIST) array = SINGLE_ARRAY; else array = NO_ARRAY; @@ -338,7 +338,7 @@ xml2json1_cbuf(cbuf *cb, /* Find module name associated with namspace URI */ if (namespace && yspec && (ymod = yang_find_module_by_namespace(yspec, namespace)) != NULL){ - modname = ymod->ys_argument; + modname = yang_argument_get(ymod); } childt = child_type(x); if (pretty==2) @@ -427,8 +427,8 @@ xml2json1_cbuf(cbuf *cb, * This is code for writing 42 as "a":42 and not "a":"42" */ if (childt == BODY_CHILD && ys!=NULL && - (ys->ys_keyword == Y_LEAF || ys->ys_keyword == Y_LEAF_LIST)) - switch (cv_type_get(ys->ys_cv)){ + (yang_keyword_get(ys) == Y_LEAF || yang_keyword_get(ys) == Y_LEAF_LIST)) + switch (cv_type_get(yang_cv_get(ys))){ case CGV_INT8: case CGV_INT16: case CGV_INT32: diff --git a/lib/src/clixon_nacm.c b/lib/src/clixon_nacm.c index 6f6f014b..2c57da27 100644 --- a/lib/src/clixon_nacm.c +++ b/lib/src/clixon_nacm.c @@ -330,7 +330,7 @@ nacm_rule_datanode(cxobj *xt, if ((ys = xml_spec(xr)) == NULL) goto nomatch; ymod = ys_module(ys); - module = ymod->ys_argument; + module = yang_argument_get(ymod); if (strcmp(module, module_rule) != 0) goto nomatch; } diff --git a/lib/src/clixon_xml_changelog.c b/lib/src/clixon_xml_changelog.c index fb96f8b1..1a0ffb32 100644 --- a/lib/src/clixon_xml_changelog.c +++ b/lib/src/clixon_xml_changelog.c @@ -66,8 +66,8 @@ #include "clixon_xml.h" #include "clixon_options.h" #include "clixon_data.h" -#include "clixon_xml_map.h" #include "clixon_yang_module.h" +#include "clixon_xml_map.h" #include "clixon_xml_changelog.h" #include "clixon_xpath_ctx.h" #include "clixon_xpath.h" diff --git a/lib/src/clixon_xml_map.c b/lib/src/clixon_xml_map.c index d49257f3..98c649f2 100644 --- a/lib/src/clixon_xml_map.c +++ b/lib/src/clixon_xml_map.c @@ -80,7 +80,6 @@ #include "clixon_handle.h" #include "clixon_string.h" #include "clixon_yang.h" -#include "clixon_yang_type.h" #include "clixon_xml.h" #include "clixon_options.h" #include "clixon_plugin.h" @@ -90,6 +89,8 @@ #include "clixon_err.h" #include "clixon_netconf_lib.h" #include "clixon_xml_sort.h" +#include "clixon_yang_internal.h" /* internal */ +#include "clixon_yang_type.h" #include "clixon_xml_map.h" /*! x is element and has eactly one child which in turn has none */ @@ -186,7 +187,7 @@ xml2cli(FILE *f, goto ok; if ((ys = xml_spec(x)) == NULL) goto ok; - if (ys->ys_keyword == Y_LEAF || ys->ys_keyword == Y_LEAF_LIST){ + if (yang_keyword_get(ys) == Y_LEAF || yang_keyword_get(ys) == Y_LEAF_LIST){ if (prepend0) fprintf(f, "%s", prepend0); if (gt == GT_ALL || gt == GT_VARS) @@ -209,7 +210,7 @@ xml2cli(FILE *f, cprintf(cbpre, "%s", prepend0); cprintf(cbpre, "%s ", xml_name(x)); - if (ys->ys_keyword == Y_LIST){ + if (yang_keyword_get(ys) == Y_LIST){ /* If list then first loop through keys */ xe = NULL; while ((xe = xml_child_each(x, xe, -1)) != NULL){ @@ -225,7 +226,7 @@ xml2cli(FILE *f, /* Then loop through all other (non-keys) */ xe = NULL; while ((xe = xml_child_each(x, xe, -1)) != NULL){ - if (ys->ys_keyword == Y_LIST){ + if (yang_keyword_get(ys) == Y_LIST){ if ((match = yang_key_match(ys, xml_name(xe))) < 0) goto done; if (match){ @@ -269,11 +270,11 @@ validate_leafref(cxobj *xt, if ((leafrefbody = xml_body(xt)) == NULL) goto ok; if ((ypath = yang_find(ytype, Y_PATH, NULL)) == NULL){ - if (netconf_missing_element(cbret, "application", ytype->ys_argument, "Leafref requires path statement") < 0) + if (netconf_missing_element(cbret, "application", yang_argument_get(ytype), "Leafref requires path statement") < 0) goto done; goto fail; } - if (xpath_vec(xt, "%s", &xvec, &xlen, ypath->ys_argument) < 0) + if (xpath_vec(xt, "%s", &xvec, &xlen, yang_argument_get(ypath)) < 0) goto done; for (i = 0; i < xlen; i++) { x = xvec[i]; @@ -349,23 +350,23 @@ validate_identityref(cxobj *xt, } /* This is the type's base reference */ if ((ybaseref = yang_find(ytype, Y_BASE, NULL)) == NULL){ - if (netconf_missing_element(cbret, "application", ytype->ys_argument, "Identityref validation failed, no base") < 0) + if (netconf_missing_element(cbret, "application", yang_argument_get(ytype), "Identityref validation failed, no base") < 0) goto done; goto fail; } /* This is the actual base identity */ - if ((ybaseid = yang_find_identity(ybaseref, ybaseref->ys_argument)) == NULL){ - if (netconf_missing_element(cbret, "application", ybaseref->ys_argument, "Identityref validation failed, no base identity") < 0) + if ((ybaseid = yang_find_identity(ybaseref, yang_argument_get(ybaseref))) == NULL){ + if (netconf_missing_element(cbret, "application", yang_argument_get(ybaseref), "Identityref validation failed, no base identity") < 0) goto done; goto fail; } /* Here check if node is in the derived node list of the base identity * The derived node list is a cvec computed XXX */ - if (cvec_find(ybaseid->ys_cvec, node) == NULL){ + if (cvec_find(yang_cvec_get(ybaseid), node) == NULL){ cbuf_reset(cb); cprintf(cb, "Identityref validation failed, %s not derived from %s", - node, ybaseid->ys_argument); + node, yang_argument_get(ybaseid)); if (netconf_operation_failed(cbret, "application", cbuf_get(cb)) < 0) goto done; goto fail; @@ -398,11 +399,11 @@ xml_yang_root(cxobj *x, while ((xp = xml_parent(x)) != NULL){ if ((y = xml_spec(x)) != NULL && - (yp = (yang_stmt*)y->ys_parent) != NULL) + (yp = yang_parent_get(y)) != NULL) /* Actually, maybe only the Y_MODULE clause is relevant */ if (yp==NULL || - yp->ys_keyword == Y_MODULE || - yp->ys_keyword == Y_SUBMODULE) + yang_keyword_get(yp) == Y_MODULE || + yang_keyword_get(yp) == Y_SUBMODULE) break; /* x is the root */ x = xp; } diff --git a/lib/src/clixon_xml_sort.c b/lib/src/clixon_xml_sort.c index c5cc305b..5c0dd389 100644 --- a/lib/src/clixon_xml_sort.c +++ b/lib/src/clixon_xml_sort.c @@ -60,10 +60,10 @@ #include "clixon_hash.h" #include "clixon_handle.h" #include "clixon_yang.h" -#include "clixon_yang_type.h" #include "clixon_xml.h" #include "clixon_options.h" #include "clixon_xml_map.h" +#include "clixon_yang_type.h" #include "clixon_xml_sort.h" /*! Get xml body value as cligen variable @@ -96,10 +96,10 @@ xml_cv_cache(cxobj *x, goto ok; if (yang_type_get(y, NULL, &yrestype, &options, NULL, NULL, &fraction) < 0) goto done; - yang2cv_type(yrestype->ys_argument, &cvtype); + yang2cv_type(yang_argument_get(yrestype), &cvtype); if (cvtype==CGV_ERR){ clicon_err(OE_YANG, errno, "yang->cligen type %s mapping failed", - yrestype->ys_argument); + yang_argument_get(yrestype)); goto done; } if ((cv = cv_new(cvtype)) == NULL){ @@ -157,11 +157,10 @@ xml_child_spec(cxobj *x, char *name; name = xml_name(x); - if (xp && (yparent = xml_spec(xp)) != NULL){ /* First case: parent already has an associated yang statement, * then find matching child of that */ - if (yparent->ys_keyword == Y_RPC){ + if (yang_keyword_get(yparent) == Y_RPC){ if ((yi = yang_find(yparent, Y_INPUT, NULL)) != NULL) y = yang_find_datanode(yi, name); } @@ -179,7 +178,7 @@ xml_child_spec(cxobj *x, else y = NULL; /* kludge rpc -> input */ - if (y && y->ys_keyword == Y_RPC && yang_find(y, Y_INPUT, NULL)) + if (y && yang_keyword_get(y) == Y_RPC && yang_find(y, Y_INPUT, NULL)) y = yang_find(y, Y_INPUT, NULL); *yresult = y; retval = 0; @@ -258,7 +257,7 @@ xml_cmp(cxobj *x1, goto done; /* Ordered by user or state data : maintain existing order */ } e=4; - switch (y1->ys_keyword){ + switch (yang_keyword_get(y1)){ case Y_LEAF_LIST: /* Match with name and value */ if ((b1 = xml_body(x1)) == NULL) equal = -1; @@ -275,7 +274,7 @@ xml_cmp(cxobj *x1, case Y_LIST: /* Match with key values * Use Y_LIST cache (see struct yang_stmt) */ - cvk = y1->ys_cvec; /* Use Y_LIST cache, see ys_populate_list() */ + cvk = yang_cvec_get(y1); /* Use Y_LIST cache, see ys_populate_list() */ cvi = NULL; while ((cvi = cvec_each(cvk, cvi)) != NULL) { keyname = cv_string_get(cvi); /* operational data may have NULL keys*/ @@ -682,7 +681,7 @@ match_base_child(cxobj *x0, } goto ok; /* What to do if not found? */ } - switch (yc->ys_keyword){ + switch (yang_keyword_get(yc)){ case Y_CONTAINER: /* Equal regardless */ case Y_LEAF: /* Equal regardless */ break; @@ -702,7 +701,7 @@ match_base_child(cxobj *x0, goto done; break; case Y_LIST: /* Match with key values */ - cvk = yc->ys_cvec; /* Use Y_LIST cache, see ys_populate_list() */ + cvk = yang_cvec_get(yc); /* Use Y_LIST cache, see ys_populate_list() */ /* Count number of key indexes * Then create two vectors one with names and one with values of x1c, * ec: keyvec: [a,b,c] keyval: [1,2,3] @@ -741,7 +740,7 @@ match_base_child(cxobj *x0, } /* Get match. */ yorder = yang_order(yc); - x0c = xml_search(x0, xml_name(x1c), yorder, yc->ys_keyword, keynr, keyvec, keyval, keycvec); + x0c = xml_search(x0, xml_name(x1c), yorder, yang_keyword_get(yc), keynr, keyvec, keyval, keycvec); ok: *x0cp = x0c; retval = 0; diff --git a/lib/src/clixon_yang.c b/lib/src/clixon_yang.c index 6056130b..b6706087 100644 --- a/lib/src/clixon_yang.c +++ b/lib/src/clixon_yang.c @@ -89,6 +89,7 @@ #include "clixon_options.h" #include "clixon_yang_parse.h" #include "clixon_yang_cardinality.h" +#include "clixon_yang_internal.h" /* internal */ #include "clixon_yang_type.h" /* Size of json read buffer when reading from file*/ diff --git a/lib/src/clixon_yang_cardinality.c b/lib/src/clixon_yang_cardinality.c index 5fbe7787..06fdf5bf 100644 --- a/lib/src/clixon_yang_cardinality.c +++ b/lib/src/clixon_yang_cardinality.c @@ -64,6 +64,7 @@ #include "clixon_handle.h" #include "clixon_err.h" #include "clixon_yang.h" +#include "clixon_yang_internal.h" /* internal */ #include "clixon_yang_cardinality.h" /* @@ -499,15 +500,14 @@ yang_cardinality(clicon_handle h, const struct ycard *ycplist; /* ycard parent table*/ const struct ycard *yc; - pk = yt->ys_keyword; + pk = yang_keyword_get(yt); /* 0) Find parent sub-parts of cardinality vector */ if ((ycplist = ycard_find(pk, 0, yclist, 0)) == NULL) goto ok; /* skip */ /* 1) For all children, if neither in 0..n, 0..1, 1 or 1..n ->ERROR */ - i = 0; - while (iys_len){ - ys = yt->ys_stmt[i++]; - ck = ys->ys_keyword; + ys = NULL; + while ((ys = yn_each(yt, ys)) != NULL) { + ck = yang_keyword_get(ys); if (ck == Y_UNKNOWN) /* special case */ continue; /* Find entry in yang cardinality table from parent/child keyword pair */ @@ -515,9 +515,9 @@ yang_cardinality(clicon_handle h, clicon_err(OE_YANG, 0, "%s: \"%s\"(%s) is child of \"%s\"(%s), but should not be", modname, yang_key2str(ck), - ys->ys_argument, + yang_argument_get(ys), yang_key2str(pk), - yt->ys_argument); + yang_argument_get(yt)); goto done; } } @@ -546,7 +546,7 @@ yang_cardinality(clicon_handle h, /* 4) Recurse */ i = 0; - while (iys_len){ /* Note, children may be removed */ + while (iys_len){ /* Note, children may be removed cant use yn_each */ ys = yt->ys_stmt[i++]; if (yang_cardinality(h, ys, modname) < 0) goto done; diff --git a/lib/src/clixon_yang_internal.h b/lib/src/clixon_yang_internal.h index 2e3e7fb5..e554e6ef 100644 --- a/lib/src/clixon_yang_internal.h +++ b/lib/src/clixon_yang_internal.h @@ -39,6 +39,16 @@ #ifndef _CLIXON_YANG_INTERNAL_H_ #define _CLIXON_YANG_INTERNAL_H_ + +/* + * Actually cligen variable stuff XXX + */ +#define V_UNIQUE 0x01 /* Variable flag */ +#define V_UNSET 0x08 /* Variable is unset, ie no default */ + + +#define YANG_FLAG_MARK 0x01 /* Marker for dynamic algorithms, eg expand */ + /*! Yang type cache. Yang type statements can cache all typedef info here * @note unions not cached */ @@ -88,4 +98,20 @@ struct yang_stmt{ int _ys_vector_i; /* internal use: yn_each */ }; +/* Yang data definition statement + * See RFC 7950 Sec 3: + * o data definition statement: A statement that defines new data + * nodes. One of "container", "leaf", "leaf-list", "list", "choice", + * "case", "augment", "uses", "anydata", and "anyxml". + */ +#define yang_datadefinition(y) (yang_datanode(y) || (y)->ys_keyword == Y_CHOICE || (y)->ys_keyword == Y_CASE || (y)->ys_keyword == Y_AUGMENT || (y)->ys_keyword == Y_USES) + +/* Yang schema node . + * See RFC 7950 Sec 3: + * o schema node: A node in the schema tree. One of action, container, + * leaf, leaf-list, list, choice, case, rpc, input, output, + * notification, anydata, and anyxml. + */ +#define yang_schemanode(y) (yang_datanode(y) || (y)->ys_keyword == Y_RPC || (y)->ys_keyword == Y_CHOICE || (y)->ys_keyword == Y_CASE || (y)->ys_keyword == Y_INPUT || (y)->ys_keyword == Y_OUTPUT || (y)->ys_keyword == Y_NOTIFICATION) + #endif /* _CLIXON_YANG_INTERNAL_H_ */ diff --git a/lib/src/clixon_yang_module.c b/lib/src/clixon_yang_module.c index 4b6c0937..3bfea1cb 100644 --- a/lib/src/clixon_yang_module.c +++ b/lib/src/clixon_yang_module.c @@ -76,6 +76,7 @@ #include "clixon_plugin.h" #include "clixon_netconf_lib.h" #include "clixon_yang_module.h" +#include "clixon_yang_internal.h" /* internal */ modstate_diff_t * modstate_diff_new(void) diff --git a/lib/src/clixon_yang_parse.y b/lib/src/clixon_yang_parse.y index 779b3195..b90b6ec5 100644 --- a/lib/src/clixon_yang_parse.y +++ b/lib/src/clixon_yang_parse.y @@ -190,6 +190,7 @@ #include "clixon_log.h" #include "clixon_yang.h" #include "clixon_yang_parse.h" +#include "clixon_yang_internal.h" /* internal */ extern int clixon_yang_parseget_lineno (void); diff --git a/lib/src/clixon_yang_type.c b/lib/src/clixon_yang_type.c index 413d4e8e..34664487 100644 --- a/lib/src/clixon_yang_type.c +++ b/lib/src/clixon_yang_type.c @@ -67,6 +67,7 @@ #include "clixon_plugin.h" #include "clixon_options.h" #include "clixon_yang.h" +#include "clixon_yang_internal.h" /* internal */ #include "clixon_yang_type.h" /*