Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: third_party/libxml/src/xpointer.c

Issue 2121073002: Add a helper function for allocating XPointer ranges. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/libxml/README.chromium ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « third_party/libxml/README.chromium ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698