diff options
Diffstat (limited to 'list.c')
-rw-r--r-- | list.c | 83 |
1 files changed, 70 insertions, 13 deletions
@@ -99,6 +99,8 @@ 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; } @@ -117,6 +119,8 @@ 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; } @@ -134,6 +138,8 @@ static xmlLinkPtr xmlListLinkSearch(xmlListPtr l, void *data) { xmlLinkPtr lk; + if (l == NULL) + return(NULL); lk = xmlListLowerSearch(l, data); if (lk == l->sentinel) return NULL; @@ -157,6 +163,8 @@ static xmlLinkPtr xmlListLinkReverseSearch(xmlListPtr l, void *data) { xmlLinkPtr lk; + if (l == NULL) + return(NULL); lk = xmlListHigherSearch(l, data); if (lk == l->sentinel) return NULL; @@ -223,6 +231,8 @@ void * xmlListSearch(xmlListPtr l, void *data) { xmlLinkPtr lk; + if (l == NULL) + return(NULL); lk = xmlListLinkSearch(l, data); if (lk) return (lk->data); @@ -242,6 +252,8 @@ void * xmlListReverseSearch(xmlListPtr l, void *data) { xmlLinkPtr lk; + if (l == NULL) + return(NULL); lk = xmlListLinkReverseSearch(l, data); if (lk) return (lk->data); @@ -262,6 +274,8 @@ xmlListInsert(xmlListPtr l, void *data) { xmlLinkPtr lkPlace, lkNew; + if (l == NULL) + return(1); lkPlace = xmlListLowerSearch(l, data); /* Add the new link */ lkNew = (xmlLinkPtr) xmlMalloc(sizeof(xmlLink)); @@ -292,6 +306,8 @@ int xmlListAppend(xmlListPtr l, void *data) { xmlLinkPtr lkPlace, lkNew; + if (l == NULL) + return(1); lkPlace = xmlListHigherSearch(l, data); /* Add the new link */ lkNew = (xmlLinkPtr) xmlMalloc(sizeof(xmlLink)); @@ -316,6 +332,9 @@ int xmlListAppend(xmlListPtr l, void *data) */ void xmlListDelete(xmlListPtr l) { + if (l == NULL) + return; + xmlListClear(l); xmlFree(l->sentinel); xmlFree(l); @@ -335,6 +354,8 @@ xmlListRemoveFirst(xmlListPtr l, void *data) { xmlLinkPtr lk; + if (l == NULL) + return(0); /*Find the first instance of this data */ lk = xmlListLinkSearch(l, data); if (lk != NULL) { @@ -358,6 +379,8 @@ xmlListRemoveLast(xmlListPtr l, void *data) { xmlLinkPtr lk; + if (l == NULL) + return(0); /*Find the last instance of this data */ lk = xmlListLinkReverseSearch(l, data); if (lk != NULL) { @@ -381,6 +404,8 @@ xmlListRemoveAll(xmlListPtr l, void *data) { int count=0; + if (l == NULL) + return(0); while(xmlListRemoveFirst(l, data)) count++; @@ -396,8 +421,11 @@ xmlListRemoveAll(xmlListPtr l, void *data) void xmlListClear(xmlListPtr l) { - xmlLinkPtr lk = l->sentinel->next; + xmlLinkPtr lk; + if (l == NULL) + return; + lk = l->sentinel->next; while(lk != l->sentinel) { xmlLinkPtr next = lk->next; @@ -412,11 +440,13 @@ xmlListClear(xmlListPtr l) * * Is the list empty ? * - * Returns 1 if the list is empty, 0 otherwise + * Returns 1 if the list is empty, 0 if not empty and -1 in case of error */ int xmlListEmpty(xmlListPtr l) { + if (l == NULL) + return(-1); return (l->sentinel->next == l->sentinel); } @@ -431,6 +461,8 @@ xmlListEmpty(xmlListPtr l) xmlLinkPtr xmlListFront(xmlListPtr l) { + if (l == NULL) + return(NULL); return (l->sentinel->next); } @@ -445,6 +477,8 @@ xmlListFront(xmlListPtr l) xmlLinkPtr xmlListEnd(xmlListPtr l) { + if (l == NULL) + return(NULL); return (l->sentinel->prev); } @@ -454,7 +488,7 @@ xmlListEnd(xmlListPtr l) * * Get the number of elements in the list * - * Returns the number of elements in the list + * Returns the number of elements in the list or -1 in case of error */ int xmlListSize(xmlListPtr l) @@ -462,6 +496,8 @@ xmlListSize(xmlListPtr l) xmlLinkPtr lk; int count=0; + if (l == NULL) + return(-1); /* TODO: keep a counter in xmlList instead */ for(lk = l->sentinel->next; lk != l->sentinel; lk = lk->next, count++); return count; @@ -507,6 +543,8 @@ xmlListPushFront(xmlListPtr l, void *data) { xmlLinkPtr lkPlace, lkNew; + if (l == NULL) + return(0); lkPlace = l->sentinel; /* Add the new link */ lkNew = (xmlLinkPtr) xmlMalloc(sizeof(xmlLink)); @@ -537,6 +575,8 @@ xmlListPushBack(xmlListPtr l, void *data) { xmlLinkPtr lkPlace, lkNew; + if (l == NULL) + return(0); lkPlace = l->sentinel->prev; /* Add the new link */ if (NULL ==(lkNew = (xmlLinkPtr )xmlMalloc(sizeof(xmlLink)))) { @@ -563,6 +603,8 @@ xmlListPushBack(xmlListPtr l, void *data) void * xmlLinkGetData(xmlLinkPtr lk) { + if (lk == NULL) + return(NULL); return lk->data; } @@ -573,18 +615,22 @@ xmlLinkGetData(xmlLinkPtr lk) * Reverse the order of the elements in the list */ void -xmlListReverse(xmlListPtr l) { - xmlLinkPtr lk; - xmlLinkPtr lkPrev = l->sentinel; - - for(lk = l->sentinel->next; lk != l->sentinel; lk = lk->next) { +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; + } + /* Fix up the last node */ lkPrev->next = lkPrev->prev; lkPrev->prev = lk; - lkPrev = lk; - } - /* Fix up the last node */ - lkPrev->next = lkPrev->prev; - lkPrev->prev = lk; } /** @@ -598,6 +644,8 @@ xmlListSort(xmlListPtr l) { xmlListPtr lTemp; + if (l == NULL) + return; if(xmlListEmpty(l)) return; @@ -628,6 +676,8 @@ 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; @@ -647,6 +697,8 @@ 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; @@ -680,6 +732,9 @@ xmlListPtr xmlListDup(const xmlListPtr old) { xmlListPtr cur; + + if (old == NULL) + return(NULL); /* Hmmm, how to best deal with allocation issues when copying * lists. If there is a de-allocator, should responsibility lie with * the new list or the old list. Surely not both. I'll arbitrarily @@ -708,6 +763,8 @@ xmlListCopy(xmlListPtr cur, const xmlListPtr old) /* Walk the old tree and insert the data into the new one */ 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); |