pupnp (libupnp) snapshot from SourceForge: git clone git://pupnp.git.sourceforge...
[igd2-for-linux:pandonghui1211s-igd2-for-linux.git] / pupnp_branch-1.6.x / ixml / src / nodeList.c
1 /*******************************************************************************
2  *
3  * Copyright (c) 2000-2003 Intel Corporation 
4  * All rights reserved. 
5  *
6  * Redistribution and use in source and binary forms, with or without 
7  * modification, are permitted provided that the following conditions are met: 
8  *
9  * - Redistributions of source code must retain the above copyright notice, 
10  * this list of conditions and the following disclaimer. 
11  * - Redistributions in binary form must reproduce the above copyright notice, 
12  * this list of conditions and the following disclaimer in the documentation 
13  * and/or other materials provided with the distribution. 
14  * - Neither name of Intel Corporation nor the names of its contributors 
15  * may be used to endorse or promote products derived from this software 
16  * without specific prior written permission.
17  * 
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR 
22  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
23  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
24  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
25  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 
26  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
28  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  *
30  ******************************************************************************/
31
32
33 /*!
34  * \file
35  */
36
37
38 #include "ixmlparser.h"
39
40
41 #include <assert.h>
42 #include <string.h>
43
44
45 void ixmlNodeList_init(IXML_NodeList *nList)
46 {
47         assert(nList != NULL);
48
49         memset(nList, 0, sizeof (IXML_NodeList));
50 }
51
52
53 IXML_Node *ixmlNodeList_item(
54         IXML_NodeList *nList,
55         unsigned long index)
56 {
57         IXML_NodeList *next;
58         unsigned int i;
59
60         // if the list ptr is NULL
61         if (nList == NULL) {
62                 return NULL;
63         }
64         // if index is more than list length
65         if (index > ixmlNodeList_length(nList) - 1) {
66                 return NULL;
67         }
68
69         next = nList;
70         for (i = 0; i < index && next != NULL; ++i) {
71                 next = next->next;
72         }
73
74         if (next == NULL) {
75                 return NULL;
76         }
77
78         return next->nodeItem;
79 }
80
81 int ixmlNodeList_addToNodeList(
82         IXML_NodeList **nList,
83         IXML_Node *add)
84 {
85         IXML_NodeList *traverse = NULL;
86         IXML_NodeList *p = NULL;
87         IXML_NodeList *newListItem;
88
89         assert(add != NULL);
90
91         if (add == NULL) {
92                 return IXML_FAILED;
93         }
94
95         if (*nList == NULL) {
96                 // nodelist is empty
97                 *nList = (IXML_NodeList *)malloc(sizeof (IXML_NodeList));
98                 if (*nList == NULL) {
99                         return IXML_INSUFFICIENT_MEMORY;
100                 }
101
102                 ixmlNodeList_init(*nList);
103         }
104
105         if ((*nList)->nodeItem == NULL) {
106                 (*nList)->nodeItem = add;
107         } else {
108                 traverse = *nList;
109                 while (traverse != NULL) {
110                         p = traverse;
111                         traverse = traverse->next;
112                 }
113
114                 newListItem = (IXML_NodeList *)malloc(sizeof (IXML_NodeList));
115                 if (newListItem == NULL) {
116                         return IXML_INSUFFICIENT_MEMORY;
117                 }
118                 p->next = newListItem;
119                 newListItem->nodeItem = add;
120                 newListItem->next = NULL;
121         }
122
123         return IXML_SUCCESS;
124 }
125
126
127 unsigned long ixmlNodeList_length(IXML_NodeList *nList)
128 {
129         IXML_NodeList *list;
130         unsigned long length = 0;
131
132         list = nList;
133         while (list != NULL) {
134                 ++length;
135                 list = list->next;
136         }
137
138         return length;
139 }
140
141
142 void ixmlNodeList_free(IXML_NodeList *nList)
143 {
144         IXML_NodeList *next;
145
146         while (nList != NULL) {
147                 next = nList->next;
148                 free(nList);
149                 nList = next;
150         }
151 }
152