UPnPsdk 0.1
Universal Plug and Play +, Software Development Kit
 
Loading...
Searching...
No Matches
namedNodeMap.cpp
Go to the documentation of this file.
1/**************************************************************************
2 *
3 * Copyright (c) 2000-2003 Intel Corporation
4 * All rights reserved.
5 * Copyright (c) 2012 France Telecom All rights reserved.
6 * Copyright (C) 2022 GPL 3 and higher by Ingo Höft, <Ingo@Hoeft-online.de>
7 * Redistribution only with this Copyright remark. Last modified: 2025-05-29
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions are met:
11 *
12 * - Redistributions of source code must retain the above copyright notice,
13 * this list of conditions and the following disclaimer.
14 * - Redistributions in binary form must reproduce the above copyright notice,
15 * this list of conditions and the following disclaimer in the documentation
16 * and/or other materials provided with the distribution.
17 * - Neither name of Intel Corporation nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
25 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
26 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
27 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
29 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 *
33 **************************************************************************/
34
39#include <ixml/ixmlparser.hpp>
40
41#include <cassert>
42#include <cstring>
43
47static unsigned long ixmlNamedNodeMap_getItemNumber(
49 IXML_NamedNodeMap* nnMap,
51 const char* name) {
52 IXML_Node* tempNode;
53 unsigned long returnItemNo = 0lu;
54
55 assert(nnMap != NULL && name != NULL);
56 if (nnMap == NULL || name == NULL) {
57 return (unsigned long)IXML_INVALID_ITEM_NUMBER;
58 }
59
60 tempNode = nnMap->nodeItem;
61 while (tempNode != NULL) {
62 if (strcmp(name, tempNode->nodeName) == 0) {
63 return returnItemNo;
64 }
65 tempNode = tempNode->nextSibling;
66 returnItemNo++;
67 }
68
69 return (unsigned long)IXML_INVALID_ITEM_NUMBER;
70}
71
73 assert(nnMap != NULL);
74
75 memset(nnMap, 0, sizeof(IXML_NamedNodeMap));
76}
77
79 const DOMString name) {
80 unsigned long index;
81
82 if (nnMap == NULL || name == NULL) {
83 return NULL;
84 }
85
86 index = ixmlNamedNodeMap_getItemNumber(nnMap, name);
87 if (index == (unsigned long)IXML_INVALID_ITEM_NUMBER) {
88 return NULL;
89 } else {
90 return ixmlNamedNodeMap_item(nnMap, index);
91 }
92}
93
95 /* IN */ IXML_NamedNodeMap* nnMap,
96 /* IN */ unsigned long index) {
97 IXML_Node* tempNode;
98 unsigned int i;
99
100 if (nnMap == NULL) {
101 return NULL;
102 }
103
104 if (index > ixmlNamedNodeMap_getLength(nnMap) - 1lu) {
105 return NULL;
106 }
107
108 tempNode = nnMap->nodeItem;
109 for (i = 0u; i < index && tempNode != NULL; ++i) {
110 tempNode = tempNode->nextSibling;
111 }
112
113 return tempNode;
114}
115
117 IXML_Node* tempNode;
118 unsigned long length = 0lu;
119
120 if (nnMap != NULL) {
121 tempNode = nnMap->nodeItem;
122 for (length = 0lu; tempNode != NULL; ++length) {
123 tempNode = tempNode->nextSibling;
124 }
125 }
126
127 return length;
128}
129
131 IXML_NamedNodeMap* pNext;
132
133 while (nnMap != NULL) {
134 pNext = nnMap->next;
135 free(nnMap);
136 nnMap = pNext;
137 }
138}
139
141 IXML_Node* add) {
142 IXML_NamedNodeMap* traverse = NULL;
143 IXML_NamedNodeMap* p = NULL;
144 IXML_NamedNodeMap* newItem = NULL;
145
146 if (add == NULL) {
147 return IXML_SUCCESS;
148 }
149
150 if (*nnMap == NULL) {
151 /* nodelist is empty */
152 *nnMap = (IXML_NamedNodeMap*)malloc(sizeof(IXML_NamedNodeMap));
153 if (*nnMap == NULL) {
154 return IXML_INSUFFICIENT_MEMORY;
155 }
156 ixmlNamedNodeMap_init(*nnMap);
157 }
158 if ((*nnMap)->nodeItem == NULL) {
159 (*nnMap)->nodeItem = add;
160 } else {
161 traverse = *nnMap;
162 p = traverse;
163 while (traverse != NULL) {
164 p = traverse;
165 traverse = traverse->next;
166 }
167 newItem = (IXML_NamedNodeMap*)malloc(sizeof(IXML_NamedNodeMap));
168 if (newItem == NULL) {
169 return IXML_INSUFFICIENT_MEMORY;
170 }
171 p->next = newItem;
172 newItem->nodeItem = add;
173 newItem->next = NULL;
174 }
175
176 return IXML_SUCCESS;
177}
Data structure common to all types of nodes.
Definition ixml.hpp:132
Data structure representing a list of named nodes.
Definition ixml.hpp:201
unsigned long ixmlNamedNodeMap_getLength(IXML_NamedNodeMap *nnMap)
Returns the number of items contained in this NamedNodeMap.
#define DOMString
The type of DOM strings.
Definition ixml.hpp:47
IXML_Node * ixmlNamedNodeMap_getNamedItem(IXML_NamedNodeMap *nnMap, const DOMString name)
Retrieves a Node from the NamedNodeMap by name.
IXML_Node * ixmlNamedNodeMap_item(IXML_NamedNodeMap *nnMap, unsigned long index)
Retrieves the indexth item in the map. If index is greater than or equal to the number of nodes in th...
void ixmlNamedNodeMap_free(IXML_NamedNodeMap *nnMap)
Frees a NamedNodeMap.
void ixmlNamedNodeMap_init(IXML_NamedNodeMap *nnMap)
Initializes a NamedNodeMap object.
int ixmlNamedNodeMap_addToNamedNodeMap(IXML_NamedNodeMap **nnMap, IXML_Node *add)
Add a node to a NamedNodeMap.
static unsigned long ixmlNamedNodeMap_getItemNumber(IXML_NamedNodeMap *nnMap, const char *name)
Return the item number of a item in NamedNodeMap.