| 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 |