* xmlXPathNodeSetMergeAndClearNoDupls: * @set1: the first NodeSet or NULL * @set2: the second NodeSet * * Merges two nodesets, all nodes from @set2 are added to @set1. * Doesn't check for duplicate nodes. Clears set2. * * Returns @set1 once extended or NULL in case of error. * * Frees @set1 in case of error. */
| 3193 | * Frees @set1 in case of error. |
| 3194 | */ |
| 3195 | static xmlNodeSetPtr |
| 3196 | xmlXPathNodeSetMergeAndClearNoDupls(xmlNodeSetPtr set1, xmlNodeSetPtr set2) |
| 3197 | { |
| 3198 | { |
| 3199 | int i; |
| 3200 | xmlNodePtr n2; |
| 3201 | |
| 3202 | for (i = 0;i < set2->nodeNr;i++) { |
| 3203 | n2 = set2->nodeTab[i]; |
| 3204 | if (set1->nodeMax == 0) { |
| 3205 | set1->nodeTab = (xmlNodePtr *) xmlMalloc( |
| 3206 | XML_NODESET_DEFAULT * sizeof(xmlNodePtr)); |
| 3207 | if (set1->nodeTab == NULL) |
| 3208 | goto error; |
| 3209 | memset(set1->nodeTab, 0, |
| 3210 | XML_NODESET_DEFAULT * sizeof(xmlNodePtr)); |
| 3211 | set1->nodeMax = XML_NODESET_DEFAULT; |
| 3212 | } else if (set1->nodeNr >= set1->nodeMax) { |
| 3213 | xmlNodePtr *temp; |
| 3214 | |
| 3215 | if (set1->nodeMax >= XPATH_MAX_NODESET_LENGTH) |
| 3216 | goto error; |
| 3217 | temp = (xmlNodePtr *) xmlRealloc( |
| 3218 | set1->nodeTab, set1->nodeMax * 2 * sizeof(xmlNodePtr)); |
| 3219 | if (temp == NULL) |
| 3220 | goto error; |
| 3221 | set1->nodeTab = temp; |
| 3222 | set1->nodeMax *= 2; |
| 3223 | } |
| 3224 | set1->nodeTab[set1->nodeNr++] = n2; |
| 3225 | set2->nodeTab[i] = NULL; |
| 3226 | } |
| 3227 | } |
| 3228 | set2->nodeNr = 0; |
| 3229 | return(set1); |
| 3230 | |
| 3231 | error: |
| 3232 | xmlXPathFreeNodeSet(set1); |
| 3233 | xmlXPathNodeSetClear(set2, 1); |
| 3234 | return(NULL); |
| 3235 | } |
| 3236 | |
| 3237 | /** |
| 3238 | * xmlXPathNodeSetDel: |
nothing calls this directly
no test coverage detected