more fixes and extending the tests coverage more fixes and hardening

* gentest.py testapi.c: more fixes and extending the tests coverage
* list.c tree.c: more fixes and hardening
Daniel
diff --git a/list.c b/list.c
index f8fb18e..ccd2233 100644
--- a/list.c
+++ b/list.c
@@ -99,6 +99,8 @@
 {
     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 @@
 {
     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 @@
 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 @@
 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 @@
 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 @@
 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 @@
 {
     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 @@
 {
     xmlLinkPtr lkPlace, lkNew;
 
+    if (l == NULL)
+        return(1);
     lkPlace = xmlListHigherSearch(l, data);
     /* Add the new link */
     lkNew = (xmlLinkPtr) xmlMalloc(sizeof(xmlLink));
@@ -338,6 +354,8 @@
 {
     xmlLinkPtr lk;
     
+    if (l == NULL)
+        return(0);
     /*Find the first instance of this data */
     lk = xmlListLinkSearch(l, data);
     if (lk != NULL) {
@@ -361,6 +379,8 @@
 {
     xmlLinkPtr lk;
     
+    if (l == NULL)
+        return(0);
     /*Find the last instance of this data */
     lk = xmlListLinkReverseSearch(l, data);
     if (lk != NULL) {
@@ -384,6 +404,8 @@
 {
     int count=0;
     
+    if (l == NULL)
+        return(0);
 
     while(xmlListRemoveFirst(l, data))
         count++;
@@ -399,8 +421,11 @@
 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;
 
@@ -415,11 +440,13 @@
  *
  * 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);
 }
 
@@ -434,6 +461,8 @@
 xmlLinkPtr 
 xmlListFront(xmlListPtr l)
 {
+    if (l == NULL)
+        return(NULL);
     return (l->sentinel->next);
 }
     
@@ -448,6 +477,8 @@
 xmlLinkPtr 
 xmlListEnd(xmlListPtr l)
 {
+    if (l == NULL)
+        return(NULL);
     return (l->sentinel->prev);
 }
     
@@ -457,7 +488,7 @@
  *
  * 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)
@@ -465,6 +496,8 @@
     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;
@@ -510,6 +543,8 @@
 {
     xmlLinkPtr lkPlace, lkNew;
 
+    if (l == NULL)
+        return(0);
     lkPlace = l->sentinel;
     /* Add the new link */
     lkNew = (xmlLinkPtr) xmlMalloc(sizeof(xmlLink));
@@ -540,6 +575,8 @@
 {
     xmlLinkPtr lkPlace, lkNew;
 
+    if (l == NULL)
+        return(0);
     lkPlace = l->sentinel->prev;
     /* Add the new link */
     if (NULL ==(lkNew = (xmlLinkPtr )xmlMalloc(sizeof(xmlLink)))) {
@@ -566,6 +603,8 @@
 void *
 xmlLinkGetData(xmlLinkPtr lk)
 {
+    if (lk == NULL)
+        return(NULL);
     return lk->data;
 }
 
@@ -576,18 +615,22 @@
  * 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;
 }
 
 /**
@@ -601,6 +644,8 @@
 {
     xmlListPtr lTemp;
     
+    if (l == NULL)
+        return;
     if(xmlListEmpty(l))
         return;
 
@@ -631,6 +676,8 @@
 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;
@@ -650,6 +697,8 @@
 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;
@@ -683,6 +732,9 @@
 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
@@ -711,6 +763,8 @@
     /* 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);