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; }
/** * xmlListPopBack: * @l: a list * * Removes the last element in the list */ void xmlListPopBack(xmlListPtr l) { if (!xmlListEmpty(l)) xmlLinkDeallocator(l, l->sentinel->prev); }
/** * xmlListPopFront: * @l: a list * * Removes the first element in the list */ void xmlListPopFront(xmlListPtr l) { if (!xmlListEmpty(l)) xmlLinkDeallocator(l, l->sentinel->next); }
/** * xmlListPopFront: * @param l a list * * Removes the first element in the list */ XMLPUBFUNEXPORT void xmlListPopFront(xmlListPtr list) { if(!xmlListEmpty(list)) xmlLinkDeallocator(list, list->sentinel->next); }
/** * xmlListPopBack: * @param l a list * * Removes the last element in the list */ void xmlListPopBack(xmlListPtr list) { if(!xmlListEmpty(list)) xmlLinkDeallocator(list, list->sentinel->prev); }
/** * 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); }