experimental insert_pos

This commit is contained in:
Olof hagsand 2017-12-31 18:18:04 +01:00
parent 79767045ad
commit 9681c91681
2 changed files with 42 additions and 52 deletions

View file

@ -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);

View file

@ -211,6 +211,7 @@ xml_cmp1(cxobj *x,
for (i=0; i<keynr; i++){
keyname = keyvec[i];
key = keyval[i];
/* Eg return "e0" in <if><name>e0</name></name></if> 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,17 +340,17 @@ 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
int
xml_insert_pos(cxobj *x0,
char *name,
int yangi,
@ -361,56 +363,42 @@ xml_insert_pos(cxobj *x0,
{
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);
return xml_child_nr(x0); /* upper range */
xc = xml_child_i(x0, mid);
cmp = xml_cmp(&x, &xc);
y = xml_spec(xc);
cmp = yangi-yang_order(y);
if (cmp == 0){
cmp = xml_cmp1(xc, y, name, keyword, keynr, keyvec, keyval, &userorder);
if (userorder){ /* Look inside this yangi order */
/* Special case: append last of equals if ordered by user */
for (i=mid+1;i<xml_child_nr(x0);i++){
xc = xml_child_i(x0, i);
if (xml_cmp(&x, &xc) != 0)
if (strcmp(xml_name(xc), name))
break;
mid=i; /* still ok */
}
return mid;
}
}
if (cmp == 0)
return mid;
else if (cmp < 0)
return xml_insert_pos(x0, x, low, mid-1);
return xml_insert_pos(x0, name, yangi, keyword,
keynr, keyvec, keyval, low, mid-1);
else
return xml_insert_pos(x0, x, mid+1, upper);
return xml_insert_pos(x0, name, yangi, keyword,
keynr, keyvec, keyval, mid+1, upper);
}
/*! Add xml object in sorted position
* @param[in] x0 XML parent node.
* @param[in] x XML node (to insert)
* Assume already under x0
* XXX WORK IN PROGRESS
*/
cxobj *
xml_sort_insert(cxobj *x0,
cxobj *x)
{
int pos;
/* find closest to x, insert after pos. */
xml_rm(x);
pos = xml_insert_pos(x0, x, 0, xml_child_nr(x0));
fprintf(stderr, "%d\n", pos);
#if 0
if (pos < xml_child_nr(x0))
xml_child_i_set(x0, pos);
xml_parent_set(x, x0);
#endif
return x;
}
#endif /* notyet */
/*! Find matching xml child given name and optional key values
* container: x0, y->keyword, name
* list: x0, y->keyword, y->key, 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: