Coverage Report

Created: 2025-08-26 06:22

/src/pupnp/ixml/src/namedNodeMap.c
Line
Count
Source (jump to first uncovered line)
1
/**************************************************************************
2
 *
3
 * Copyright (c) 2000-2003 Intel Corporation
4
 * All rights reserved.
5
 * Copyright (c) 2012 France Telecom All rights reserved.
6
 *
7
 * Redistribution and use in source and binary forms, with or without
8
 * modification, are permitted provided that the following conditions are met:
9
 *
10
 * - Redistributions of source code must retain the above copyright notice,
11
 * this list of conditions and the following disclaimer.
12
 * - Redistributions in binary form must reproduce the above copyright notice,
13
 * this list of conditions and the following disclaimer in the documentation
14
 * and/or other materials provided with the distribution.
15
 * - Neither name of Intel Corporation nor the names of its contributors
16
 * may be used to endorse or promote products derived from this software
17
 * without specific prior written permission.
18
 *
19
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTEL OR
23
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
24
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
26
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
27
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
 *
31
 **************************************************************************/
32
33
/*!
34
 * \file
35
 */
36
37
#include "ixmlparser.h"
38
39
#include <assert.h>
40
#include <stdlib.h> /* for free(), malloc() */
41
#include <string.h>
42
43
/*!
44
 * \brief Return the item number of a item in NamedNodeMap.
45
 */
46
static unsigned long ixmlNamedNodeMap_getItemNumber(
47
  /*! [in] The named node map to process. */
48
  IXML_NamedNodeMap *nnMap,
49
  /*! [in] The name of the item to find. */
50
  const char *name)
51
0
{
52
0
  IXML_Node *tempNode;
53
0
  unsigned long returnItemNo = 0lu;
54
55
0
  assert(nnMap != NULL && name != NULL);
56
0
  if (nnMap == NULL || name == NULL) {
57
0
    return (unsigned long)IXML_INVALID_ITEM_NUMBER;
58
0
  }
59
60
0
  tempNode = nnMap->nodeItem;
61
0
  while (tempNode != NULL) {
62
0
    if (strcmp(name, tempNode->nodeName) == 0) {
63
0
      return returnItemNo;
64
0
    }
65
0
    tempNode = tempNode->nextSibling;
66
0
    returnItemNo++;
67
0
  }
68
69
0
  return (unsigned long)IXML_INVALID_ITEM_NUMBER;
70
0
}
71
72
void ixmlNamedNodeMap_init(IXML_NamedNodeMap *nnMap)
73
0
{
74
0
  assert(nnMap != NULL);
75
76
0
  memset(nnMap, 0, sizeof(IXML_NamedNodeMap));
77
0
}
78
79
IXML_Node *ixmlNamedNodeMap_getNamedItem(
80
  IXML_NamedNodeMap *nnMap, const DOMString name)
81
0
{
82
0
  unsigned long index;
83
84
0
  if (nnMap == NULL || name == NULL) {
85
0
    return NULL;
86
0
  }
87
88
0
  index = ixmlNamedNodeMap_getItemNumber(nnMap, name);
89
0
  if (index == (unsigned long)IXML_INVALID_ITEM_NUMBER) {
90
0
    return NULL;
91
0
  } else {
92
0
    return ixmlNamedNodeMap_item(nnMap, index);
93
0
  }
94
0
}
95
96
IXML_Node *ixmlNamedNodeMap_item(
97
  /* IN */ IXML_NamedNodeMap *nnMap,
98
  /* IN */ unsigned long index)
99
0
{
100
0
  IXML_Node *tempNode;
101
0
  unsigned int i;
102
103
0
  if (nnMap == NULL) {
104
0
    return NULL;
105
0
  }
106
107
0
  if (index > ixmlNamedNodeMap_getLength(nnMap) - 1lu) {
108
0
    return NULL;
109
0
  }
110
111
0
  tempNode = nnMap->nodeItem;
112
0
  for (i = 0u; i < index && tempNode != NULL; ++i) {
113
0
    tempNode = tempNode->nextSibling;
114
0
  }
115
116
0
  return tempNode;
117
0
}
118
119
unsigned long ixmlNamedNodeMap_getLength(IXML_NamedNodeMap *nnMap)
120
0
{
121
0
  IXML_Node *tempNode;
122
0
  unsigned long length = 0lu;
123
124
0
  if (nnMap != NULL) {
125
0
    tempNode = nnMap->nodeItem;
126
0
    for (length = 0lu; tempNode != NULL; ++length) {
127
0
      tempNode = tempNode->nextSibling;
128
0
    }
129
0
  }
130
131
0
  return length;
132
0
}
133
134
void ixmlNamedNodeMap_free(IXML_NamedNodeMap *nnMap)
135
0
{
136
0
  IXML_NamedNodeMap *pNext;
137
138
0
  while (nnMap != NULL) {
139
0
    pNext = nnMap->next;
140
0
    free(nnMap);
141
0
    nnMap = pNext;
142
0
  }
143
0
}
144
145
int ixmlNamedNodeMap_addToNamedNodeMap(
146
  IXML_NamedNodeMap **nnMap, IXML_Node *add)
147
0
{
148
0
  IXML_NamedNodeMap *traverse = NULL;
149
0
  IXML_NamedNodeMap *p = NULL;
150
0
  IXML_NamedNodeMap *newItem = NULL;
151
152
0
  if (add == NULL) {
153
0
    return IXML_SUCCESS;
154
0
  }
155
156
0
  if (*nnMap == NULL) {
157
    /* nodelist is empty */
158
0
    *nnMap = (IXML_NamedNodeMap *)malloc(sizeof(IXML_NamedNodeMap));
159
0
    if (*nnMap == NULL) {
160
0
      return IXML_INSUFFICIENT_MEMORY;
161
0
    }
162
0
    ixmlNamedNodeMap_init(*nnMap);
163
0
  }
164
0
  if ((*nnMap)->nodeItem == NULL) {
165
0
    (*nnMap)->nodeItem = add;
166
0
  } else {
167
0
    traverse = *nnMap;
168
0
    p = traverse;
169
0
    while (traverse != NULL) {
170
0
      p = traverse;
171
0
      traverse = traverse->next;
172
0
    }
173
0
    newItem =
174
0
      (IXML_NamedNodeMap *)malloc(sizeof(IXML_NamedNodeMap));
175
0
    if (newItem == NULL) {
176
0
      return IXML_INSUFFICIENT_MEMORY;
177
0
    }
178
0
    p->next = newItem;
179
0
    newItem->nodeItem = add;
180
0
    newItem->next = NULL;
181
0
  }
182
183
0
  return IXML_SUCCESS;
184
0
}