Overview
Comment: | OFData: Add -[rangeOfData:options:range:] |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
c85b63d2af3d3fac4724f027a06bfdfa |
User & Date: | js on 2018-01-14 18:25:27 |
Other Links: | manifest | tags |
Context
2018-01-15
| ||
00:34 | Add -[writeToURL:] check-in: 5c08717941 user: js tags: trunk | |
2018-01-14
| ||
18:25 | OFData: Add -[rangeOfData:options:range:] check-in: c85b63d2af user: js tags: trunk | |
14:12 | OFIntrospection: Fix property parsing on Apple RT check-in: cc198764b7 user: js tags: trunk | |
Changes
Modified src/OFData.h from [79c85b69aa] to [72db843d4f].
︙ | ︙ | |||
19 20 21 22 23 24 25 26 27 28 29 30 31 32 | #import "OFSerialization.h" #import "OFMessagePackRepresentation.h" OF_ASSUME_NONNULL_BEGIN @class OFString; @class OFURL; /*! * @class OFData OFData.h ObjFW/OFData.h * * @brief A class for storing arbitrary data in an array. * * For security reasons, serialization and deserialization is only implemented | > > > > | 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #import "OFSerialization.h" #import "OFMessagePackRepresentation.h" OF_ASSUME_NONNULL_BEGIN @class OFString; @class OFURL; enum { OF_DATA_SEARCH_BACKWARDS = 1 }; /*! * @class OFData OFData.h ObjFW/OFData.h * * @brief A class for storing arbitrary data in an array. * * For security reasons, serialization and deserialization is only implemented |
︙ | ︙ | |||
275 276 277 278 279 280 281 282 283 284 285 286 287 288 | * @brief Returns a specific item of the OFData. * * @param index The number of the item to return * @return The specified item of the OFData */ - (const void *)itemAtIndex: (size_t)index OF_RETURNS_INNER_POINTER; #ifdef OF_HAVE_FILES /*! * @brief Writes the OFData into the specified file. * * @param path The path of the file to write to */ - (void)writeToFile: (OFString *)path; | > > > > > > > > > > > > > > > > > | 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 | * @brief Returns a specific item of the OFData. * * @param index The number of the item to return * @return The specified item of the OFData */ - (const void *)itemAtIndex: (size_t)index OF_RETURNS_INNER_POINTER; /*! * @brief Returns the range of the data. * * @param data The data to search for * @param options Options modifying search behavior.@n * Possible values are: * Value | Description * ---------------------------|----------------------------- * `OF_DATA_SEARCH_BACKWARDS` | Search backwards in the data * @param range The range in which to search * @return The range of the first occurrence of the data or a range with * `OF_NOT_FOUND` as start position if it was not found. */ - (of_range_t)rangeOfData: (OFData *)data options: (int)options range: (of_range_t)range; #ifdef OF_HAVE_FILES /*! * @brief Writes the OFData into the specified file. * * @param path The path of the file to write to */ - (void)writeToFile: (OFString *)path; |
︙ | ︙ |
Modified src/OFData.m from [5e3c55fa09] to [7c051801e0].
︙ | ︙ | |||
538 539 540 541 542 543 544 545 546 547 548 549 550 551 | return ret; } - (OFString *)stringByBase64Encoding { return of_base64_encode(_items, _count * _itemSize); } #ifdef OF_HAVE_FILES - (void)writeToFile: (OFString *)path { OFFile *file = [[OFFile alloc] initWithPath: path mode: @"w"]; | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 | return ret; } - (OFString *)stringByBase64Encoding { return of_base64_encode(_items, _count * _itemSize); } - (of_range_t)rangeOfData: (OFData *)data options: (int)options range: (of_range_t)range { const char *search; size_t searchLength; if (range.length > SIZE_MAX - range.location || range.location + range.length > _count) @throw [OFOutOfRangeException exception]; if (data == nil || [data itemSize] != _itemSize) @throw [OFInvalidArgumentException exception]; if ((searchLength = [data count]) == 0) return of_range(0, 0); if (searchLength > range.length) return of_range(OF_NOT_FOUND, 0); search = [data items]; if (options & OF_DATA_SEARCH_BACKWARDS) { for (size_t i = range.length - searchLength;; i--) { if (memcmp(_items + i * _itemSize, search, searchLength * _itemSize) == 0) return of_range(i, searchLength); /* No match and we're at the last item */ if (i == 0) break; } } else { for (size_t i = range.location; i <= range.length - searchLength; i++) if (memcmp(_items + i * _itemSize, search, searchLength * _itemSize) == 0) return of_range(i, searchLength); } return of_range(OF_NOT_FOUND, 0); } #ifdef OF_HAVE_FILES - (void)writeToFile: (OFString *)path { OFFile *file = [[OFFile alloc] initWithPath: path mode: @"w"]; |
︙ | ︙ |
Modified src/OFString.h from [8a8e2048a9] to [53d3dfe512].
︙ | ︙ | |||
958 959 960 961 962 963 964 | */ - (of_range_t)rangeOfString: (OFString *)string; /*! * @brief Returns the range of the string. * * @param string The string to search | | | 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 | */ - (of_range_t)rangeOfString: (OFString *)string; /*! * @brief Returns the range of the string. * * @param string The string to search * @param options Options modifying search behavior.@n * Possible values are: * Value | Description * -----------------------------|------------------------------- * `OF_STRING_SEARCH_BACKWARDS` | Search backwards in the string * @return The range of the first occurrence of the string or a range with * `OF_NOT_FOUND` as start position if it was not found */ |
︙ | ︙ |
Modified tests/OFDataTests.m from [418fe558f3] to [06989343f9].
︙ | ︙ | |||
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #include <string.h> #import "OFData.h" #import "OFString.h" #import "OFAutoreleasePool.h" #import "OFOutOfRangeException.h" #import "TestsAppDelegate.h" static OFString *module = @"OFData"; const char *str = "Hello!"; @implementation TestsAppDelegate (OFDataTests) - (void)dataTests { OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; OFMutableData *mutable; OFData *immutable; void *raw[2]; TEST(@"+[dataWithItemSize:]", (mutable = [OFMutableData dataWithItemSize: 4096])) OFObject *tmp = [[[OFObject alloc] init] autorelease]; raw[0] = [tmp allocMemoryWithSize: 4096]; raw[1] = [tmp allocMemoryWithSize: 4096]; | > > | 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #include <string.h> #import "OFData.h" #import "OFString.h" #import "OFAutoreleasePool.h" #import "OFInvalidArgumentException.h" #import "OFOutOfRangeException.h" #import "TestsAppDelegate.h" static OFString *module = @"OFData"; const char *str = "Hello!"; @implementation TestsAppDelegate (OFDataTests) - (void)dataTests { OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; OFMutableData *mutable; OFData *immutable; void *raw[2]; of_range_t range; TEST(@"+[dataWithItemSize:]", (mutable = [OFMutableData dataWithItemSize: 4096])) OFObject *tmp = [[[OFObject alloc] init] autorelease]; raw[0] = [tmp allocMemoryWithSize: 4096]; raw[1] = [tmp allocMemoryWithSize: 4096]; |
︙ | ︙ | |||
92 93 94 95 96 97 98 99 100 101 102 103 104 105 | [mutable count] == 3 && memcmp([mutable items], "ade", 3) == 0) TEST(@"-[insertItems:atIndex:count:]", R([mutable insertItems: "bc" atIndex: 1 count: 2]) && [mutable count] == 5 && memcmp([mutable items], "abcde", 5) == 0) TEST(@"-[MD5Hash]", [[mutable MD5Hash] isEqual: [@"abcde" MD5Hash]]) TEST(@"-[RIPEMD160Hash]", [[mutable RIPEMD160Hash] isEqual: [@"abcde" RIPEMD160Hash]]) TEST(@"-[SHA1Hash]", [[mutable SHA1Hash] isEqual: [@"abcde" SHA1Hash]]) | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 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 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 | [mutable count] == 3 && memcmp([mutable items], "ade", 3) == 0) TEST(@"-[insertItems:atIndex:count:]", R([mutable insertItems: "bc" atIndex: 1 count: 2]) && [mutable count] == 5 && memcmp([mutable items], "abcde", 5) == 0) immutable = [OFData dataWithItems: "aaabaccdacaabb" itemSize: 2 count: 7]; TEST(@"-[rangeOfString:options:range:]", R(range = [immutable rangeOfData: [OFData dataWithItems: "aa" itemSize: 2 count: 1] options: 0 range: of_range(0, 7)]) && range.location == 0 && range.length == 1 && R(range = [immutable rangeOfData: [OFData dataWithItems: "aa" itemSize: 2 count: 1] options: OF_DATA_SEARCH_BACKWARDS range: of_range(0, 7)]) && range.location == 5 && range.length == 1 && R(range = [immutable rangeOfData: [OFData dataWithItems: "ac" itemSize: 2 count: 1] options: 0 range: of_range(0, 7)]) && range.location == 2 && range.length == 1 && R(range = [immutable rangeOfData: [OFData dataWithItems: "aabb" itemSize: 2 count: 2] options: 0 range: of_range(0, 7)]) && range.location == 5 && range.length == 2 && R(range = [immutable rangeOfData: [OFData dataWithItems: "aa" itemSize: 2 count: 1] options: 0 range: of_range(1, 6)]) && range.location == 5 && range.length == 1 && R(range = [immutable rangeOfData: [OFData dataWithItems: "aa" itemSize: 2 count: 1] options: OF_DATA_SEARCH_BACKWARDS range: of_range(0, 5)]) && range.location == 0 && range.length == 1) EXPECT_EXCEPTION( @"-[rangeOfString:options:range:] failing on different itemSize", OFInvalidArgumentException, [immutable rangeOfData: [OFData dataWithItems: "aaa" itemSize: 3 count: 1] options: 0 range: of_range(0, 1)]) EXPECT_EXCEPTION( @"-[rangeOfString:options:range:] failing on out of range", OFOutOfRangeException, [immutable rangeOfData: [OFData dataWithItems: "" itemSize: 2 count: 0] options: 0 range: of_range(8, 1)]) TEST(@"-[MD5Hash]", [[mutable MD5Hash] isEqual: [@"abcde" MD5Hash]]) TEST(@"-[RIPEMD160Hash]", [[mutable RIPEMD160Hash] isEqual: [@"abcde" RIPEMD160Hash]]) TEST(@"-[SHA1Hash]", [[mutable SHA1Hash] isEqual: [@"abcde" SHA1Hash]]) |
︙ | ︙ |