diff --git a/lib/clixon/clixon_xml_sort.h b/lib/clixon/clixon_xml_sort.h index fc3a1e1a..04cce1ae 100644 --- a/lib/clixon/clixon_xml_sort.h +++ b/lib/clixon/clixon_xml_sort.h @@ -48,7 +48,9 @@ int xml_child_spec(char *name, cxobj *xp, yang_spec *yspec, yang_stmt **yp) int xml_cmp(const void* arg1, const void* arg2); int xml_sort(cxobj *x0, void *arg); cxobj *xml_search(cxobj *x, char *name, int yangi, enum rfc_6020 keyword, int keynr, char **keyvec, char **keyval); -cxobj *xml_sort_insert(cxobj *x0, cxobj *x); +int xml_insert_pos(cxobj *x0, char *name, int yangi, enum rfc_6020 keyword, + int keynr, char **keyvec, char **keyval, int low, + int upper); cxobj *xml_match(cxobj *x0, char *name, enum rfc_6020 keyword, int keynr, char **keyvec, char **keyval); int xml_sort_verify(cxobj *x, void *arg); int match_base_child(cxobj *x0, cxobj *x1c, cxobj **x0cp, yang_stmt *yc); diff --git a/lib/src/clixon_xml_sort.c b/lib/src/clixon_xml_sort.c index e49715db..19580945 100644 --- a/lib/src/clixon_xml_sort.c +++ b/lib/src/clixon_xml_sort.c @@ -211,6 +211,7 @@ xml_cmp1(cxobj *x, for (i=0; ie0 given "name" */ if ((b = xml_find_body(x, keyname)) == NULL) break; /* error case */ return strcmp(key, b); @@ -303,7 +304,8 @@ xml_search1(cxobj *x0, return NULL; xc = xml_child_i(x0, mid); assert(y = xml_spec(xc)); - if ((cmp = yangi-yang_order(y)) == 0){ + cmp = yangi-yang_order(y); + if (cmp == 0){ cmp = xml_cmp1(xc, y, name, keyword, keynr, keyvec, keyval, &userorder); if (userorder && cmp) /* Look inside this yangi order */ return xml_search_userorder(x0, y, name, yangi, mid, keyword, keynr, keyvec, keyval); @@ -338,18 +340,18 @@ xml_search(cxobj *x0, 0, xml_child_nr(x0)); } -#ifdef notyet + /*! Position where to insert xml object into a list of children nodes + * @note EXPERIMENTAL * Insert after position returned * @param[in] x0 XML parent node. - * @param[in] x XML node (to insert) * @param[in] low Lower bound * @param[in] upper Upper bound (+1) * @retval position - * XXX: Replace "x" with parameters in xml_search1 + * XXX: Problem with this is that evrything must be known before insertion */ -static int -xml_insert_pos(cxobj *x0, +int +xml_insert_pos(cxobj *x0, char *name, int yangi, enum rfc_6020 keyword, @@ -359,57 +361,43 @@ xml_insert_pos(cxobj *x0, int low, int upper) { - int mid; - cxobj *xc; - int cmp; - int i; - + int mid; + cxobj *xc; + yang_stmt *y; + int cmp; + int i; + int userorder= 0; + if (upper < low) return low; /* not found */ mid = (low + upper) / 2; if (mid >= xml_child_nr(x0)) - return xml_child_nr(x0); - xc = xml_child_i(x0, mid); - cmp = xml_cmp(&x, &xc); + return xml_child_nr(x0); /* upper range */ + xc = xml_child_i(x0, mid); + y = xml_spec(xc); + cmp = yangi-yang_order(y); if (cmp == 0){ - /* Special case: append last of equals if ordered by user */ - for (i=mid+1;ikeyword, name @@ -555,11 +543,11 @@ match_base_child(cxobj *x0, int retval = -1; cvec *cvk = NULL; /* vector of index keys */ cg_var *cvi; - char *b1; + char *b; char *keyname; + char keynr = 0; char **keyval = NULL; char **keyvec = NULL; - char keynr = 0; int i; *x0cp = NULL; /* return value */ @@ -594,9 +582,9 @@ match_base_child(cxobj *x0, while ((cvi = cvec_each(cvk, cvi)) != NULL) { keyname = cv_string_get(cvi); keyvec[i] = keyname; - if ((b1 = xml_find_body(x1c, keyname)) == NULL) + if ((b = xml_find_body(x1c, keyname)) == NULL) goto ok; /* not found */ - keyval[i++] = b1; + keyval[i++] = b; } break; default: