/** * xmlListCopy: * @param cur the new list * @param old the old list * * Move all the element from the old list in the new list * * Returns 0 in case of success 1 in case of error */ XMLPUBFUNEXPORT int xmlListCopy(xmlListPtr cur, const xmlListPtr old) { /* Walk the old tree and insert the data into the new one */ xmlLinkPtr lk; for(lk = old->sentinel->next; lk != old->sentinel; lk = lk->next) { if (0 !=xmlListInsert(cur, lk->data)) { xmlListDelete(cur); return (1); } } return (0); }
int xmlListCopy(xmlListPtr cur, const xmlListPtr old) { xmlLinkPtr lk; if ((old == NULL) || (cur == NULL)) return(1); for(lk = old->sentinel->next; lk != old->sentinel; lk = lk->next) { if (0 !=xmlListInsert(cur, lk->data)) { xmlListDelete(cur); return (1); } } return (0); }
void xmlListSort(xmlListPtr l) { xmlListPtr lTemp; if (l == NULL) return; if(xmlListEmpty(l)) return; if (NULL ==(lTemp = xmlListDup(l))) return; xmlListClear(l); xmlListMerge(l, lTemp); xmlListDelete(lTemp); return; }
/** * xmlListSort: * @param l a list * * Sort all the elements in the list */ void xmlListSort(xmlListPtr list) { xmlListPtr lTemp; if(xmlListEmpty(list)) return; /* I think that the real answer is to implement quicksort, the * alternative is to implement some list copying procedure which * would be based on a list copy followed by a clear followed by * an insert. This is slow... */ if (NULL ==(lTemp = xmlListDup(list))) return; xmlListClear(list); xmlListMerge(list, lTemp); xmlListDelete(lTemp); return; }
/** * This is step 2, point 3: sort elements by Id: we process other elements as-is, but for elements we collect them in a list, * then sort, and finally process them (process the head of the list, then pop the head, till the list becomes empty). */ static int xmlSecTransformRelationshipProcessNodeList(xmlSecTransformPtr transform, xmlOutputBufferPtr buf, xmlNodePtr cur) { xmlListPtr list; int ret; xmlSecAssert2(transform != NULL, -1); xmlSecAssert2(buf != NULL, -1); xmlSecAssert2(cur != NULL, -1); list = xmlListCreate(NULL, (xmlListDataCompare)xmlSecTransformRelationshipCompare); if(list == NULL) { xmlSecError(XMLSEC_ERRORS_HERE, xmlSecErrorsSafeString(xmlSecTransformGetName(transform)), "xmlListCreate", XMLSEC_ERRORS_R_XMLSEC_FAILED, XMLSEC_ERRORS_NO_MESSAGE); return(-1); } for(; cur; cur = cur->next) { if(xmlStrcmp(cur->name, xmlSecNodeRelationship) == 0) { if(xmlListInsert(list, cur) != 0) { xmlSecError(XMLSEC_ERRORS_HERE, xmlSecErrorsSafeString(xmlSecTransformGetName(transform)), "xmlListInsert", XMLSEC_ERRORS_R_XMLSEC_FAILED, XMLSEC_ERRORS_NO_MESSAGE); return(-1); } } else { ret = xmlSecTransformRelationshipProcessNode(transform, buf, cur); if(ret < 0) { xmlSecError(XMLSEC_ERRORS_HERE, xmlSecErrorsSafeString(xmlSecTransformGetName(transform)), "xmlSecTransformRelationshipProcessNode", XMLSEC_ERRORS_R_XMLSEC_FAILED, XMLSEC_ERRORS_NO_MESSAGE); xmlListDelete(list); return(-1); } } } xmlListSort(list); while(!xmlListEmpty(list)) { xmlLinkPtr link = xmlListFront(list); xmlNodePtr node = (xmlNodePtr)xmlLinkGetData(link); ret = xmlSecTransformRelationshipProcessNode(transform, buf, node); if(ret < 0) { xmlSecError(XMLSEC_ERRORS_HERE, xmlSecErrorsSafeString(xmlSecTransformGetName(transform)), "xmlSecTransformRelationshipProcessNode", XMLSEC_ERRORS_R_XMLSEC_FAILED, XMLSEC_ERRORS_NO_MESSAGE); xmlListDelete(list); return(-1); } xmlListPopFront(list); } /* done */ xmlListDelete(list); return(0); }