Differences From Artifact [86a5942568]:
- File src/OFXMLParser.m — part of check-in [a69e13fa8d] at 2013-08-01 23:07:24 on branch trunk — OFXMLParser: Improve handling of whitespaces. (user: js, size: 24293) [annotate] [blame] [check-ins using]
To Artifact [b80861f91e]:
- File
src/OFXMLParser.m
— part of check-in
[fa6496efc7]
at
2013-12-05 17:48:11
on branch trunk
— Make coding style consistent.
A file documenting the coding style will be written soon. This will
hopefully prevent conflicts in the future, such as whether static
functions are written in camelCase or_with_underscores, like was the
case here. (user: js, size: 24283) [annotate] [blame] [check-ins using]
︙ | ︙ | |||
38 39 40 41 42 43 44 | #import "macros.h" typedef void (*state_function)(id, SEL); static SEL selectors[OF_XMLPARSER_NUM_STATES]; static state_function lookupTable[OF_XMLPARSER_NUM_STATES]; static OF_INLINE void | | | | 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #import "macros.h" typedef void (*state_function)(id, SEL); static SEL selectors[OF_XMLPARSER_NUM_STATES]; static state_function lookupTable[OF_XMLPARSER_NUM_STATES]; static OF_INLINE void appendToBuffer(OFDataArray *buffer, const char *string, of_string_encoding_t encoding, size_t length) { if (OF_LIKELY(encoding == OF_STRING_ENCODING_UTF_8)) [buffer addItems: string count: length]; else { void *pool = objc_autoreleasePoolPush(); OFString *tmp = [OFString stringWithCString: string encoding: encoding length: length]; [buffer addItems: [tmp UTF8String] count: [tmp UTF8StringLength]]; objc_autoreleasePoolPop(pool); } } static OFString* transformString(OFDataArray *buffer, size_t cut, bool unescape, id <OFStringXMLUnescapingDelegate> delegate) { char *items; size_t i, length; bool hasEntities = false; OFString *ret; |
︙ | ︙ | |||
91 92 93 94 95 96 97 | if (unescape && hasEntities) return [ret stringByXMLUnescapingWithDelegate: delegate]; return ret; } static OFString* | | | | | 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | if (unescape && hasEntities) return [ret stringByXMLUnescapingWithDelegate: delegate]; return ret; } static OFString* namespaceForPrefix(OFString *prefix, OFArray *namespaces) { OFDictionary **objects = [namespaces objects]; ssize_t i; if (prefix == nil) prefix = @""; for (i = [namespaces count] - 1; i >= 0; i--) { OFString *tmp; if ((tmp = [objects[i] objectForKey: prefix]) != nil) return tmp; } return nil; } static OF_INLINE void resolveAttributeNamespace(OFXMLAttribute *attribute, OFArray *namespaces, OFXMLParser *self) { OFString *attributeNS; OFString *attributePrefix = attribute->_namespace; if (attributePrefix == nil) return; attributeNS = namespaceForPrefix(attributePrefix, namespaces); if ((attributePrefix != nil && attributeNS == nil)) @throw [OFUnboundPrefixException exceptionWithPrefix: attributePrefix parser: self]; [attribute->_namespace release]; |
︙ | ︙ | |||
264 265 266 267 268 269 270 | _lineNumber++; _lastCarriageReturn = (_data[_i] == '\r'); } /* In OF_XMLPARSER_IN_TAG, there can be only spaces */ if (length - _last > 0 && _state != OF_XMLPARSER_IN_TAG) | | | 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 | _lineNumber++; _lastCarriageReturn = (_data[_i] == '\r'); } /* In OF_XMLPARSER_IN_TAG, there can be only spaces */ if (length - _last > 0 && _state != OF_XMLPARSER_IN_TAG) appendToBuffer(_buffer, _data + _last, _encoding, length - _last); } - (void)parseString: (OFString*)string { [self parseBuffer: [string UTF8String] length: [string UTF8StringLength]]; |
︙ | ︙ | |||
342 343 344 345 346 347 348 | _data[_i] != '<') @throw [OFMalformedXMLException exceptionWithParser: self]; if (_data[_i] != '<') return; if ((length = _i - _last) > 0) | | | | 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 | _data[_i] != '<') @throw [OFMalformedXMLException exceptionWithParser: self]; if (_data[_i] != '<') return; if ((length = _i - _last) > 0) appendToBuffer(_buffer, _data + _last, _encoding, length); if ([_buffer count] > 0) { void *pool = objc_autoreleasePoolPush(); OFString *characters = transformString(_buffer, 0, true, self); if ([_delegate respondsToSelector: @selector(parser:foundCharacters:)]) [_delegate parser: self foundCharacters: characters]; objc_autoreleasePoolPop(pool); |
︙ | ︙ | |||
507 508 509 510 511 512 513 | { if (_data[_i] == '?') _level = 1; else if (_level == 1 && _data[_i] == '>') { void *pool = objc_autoreleasePoolPush(); OFString *PI; | | | | 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 | { if (_data[_i] == '?') _level = 1; else if (_level == 1 && _data[_i] == '>') { void *pool = objc_autoreleasePoolPush(); OFString *PI; appendToBuffer(_buffer, _data + _last, _encoding, _i - _last); PI = transformString(_buffer, 1, false, nil); if ([PI isEqual: @"xml"] || [PI hasPrefix: @"xml "] || [PI hasPrefix: @"xml\t"] || [PI hasPrefix: @"xml\r"] || [PI hasPrefix: @"xml\n"]) if (![self OF_parseXMLProcessingInstructions: PI]) @throw [OFMalformedXMLException exceptionWithParser: self]; |
︙ | ︙ | |||
545 546 547 548 549 550 551 | OFString *bufferString; if (_data[_i] != ' ' && _data[_i] != '\t' && _data[_i] != '\n' && _data[_i] != '\r' && _data[_i] != '>' && _data[_i] != '/') return; if ((length = _i - _last) > 0) | | | 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 | OFString *bufferString; if (_data[_i] != ' ' && _data[_i] != '\t' && _data[_i] != '\n' && _data[_i] != '\r' && _data[_i] != '>' && _data[_i] != '/') return; if ((length = _i - _last) > 0) appendToBuffer(_buffer, _data + _last, _encoding, length); pool = objc_autoreleasePoolPush(); bufferCString = [_buffer items]; bufferLength = [_buffer count]; bufferString = [OFString stringWithUTF8String: bufferCString length: bufferLength]; |
︙ | ︙ | |||
570 571 572 573 574 575 576 | _name = [bufferString copy]; _prefix = nil; } if (_data[_i] == '>' || _data[_i] == '/') { OFString *namespace; | | | 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 | _name = [bufferString copy]; _prefix = nil; } if (_data[_i] == '>' || _data[_i] == '/') { OFString *namespace; namespace = namespaceForPrefix(_prefix, _namespaces); if (_prefix != nil && namespace == nil) @throw [OFUnboundPrefixException exceptionWithPrefix: _prefix parser: self]; if ([_delegate respondsToSelector: @selector(parser: |
︙ | ︙ | |||
630 631 632 633 634 635 636 | OFString *bufferString, *namespace; if (_data[_i] != ' ' && _data[_i] != '\t' && _data[_i] != '\n' && _data[_i] != '\r' && _data[_i] != '>') return; if ((length = _i - _last) > 0) | | | 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 | OFString *bufferString, *namespace; if (_data[_i] != ' ' && _data[_i] != '\t' && _data[_i] != '\n' && _data[_i] != '\r' && _data[_i] != '>') return; if ((length = _i - _last) > 0) appendToBuffer(_buffer, _data + _last, _encoding, length); pool = objc_autoreleasePoolPush(); bufferCString = [_buffer items]; bufferLength = [_buffer count]; bufferString = [OFString stringWithUTF8String: bufferCString length: bufferLength]; |
︙ | ︙ | |||
659 660 661 662 663 664 665 | if (![[_previous lastObject] isEqual: bufferString]) @throw [OFMalformedXMLException exceptionWithParser: self]; [_previous removeLastObject]; [_buffer removeAllItems]; | | | 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 | if (![[_previous lastObject] isEqual: bufferString]) @throw [OFMalformedXMLException exceptionWithParser: self]; [_previous removeLastObject]; [_buffer removeAllItems]; namespace = namespaceForPrefix(_prefix, _namespaces); if (_prefix != nil && namespace == nil) @throw [OFUnboundPrefixException exceptionWithPrefix: _prefix parser: self]; if ([_delegate respondsToSelector: @selector(parser:didEndElement:prefix:namespace:)]) [_delegate parser: self |
︙ | ︙ | |||
709 710 711 712 713 714 715 | return; } attributesObjects = [_attributes objects]; attributesCount = [_attributes count]; | | | | 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 | return; } attributesObjects = [_attributes objects]; attributesCount = [_attributes count]; namespace = namespaceForPrefix(_prefix, _namespaces); if (_prefix != nil && namespace == nil) @throw [OFUnboundPrefixException exceptionWithPrefix: _prefix parser: self]; for (j = 0; j < attributesCount; j++) resolveAttributeNamespace(attributesObjects[j], _namespaces, self); pool = objc_autoreleasePoolPush(); if ([_delegate respondsToSelector: @selector(parser:didStartElement:prefix:namespace:attributes:)]) [_delegate parser: self |
︙ | ︙ | |||
774 775 776 777 778 779 780 | size_t length, bufferLength; if (_data[_i] != '=' && _data[_i] != ' ' && _data[_i] != '\t' && _data[_i] != '\n' && _data[_i] != '\r') return; if ((length = _i - _last) > 0) | | | 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 | size_t length, bufferLength; if (_data[_i] != '=' && _data[_i] != ' ' && _data[_i] != '\t' && _data[_i] != '\n' && _data[_i] != '\r') return; if ((length = _i - _last) > 0) appendToBuffer(_buffer, _data + _last, _encoding, length); pool = objc_autoreleasePoolPush(); bufferString = [OFString stringWithUTF8String: [_buffer items] length: [_buffer count]]; bufferCString = [bufferString UTF8String]; |
︙ | ︙ | |||
848 849 850 851 852 853 854 | OFString *attributeValue; size_t length; if (_data[_i] != _delimiter) return; if ((length = _i - _last) > 0) | | | | 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 | OFString *attributeValue; size_t length; if (_data[_i] != _delimiter) return; if ((length = _i - _last) > 0) appendToBuffer(_buffer, _data + _last, _encoding, length); pool = objc_autoreleasePoolPush(); attributeValue = transformString(_buffer, 0, true, self); if (_attributePrefix == nil && [_attributeName isEqual: @"xmlns"]) [[_namespaces lastObject] setObject: attributeValue forKey: @""]; if ([_attributePrefix isEqual: @"xmlns"]) [[_namespaces lastObject] setObject: attributeValue forKey: _attributeName]; |
︙ | ︙ | |||
940 941 942 943 944 945 946 | if (_data[_i] == ']') _level++; else if (_data[_i] == '>' && _level >= 2) { void *pool = objc_autoreleasePoolPush(); OFString *CDATA; | | | | 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 | if (_data[_i] == ']') _level++; else if (_data[_i] == '>' && _level >= 2) { void *pool = objc_autoreleasePoolPush(); OFString *CDATA; appendToBuffer(_buffer, _data + _last, _encoding, _i - _last); CDATA = transformString(_buffer, 2, false, nil); if ([_delegate respondsToSelector: @selector(parser:foundCDATA:)]) [_delegate parser: self foundCDATA: CDATA]; objc_autoreleasePoolPop(pool); |
︙ | ︙ | |||
990 991 992 993 994 995 996 | OFString *comment; if (_data[_i] != '>') @throw [OFMalformedXMLException exceptionWithParser: self]; pool = objc_autoreleasePoolPush(); | | | | 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 | OFString *comment; if (_data[_i] != '>') @throw [OFMalformedXMLException exceptionWithParser: self]; pool = objc_autoreleasePoolPush(); appendToBuffer(_buffer, _data + _last, _encoding, _i - _last); comment = transformString(_buffer, 2, false, nil); if ([_delegate respondsToSelector: @selector(parser:foundComment:)]) [_delegate parser: self foundComment: comment]; objc_autoreleasePoolPop(pool); |
︙ | ︙ |