OLD | NEW |
1 /* | 1 /* |
2 * xpointer.c : Code to handle XML Pointer | 2 * xpointer.c : Code to handle XML Pointer |
3 * | 3 * |
4 * Base implementation was made accordingly to | 4 * Base implementation was made accordingly to |
5 * W3C Candidate Recommendation 7 June 2000 | 5 * W3C Candidate Recommendation 7 June 2000 |
6 * http://www.w3.org/TR/2000/CR-xptr-20000607 | 6 * http://www.w3.org/TR/2000/CR-xptr-20000607 |
7 * | 7 * |
8 * Added support for the element() scheme described in: | 8 * Added support for the element() scheme described in: |
9 * W3C Proposed Recommendation 13 November 2002 | 9 * W3C Proposed Recommendation 13 November 2002 |
10 * http://www.w3.org/TR/2002/PR-xptr-element-20021113/ | 10 * http://www.w3.org/TR/2002/PR-xptr-element-20021113/ |
(...skipping 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 if (range1->index != range2->index) | 313 if (range1->index != range2->index) |
314 return(0); | 314 return(0); |
315 if (range1->user2 != range2->user2) | 315 if (range1->user2 != range2->user2) |
316 return(0); | 316 return(0); |
317 if (range1->index2 != range2->index2) | 317 if (range1->index2 != range2->index2) |
318 return(0); | 318 return(0); |
319 return(1); | 319 return(1); |
320 } | 320 } |
321 | 321 |
322 /** | 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 |
| 361 /** |
323 * xmlXPtrNewRange: | 362 * xmlXPtrNewRange: |
324 * @start: the starting node | 363 * @start: the starting node |
325 * @startindex: the start index | 364 * @startindex: the start index |
326 * @end: the ending point | 365 * @end: the ending point |
327 * @endindex: the ending index | 366 * @endindex: the ending index |
328 * | 367 * |
329 * Create a new xmlXPathObjectPtr of type range | 368 * Create a new xmlXPathObjectPtr of type range |
330 * | 369 * |
331 * Returns the newly created object. | 370 * Returns the newly created object. |
332 */ | 371 */ |
333 xmlXPathObjectPtr | 372 xmlXPathObjectPtr |
334 xmlXPtrNewRange(xmlNodePtr start, int startindex, | 373 xmlXPtrNewRange(xmlNodePtr start, int startindex, |
335 xmlNodePtr end, int endindex) { | 374 xmlNodePtr end, int endindex) { |
336 xmlXPathObjectPtr ret; | 375 xmlXPathObjectPtr ret; |
337 | 376 |
338 if (start == NULL) | 377 if (start == NULL) |
339 return(NULL); | 378 return(NULL); |
340 if (end == NULL) | 379 if (end == NULL) |
341 return(NULL); | 380 return(NULL); |
342 if (startindex < 0) | 381 if (startindex < 0) |
343 return(NULL); | 382 return(NULL); |
344 if (endindex < 0) | 383 if (endindex < 0) |
345 return(NULL); | 384 return(NULL); |
346 | 385 |
347 ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); | 386 ret = xmlXPtrNewRangeInternal(start, startindex, end, endindex); |
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; | |
358 xmlXPtrRangeCheckOrder(ret); | 387 xmlXPtrRangeCheckOrder(ret); |
359 return(ret); | 388 return(ret); |
360 } | 389 } |
361 | 390 |
362 /** | 391 /** |
363 * xmlXPtrNewRangePoints: | 392 * xmlXPtrNewRangePoints: |
364 * @start: the starting point | 393 * @start: the starting point |
365 * @end: the ending point | 394 * @end: the ending point |
366 * | 395 * |
367 * Create a new xmlXPathObjectPtr of type range using 2 Points | 396 * Create a new xmlXPathObjectPtr of type range using 2 Points |
368 * | 397 * |
369 * Returns the newly created object. | 398 * Returns the newly created object. |
370 */ | 399 */ |
371 xmlXPathObjectPtr | 400 xmlXPathObjectPtr |
372 xmlXPtrNewRangePoints(xmlXPathObjectPtr start, xmlXPathObjectPtr end) { | 401 xmlXPtrNewRangePoints(xmlXPathObjectPtr start, xmlXPathObjectPtr end) { |
373 xmlXPathObjectPtr ret; | 402 xmlXPathObjectPtr ret; |
374 | 403 |
375 if (start == NULL) | 404 if (start == NULL) |
376 return(NULL); | 405 return(NULL); |
377 if (end == NULL) | 406 if (end == NULL) |
378 return(NULL); | 407 return(NULL); |
379 if (start->type != XPATH_POINT) | 408 if (start->type != XPATH_POINT) |
380 return(NULL); | 409 return(NULL); |
381 if (end->type != XPATH_POINT) | 410 if (end->type != XPATH_POINT) |
382 return(NULL); | 411 return(NULL); |
383 | 412 |
384 ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); | 413 ret = xmlXPtrNewRangeInternal(start->user, start->index, end->user, |
385 if (ret == NULL) { | 414 end->index); |
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; | |
395 xmlXPtrRangeCheckOrder(ret); | 415 xmlXPtrRangeCheckOrder(ret); |
396 return(ret); | 416 return(ret); |
397 } | 417 } |
398 | 418 |
399 /** | 419 /** |
400 * xmlXPtrNewRangePointNode: | 420 * xmlXPtrNewRangePointNode: |
401 * @start: the starting point | 421 * @start: the starting point |
402 * @end: the ending node | 422 * @end: the ending node |
403 * | 423 * |
404 * Create a new xmlXPathObjectPtr of type range from a point to a node | 424 * Create a new xmlXPathObjectPtr of type range from a point to a node |
405 * | 425 * |
406 * Returns the newly created object. | 426 * Returns the newly created object. |
407 */ | 427 */ |
408 xmlXPathObjectPtr | 428 xmlXPathObjectPtr |
409 xmlXPtrNewRangePointNode(xmlXPathObjectPtr start, xmlNodePtr end) { | 429 xmlXPtrNewRangePointNode(xmlXPathObjectPtr start, xmlNodePtr end) { |
410 xmlXPathObjectPtr ret; | 430 xmlXPathObjectPtr ret; |
411 | 431 |
412 if (start == NULL) | 432 if (start == NULL) |
413 return(NULL); | 433 return(NULL); |
414 if (end == NULL) | 434 if (end == NULL) |
415 return(NULL); | 435 return(NULL); |
416 if (start->type != XPATH_POINT) | 436 if (start->type != XPATH_POINT) |
417 return(NULL); | 437 return(NULL); |
418 | 438 |
419 ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); | 439 ret = xmlXPtrNewRangeInternal(start->user, start->index, end, -1); |
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; | |
430 xmlXPtrRangeCheckOrder(ret); | 440 xmlXPtrRangeCheckOrder(ret); |
431 return(ret); | 441 return(ret); |
432 } | 442 } |
433 | 443 |
434 /** | 444 /** |
435 * xmlXPtrNewRangeNodePoint: | 445 * xmlXPtrNewRangeNodePoint: |
436 * @start: the starting node | 446 * @start: the starting node |
437 * @end: the ending point | 447 * @end: the ending point |
438 * | 448 * |
439 * Create a new xmlXPathObjectPtr of type range from a node to a point | 449 * Create a new xmlXPathObjectPtr of type range from a node to a point |
440 * | 450 * |
441 * Returns the newly created object. | 451 * Returns the newly created object. |
442 */ | 452 */ |
443 xmlXPathObjectPtr | 453 xmlXPathObjectPtr |
444 xmlXPtrNewRangeNodePoint(xmlNodePtr start, xmlXPathObjectPtr end) { | 454 xmlXPtrNewRangeNodePoint(xmlNodePtr start, xmlXPathObjectPtr end) { |
445 xmlXPathObjectPtr ret; | 455 xmlXPathObjectPtr ret; |
446 | 456 |
447 if (start == NULL) | 457 if (start == NULL) |
448 return(NULL); | 458 return(NULL); |
449 if (end == NULL) | 459 if (end == NULL) |
450 return(NULL); | 460 return(NULL); |
451 if (start->type != XPATH_POINT) | 461 if (start->type != XPATH_POINT) |
452 return(NULL); | 462 return(NULL); |
453 if (end->type != XPATH_POINT) | 463 if (end->type != XPATH_POINT) |
454 return(NULL); | 464 return(NULL); |
455 | 465 |
456 ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); | 466 ret = xmlXPtrNewRangeInternal(start, -1, end->user, end->index); |
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; | |
467 xmlXPtrRangeCheckOrder(ret); | 467 xmlXPtrRangeCheckOrder(ret); |
468 return(ret); | 468 return(ret); |
469 } | 469 } |
470 | 470 |
471 /** | 471 /** |
472 * xmlXPtrNewRangeNodes: | 472 * xmlXPtrNewRangeNodes: |
473 * @start: the starting node | 473 * @start: the starting node |
474 * @end: the ending node | 474 * @end: the ending node |
475 * | 475 * |
476 * Create a new xmlXPathObjectPtr of type range using 2 nodes | 476 * Create a new xmlXPathObjectPtr of type range using 2 nodes |
477 * | 477 * |
478 * Returns the newly created object. | 478 * Returns the newly created object. |
479 */ | 479 */ |
480 xmlXPathObjectPtr | 480 xmlXPathObjectPtr |
481 xmlXPtrNewRangeNodes(xmlNodePtr start, xmlNodePtr end) { | 481 xmlXPtrNewRangeNodes(xmlNodePtr start, xmlNodePtr end) { |
482 xmlXPathObjectPtr ret; | 482 xmlXPathObjectPtr ret; |
483 | 483 |
484 if (start == NULL) | 484 if (start == NULL) |
485 return(NULL); | 485 return(NULL); |
486 if (end == NULL) | 486 if (end == NULL) |
487 return(NULL); | 487 return(NULL); |
488 | 488 |
489 ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); | 489 ret = xmlXPtrNewRangeInternal(start, -1, end, -1); |
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; | |
500 xmlXPtrRangeCheckOrder(ret); | 490 xmlXPtrRangeCheckOrder(ret); |
501 return(ret); | 491 return(ret); |
502 } | 492 } |
503 | 493 |
504 /** | 494 /** |
505 * xmlXPtrNewCollapsedRange: | 495 * xmlXPtrNewCollapsedRange: |
506 * @start: the starting and ending node | 496 * @start: the starting and ending node |
507 * | 497 * |
508 * Create a new xmlXPathObjectPtr of type range using a single nodes | 498 * Create a new xmlXPathObjectPtr of type range using a single nodes |
509 * | 499 * |
510 * Returns the newly created object. | 500 * Returns the newly created object. |
511 */ | 501 */ |
512 xmlXPathObjectPtr | 502 xmlXPathObjectPtr |
513 xmlXPtrNewCollapsedRange(xmlNodePtr start) { | 503 xmlXPtrNewCollapsedRange(xmlNodePtr start) { |
514 xmlXPathObjectPtr ret; | 504 xmlXPathObjectPtr ret; |
515 | 505 |
516 if (start == NULL) | 506 if (start == NULL) |
517 return(NULL); | 507 return(NULL); |
518 | 508 |
519 ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); | 509 ret = xmlXPtrNewRangeInternal(start, -1, NULL, -1); |
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; | |
530 return(ret); | 510 return(ret); |
531 } | 511 } |
532 | 512 |
533 /** | 513 /** |
534 * xmlXPtrNewRangeNodeObject: | 514 * xmlXPtrNewRangeNodeObject: |
535 * @start: the starting node | 515 * @start: the starting node |
536 * @end: the ending object | 516 * @end: the ending object |
537 * | 517 * |
538 * Create a new xmlXPathObjectPtr of type range from a not to an object | 518 * Create a new xmlXPathObjectPtr of type range from a not to an object |
539 * | 519 * |
540 * Returns the newly created object. | 520 * Returns the newly created object. |
541 */ | 521 */ |
542 xmlXPathObjectPtr | 522 xmlXPathObjectPtr |
543 xmlXPtrNewRangeNodeObject(xmlNodePtr start, xmlXPathObjectPtr end) { | 523 xmlXPtrNewRangeNodeObject(xmlNodePtr start, xmlXPathObjectPtr end) { |
| 524 xmlNodePtr endNode; |
| 525 int endIndex; |
544 xmlXPathObjectPtr ret; | 526 xmlXPathObjectPtr ret; |
545 | 527 |
546 if (start == NULL) | 528 if (start == NULL) |
547 return(NULL); | 529 return(NULL); |
548 if (end == NULL) | 530 if (end == NULL) |
549 return(NULL); | 531 return(NULL); |
550 switch (end->type) { | 532 switch (end->type) { |
551 case XPATH_POINT: | 533 case XPATH_POINT: |
| 534 endNode = end->user; |
| 535 endIndex = end->index; |
| 536 break; |
552 case XPATH_RANGE: | 537 case XPATH_RANGE: |
| 538 endNode = end->user2; |
| 539 endIndex = end->index2; |
553 break; | 540 break; |
554 case XPATH_NODESET: | 541 case XPATH_NODESET: |
555 /* | 542 /* |
556 * Empty set ... | 543 * Empty set ... |
557 */ | 544 */ |
558 if (end->nodesetval->nodeNr <= 0) | 545 if (end->nodesetval->nodeNr <= 0) |
559 return(NULL); | 546 return(NULL); |
| 547 endNode = end->nodesetval->nodeTab[end->nodesetval->nodeNr - 1]; |
| 548 endIndex = -1; |
560 break; | 549 break; |
561 default: | 550 default: |
562 /* TODO */ | 551 /* TODO */ |
563 return(NULL); | 552 return(NULL); |
564 } | 553 } |
565 | 554 |
566 ret = (xmlXPathObjectPtr) xmlMalloc(sizeof(xmlXPathObject)); | 555 ret = xmlXPtrNewRangeInternal(start, -1, endNode, endIndex); |
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 } | |
593 xmlXPtrRangeCheckOrder(ret); | 556 xmlXPtrRangeCheckOrder(ret); |
594 return(ret); | 557 return(ret); |
595 } | 558 } |
596 | 559 |
597 #define XML_RANGESET_DEFAULT 10 | 560 #define XML_RANGESET_DEFAULT 10 |
598 | 561 |
599 /** | 562 /** |
600 * xmlXPtrLocationSetCreate: | 563 * xmlXPtrLocationSetCreate: |
601 * @val: an initial xmlXPathObjectPtr, or NULL | 564 * @val: an initial xmlXPathObjectPtr, or NULL |
602 * | 565 * |
(...skipping 2355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2958 } | 2921 } |
2959 | 2922 |
2960 NEXT; | 2923 NEXT; |
2961 SKIP_BLANKS; | 2924 SKIP_BLANKS; |
2962 } | 2925 } |
2963 | 2926 |
2964 #define bottom_xpointer | 2927 #define bottom_xpointer |
2965 #include "elfgcchack.h" | 2928 #include "elfgcchack.h" |
2966 #endif | 2929 #endif |
2967 | 2930 |
OLD | NEW |