123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779 |
- #define IN_LIBXML
- #include "libxml.h"
- #include <stdlib.h>
- #include <string.h>
- #include <libxml/xmlmemory.h>
- #include <libxml/list.h>
- #include <libxml/globals.h>
- struct _xmlLink
- {
- struct _xmlLink *next;
- struct _xmlLink *prev;
- void *data;
- };
- struct _xmlList
- {
- xmlLinkPtr sentinel;
- void (*linkDeallocator)(xmlLinkPtr );
- int (*linkCompare)(const void *, const void*);
- };
- static void
- xmlLinkDeallocator(xmlListPtr l, xmlLinkPtr lk)
- {
- (lk->prev)->next = lk->next;
- (lk->next)->prev = lk->prev;
- if(l->linkDeallocator)
- l->linkDeallocator(lk);
- xmlFree(lk);
- }
- static int
- xmlLinkCompare(const void *data0, const void *data1)
- {
- if (data0 < data1)
- return (-1);
- else if (data0 == data1)
- return (0);
- return (1);
- }
- static xmlLinkPtr
- xmlListLowerSearch(xmlListPtr l, void *data)
- {
- xmlLinkPtr lk;
- if (l == NULL)
- return(NULL);
- for(lk = l->sentinel->next;lk != l->sentinel && l->linkCompare(lk->data, data) <0 ;lk = lk->next);
- return lk;
- }
- static xmlLinkPtr
- xmlListHigherSearch(xmlListPtr l, void *data)
- {
- xmlLinkPtr lk;
- if (l == NULL)
- return(NULL);
- for(lk = l->sentinel->prev;lk != l->sentinel && l->linkCompare(lk->data, data) >0 ;lk = lk->prev);
- return lk;
- }
- static xmlLinkPtr
- xmlListLinkSearch(xmlListPtr l, void *data)
- {
- xmlLinkPtr lk;
- if (l == NULL)
- return(NULL);
- lk = xmlListLowerSearch(l, data);
- if (lk == l->sentinel)
- return NULL;
- else {
- if (l->linkCompare(lk->data, data) ==0)
- return lk;
- return NULL;
- }
- }
- static xmlLinkPtr
- xmlListLinkReverseSearch(xmlListPtr l, void *data)
- {
- xmlLinkPtr lk;
- if (l == NULL)
- return(NULL);
- lk = xmlListHigherSearch(l, data);
- if (lk == l->sentinel)
- return NULL;
- else {
- if (l->linkCompare(lk->data, data) ==0)
- return lk;
- return NULL;
- }
- }
- xmlListPtr
- xmlListCreate(xmlListDeallocator deallocator, xmlListDataCompare compare)
- {
- xmlListPtr l;
- if (NULL == (l = (xmlListPtr )xmlMalloc( sizeof(xmlList)))) {
- xmlGenericError(xmlGenericErrorContext,
- "Cannot initialize memory for list");
- return (NULL);
- }
-
- memset(l, 0, sizeof(xmlList));
-
-
- if (NULL ==(l->sentinel = (xmlLinkPtr )xmlMalloc(sizeof(xmlLink)))) {
- xmlGenericError(xmlGenericErrorContext,
- "Cannot initialize memory for sentinel");
- xmlFree(l);
- return (NULL);
- }
- l->sentinel->next = l->sentinel;
- l->sentinel->prev = l->sentinel;
- l->sentinel->data = NULL;
-
-
- if (deallocator != NULL)
- l->linkDeallocator = deallocator;
-
- if (compare != NULL)
- l->linkCompare = compare;
- else
- l->linkCompare = xmlLinkCompare;
- return l;
- }
-
- void *
- xmlListSearch(xmlListPtr l, void *data)
- {
- xmlLinkPtr lk;
- if (l == NULL)
- return(NULL);
- lk = xmlListLinkSearch(l, data);
- if (lk)
- return (lk->data);
- return NULL;
- }
- void *
- xmlListReverseSearch(xmlListPtr l, void *data)
- {
- xmlLinkPtr lk;
- if (l == NULL)
- return(NULL);
- lk = xmlListLinkReverseSearch(l, data);
- if (lk)
- return (lk->data);
- return NULL;
- }
- int
- xmlListInsert(xmlListPtr l, void *data)
- {
- xmlLinkPtr lkPlace, lkNew;
- if (l == NULL)
- return(1);
- lkPlace = xmlListLowerSearch(l, data);
-
- lkNew = (xmlLinkPtr) xmlMalloc(sizeof(xmlLink));
- if (lkNew == NULL) {
- xmlGenericError(xmlGenericErrorContext,
- "Cannot initialize memory for new link");
- return (1);
- }
- lkNew->data = data;
- lkPlace = lkPlace->prev;
- lkNew->next = lkPlace->next;
- (lkPlace->next)->prev = lkNew;
- lkPlace->next = lkNew;
- lkNew->prev = lkPlace;
- return 0;
- }
- int xmlListAppend(xmlListPtr l, void *data)
- {
- xmlLinkPtr lkPlace, lkNew;
- if (l == NULL)
- return(1);
- lkPlace = xmlListHigherSearch(l, data);
-
- lkNew = (xmlLinkPtr) xmlMalloc(sizeof(xmlLink));
- if (lkNew == NULL) {
- xmlGenericError(xmlGenericErrorContext,
- "Cannot initialize memory for new link");
- return (1);
- }
- lkNew->data = data;
- lkNew->next = lkPlace->next;
- (lkPlace->next)->prev = lkNew;
- lkPlace->next = lkNew;
- lkNew->prev = lkPlace;
- return 0;
- }
- void xmlListDelete(xmlListPtr l)
- {
- if (l == NULL)
- return;
- xmlListClear(l);
- xmlFree(l->sentinel);
- xmlFree(l);
- }
- int
- xmlListRemoveFirst(xmlListPtr l, void *data)
- {
- xmlLinkPtr lk;
-
- if (l == NULL)
- return(0);
-
- lk = xmlListLinkSearch(l, data);
- if (lk != NULL) {
- xmlLinkDeallocator(l, lk);
- return 1;
- }
- return 0;
- }
- int
- xmlListRemoveLast(xmlListPtr l, void *data)
- {
- xmlLinkPtr lk;
-
- if (l == NULL)
- return(0);
-
- lk = xmlListLinkReverseSearch(l, data);
- if (lk != NULL) {
- xmlLinkDeallocator(l, lk);
- return 1;
- }
- return 0;
- }
- int
- xmlListRemoveAll(xmlListPtr l, void *data)
- {
- int count=0;
-
- if (l == NULL)
- return(0);
- while(xmlListRemoveFirst(l, data))
- count++;
- return count;
- }
- void
- xmlListClear(xmlListPtr l)
- {
- xmlLinkPtr lk;
-
- if (l == NULL)
- return;
- lk = l->sentinel->next;
- while(lk != l->sentinel) {
- xmlLinkPtr next = lk->next;
- xmlLinkDeallocator(l, lk);
- lk = next;
- }
- }
- int
- xmlListEmpty(xmlListPtr l)
- {
- if (l == NULL)
- return(-1);
- return (l->sentinel->next == l->sentinel);
- }
- xmlLinkPtr
- xmlListFront(xmlListPtr l)
- {
- if (l == NULL)
- return(NULL);
- return (l->sentinel->next);
- }
-
- xmlLinkPtr
- xmlListEnd(xmlListPtr l)
- {
- if (l == NULL)
- return(NULL);
- return (l->sentinel->prev);
- }
-
- int
- xmlListSize(xmlListPtr l)
- {
- xmlLinkPtr lk;
- int count=0;
- if (l == NULL)
- return(-1);
-
- for(lk = l->sentinel->next; lk != l->sentinel; lk = lk->next, count++);
- return count;
- }
- void
- xmlListPopFront(xmlListPtr l)
- {
- if(!xmlListEmpty(l))
- xmlLinkDeallocator(l, l->sentinel->next);
- }
- void
- xmlListPopBack(xmlListPtr l)
- {
- if(!xmlListEmpty(l))
- xmlLinkDeallocator(l, l->sentinel->prev);
- }
- int
- xmlListPushFront(xmlListPtr l, void *data)
- {
- xmlLinkPtr lkPlace, lkNew;
- if (l == NULL)
- return(0);
- lkPlace = l->sentinel;
-
- lkNew = (xmlLinkPtr) xmlMalloc(sizeof(xmlLink));
- if (lkNew == NULL) {
- xmlGenericError(xmlGenericErrorContext,
- "Cannot initialize memory for new link");
- return (0);
- }
- lkNew->data = data;
- lkNew->next = lkPlace->next;
- (lkPlace->next)->prev = lkNew;
- lkPlace->next = lkNew;
- lkNew->prev = lkPlace;
- return 1;
- }
- int
- xmlListPushBack(xmlListPtr l, void *data)
- {
- xmlLinkPtr lkPlace, lkNew;
- if (l == NULL)
- return(0);
- lkPlace = l->sentinel->prev;
-
- if (NULL ==(lkNew = (xmlLinkPtr )xmlMalloc(sizeof(xmlLink)))) {
- xmlGenericError(xmlGenericErrorContext,
- "Cannot initialize memory for new link");
- return (0);
- }
- lkNew->data = data;
- lkNew->next = lkPlace->next;
- (lkPlace->next)->prev = lkNew;
- lkPlace->next = lkNew;
- lkNew->prev = lkPlace;
- return 1;
- }
- void *
- xmlLinkGetData(xmlLinkPtr lk)
- {
- if (lk == NULL)
- return(NULL);
- return lk->data;
- }
- void
- xmlListReverse(xmlListPtr l)
- {
- xmlLinkPtr lk;
- xmlLinkPtr lkPrev;
- if (l == NULL)
- return;
- lkPrev = l->sentinel;
- for (lk = l->sentinel->next; lk != l->sentinel; lk = lk->next) {
- lkPrev->next = lkPrev->prev;
- lkPrev->prev = lk;
- lkPrev = lk;
- }
-
- lkPrev->next = lkPrev->prev;
- lkPrev->prev = lk;
- }
- 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;
- }
- void
- xmlListWalk(xmlListPtr l, xmlListWalker walker, const void *user) {
- xmlLinkPtr lk;
- if ((l == NULL) || (walker == NULL))
- return;
- for(lk = l->sentinel->next; lk != l->sentinel; lk = lk->next) {
- if((walker(lk->data, user)) == 0)
- break;
- }
- }
- void
- xmlListReverseWalk(xmlListPtr l, xmlListWalker walker, const void *user) {
- xmlLinkPtr lk;
- if ((l == NULL) || (walker == NULL))
- return;
- for(lk = l->sentinel->prev; lk != l->sentinel; lk = lk->prev) {
- if((walker(lk->data, user)) == 0)
- break;
- }
- }
- void
- xmlListMerge(xmlListPtr l1, xmlListPtr l2)
- {
- xmlListCopy(l1, l2);
- xmlListClear(l2);
- }
- xmlListPtr
- xmlListDup(const xmlListPtr old)
- {
- xmlListPtr cur;
- if (old == NULL)
- return(NULL);
-
- if (NULL ==(cur = xmlListCreate(NULL, old->linkCompare)))
- return (NULL);
- if (0 != xmlListCopy(cur, old))
- return NULL;
- return cur;
- }
- 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);
- }
- #define bottom_list
- #include "elfgcchack.h"
|