@@ -319,6 +319,45 @@ xmlXPtrRangesEqual(xmlXPathObjectPtr range1, xmlXPathObjectPtr range2) {
319
319
return (1 );
320
320
}
321
321
322
+ /**
323
+ * xmlXPtrNewRangeInternal:
324
+ * @start: the starting node
325
+ * @startindex: the start index
326
+ * @end: the ending point
327
+ * @endindex: the ending index
328
+ *
329
+ * Internal function to create a new xmlXPathObjectPtr of type range
330
+ *
331
+ * Returns the newly created object.
332
+ */
333
+ static xmlXPathObjectPtr
334
+ xmlXPtrNewRangeInternal (xmlNodePtr start , int startindex ,
335
+ xmlNodePtr end , int endindex ) {
336
+ xmlXPathObjectPtr ret ;
337
+
338
+ /*
339
+ * Namespace nodes must be copied (see xmlXPathNodeSetDupNs).
340
+ * Disallow them for now.
341
+ */
342
+ if ((start != NULL ) && (start -> type == XML_NAMESPACE_DECL ))
343
+ return (NULL );
344
+ if ((end != NULL ) && (end -> type == XML_NAMESPACE_DECL ))
345
+ return (NULL );
346
+
347
+ ret = (xmlXPathObjectPtr ) xmlMalloc (sizeof (xmlXPathObject ));
348
+ if (ret == NULL ) {
349
+ xmlXPtrErrMemory ("allocating range" );
350
+ return (NULL );
351
+ }
352
+ memset (ret , 0 , sizeof (xmlXPathObject ));
353
+ ret -> type = XPATH_RANGE ;
354
+ ret -> user = start ;
355
+ ret -> index = startindex ;
356
+ ret -> user2 = end ;
357
+ ret -> index2 = endindex ;
358
+ return (ret );
359
+ }
360
+
322
361
/**
323
362
* xmlXPtrNewRange:
324
363
* @start: the starting node
@@ -344,17 +383,7 @@ xmlXPtrNewRange(xmlNodePtr start, int startindex,
344
383
if (endindex < 0 )
345
384
return (NULL );
346
385
347
- ret = (xmlXPathObjectPtr ) xmlMalloc (sizeof (xmlXPathObject ));
348
- if (ret == NULL ) {
349
- xmlXPtrErrMemory ("allocating range" );
350
- return (NULL );
351
- }
352
- memset (ret , 0 , (size_t ) sizeof (xmlXPathObject ));
353
- ret -> type = XPATH_RANGE ;
354
- ret -> user = start ;
355
- ret -> index = startindex ;
356
- ret -> user2 = end ;
357
- ret -> index2 = endindex ;
386
+ ret = xmlXPtrNewRangeInternal (start , startindex , end , endindex );
358
387
xmlXPtrRangeCheckOrder (ret );
359
388
return (ret );
360
389
}
@@ -381,17 +410,8 @@ xmlXPtrNewRangePoints(xmlXPathObjectPtr start, xmlXPathObjectPtr end) {
381
410
if (end -> type != XPATH_POINT )
382
411
return (NULL );
383
412
384
- ret = (xmlXPathObjectPtr ) xmlMalloc (sizeof (xmlXPathObject ));
385
- if (ret == NULL ) {
386
- xmlXPtrErrMemory ("allocating range" );
387
- return (NULL );
388
- }
389
- memset (ret , 0 , (size_t ) sizeof (xmlXPathObject ));
390
- ret -> type = XPATH_RANGE ;
391
- ret -> user = start -> user ;
392
- ret -> index = start -> index ;
393
- ret -> user2 = end -> user ;
394
- ret -> index2 = end -> index ;
413
+ ret = xmlXPtrNewRangeInternal (start -> user , start -> index , end -> user ,
414
+ end -> index );
395
415
xmlXPtrRangeCheckOrder (ret );
396
416
return (ret );
397
417
}
@@ -416,17 +436,7 @@ xmlXPtrNewRangePointNode(xmlXPathObjectPtr start, xmlNodePtr end) {
416
436
if (start -> type != XPATH_POINT )
417
437
return (NULL );
418
438
419
- ret = (xmlXPathObjectPtr ) xmlMalloc (sizeof (xmlXPathObject ));
420
- if (ret == NULL ) {
421
- xmlXPtrErrMemory ("allocating range" );
422
- return (NULL );
423
- }
424
- memset (ret , 0 , (size_t ) sizeof (xmlXPathObject ));
425
- ret -> type = XPATH_RANGE ;
426
- ret -> user = start -> user ;
427
- ret -> index = start -> index ;
428
- ret -> user2 = end ;
429
- ret -> index2 = -1 ;
439
+ ret = xmlXPtrNewRangeInternal (start -> user , start -> index , end , -1 );
430
440
xmlXPtrRangeCheckOrder (ret );
431
441
return (ret );
432
442
}
@@ -453,17 +463,7 @@ xmlXPtrNewRangeNodePoint(xmlNodePtr start, xmlXPathObjectPtr end) {
453
463
if (end -> type != XPATH_POINT )
454
464
return (NULL );
455
465
456
- ret = (xmlXPathObjectPtr ) xmlMalloc (sizeof (xmlXPathObject ));
457
- if (ret == NULL ) {
458
- xmlXPtrErrMemory ("allocating range" );
459
- return (NULL );
460
- }
461
- memset (ret , 0 , (size_t ) sizeof (xmlXPathObject ));
462
- ret -> type = XPATH_RANGE ;
463
- ret -> user = start ;
464
- ret -> index = -1 ;
465
- ret -> user2 = end -> user ;
466
- ret -> index2 = end -> index ;
466
+ ret = xmlXPtrNewRangeInternal (start , -1 , end -> user , end -> index );
467
467
xmlXPtrRangeCheckOrder (ret );
468
468
return (ret );
469
469
}
@@ -486,17 +486,7 @@ xmlXPtrNewRangeNodes(xmlNodePtr start, xmlNodePtr end) {
486
486
if (end == NULL )
487
487
return (NULL );
488
488
489
- ret = (xmlXPathObjectPtr ) xmlMalloc (sizeof (xmlXPathObject ));
490
- if (ret == NULL ) {
491
- xmlXPtrErrMemory ("allocating range" );
492
- return (NULL );
493
- }
494
- memset (ret , 0 , (size_t ) sizeof (xmlXPathObject ));
495
- ret -> type = XPATH_RANGE ;
496
- ret -> user = start ;
497
- ret -> index = -1 ;
498
- ret -> user2 = end ;
499
- ret -> index2 = -1 ;
489
+ ret = xmlXPtrNewRangeInternal (start , -1 , end , -1 );
500
490
xmlXPtrRangeCheckOrder (ret );
501
491
return (ret );
502
492
}
@@ -516,17 +506,7 @@ xmlXPtrNewCollapsedRange(xmlNodePtr start) {
516
506
if (start == NULL )
517
507
return (NULL );
518
508
519
- ret = (xmlXPathObjectPtr ) xmlMalloc (sizeof (xmlXPathObject ));
520
- if (ret == NULL ) {
521
- xmlXPtrErrMemory ("allocating range" );
522
- return (NULL );
523
- }
524
- memset (ret , 0 , (size_t ) sizeof (xmlXPathObject ));
525
- ret -> type = XPATH_RANGE ;
526
- ret -> user = start ;
527
- ret -> index = -1 ;
528
- ret -> user2 = NULL ;
529
- ret -> index2 = -1 ;
509
+ ret = xmlXPtrNewRangeInternal (start , -1 , NULL , -1 );
530
510
return (ret );
531
511
}
532
512
@@ -541,6 +521,8 @@ xmlXPtrNewCollapsedRange(xmlNodePtr start) {
541
521
*/
542
522
xmlXPathObjectPtr
543
523
xmlXPtrNewRangeNodeObject (xmlNodePtr start , xmlXPathObjectPtr end ) {
524
+ xmlNodePtr endNode ;
525
+ int endIndex ;
544
526
xmlXPathObjectPtr ret ;
545
527
546
528
if (start == NULL )
@@ -549,47 +531,28 @@ xmlXPtrNewRangeNodeObject(xmlNodePtr start, xmlXPathObjectPtr end) {
549
531
return (NULL );
550
532
switch (end -> type ) {
551
533
case XPATH_POINT :
534
+ endNode = end -> user ;
535
+ endIndex = end -> index ;
536
+ break ;
552
537
case XPATH_RANGE :
538
+ endNode = end -> user2 ;
539
+ endIndex = end -> index2 ;
553
540
break ;
554
541
case XPATH_NODESET :
555
542
/*
556
543
* Empty set ...
557
544
*/
558
545
if (end -> nodesetval -> nodeNr <= 0 )
559
546
return (NULL );
547
+ endNode = end -> nodesetval -> nodeTab [end -> nodesetval -> nodeNr - 1 ];
548
+ endIndex = -1 ;
560
549
break ;
561
550
default :
562
551
/* TODO */
563
552
return (NULL );
564
553
}
565
554
566
- ret = (xmlXPathObjectPtr ) xmlMalloc (sizeof (xmlXPathObject ));
567
- if (ret == NULL ) {
568
- xmlXPtrErrMemory ("allocating range" );
569
- return (NULL );
570
- }
571
- memset (ret , 0 , (size_t ) sizeof (xmlXPathObject ));
572
- ret -> type = XPATH_RANGE ;
573
- ret -> user = start ;
574
- ret -> index = -1 ;
575
- switch (end -> type ) {
576
- case XPATH_POINT :
577
- ret -> user2 = end -> user ;
578
- ret -> index2 = end -> index ;
579
- break ;
580
- case XPATH_RANGE :
581
- ret -> user2 = end -> user2 ;
582
- ret -> index2 = end -> index2 ;
583
- break ;
584
- case XPATH_NODESET : {
585
- ret -> user2 = end -> nodesetval -> nodeTab [end -> nodesetval -> nodeNr - 1 ];
586
- ret -> index2 = -1 ;
587
- break ;
588
- }
589
- default :
590
- STRANGE
591
- return (NULL );
592
- }
555
+ ret = xmlXPtrNewRangeInternal (start , -1 , endNode , endIndex );
593
556
xmlXPtrRangeCheckOrder (ret );
594
557
return (ret );
595
558
}
0 commit comments