Add range-related utility properties/methods
[SA_NSDataExtensions.git] / NSData+SA_NSDataExtensions.m
blob4f0a2d07e58c5d9e46715266e2e6f4b43d4d06a4
1 //
2 //  NSData+SA_NSDataExtensions.m
3 //
4 //  Copyright 2015-2021 Said Achmiz.
5 //  See LICENSE and README.md for more info.
7 #import "NSData+SA_NSDataExtensions.h"
9 @implementation NSData (SA_NSDataExtensions)
11 -(BOOL) isNullTerminated {
12         if (self.length == 0)
13                 return NO;
15         return (((char*) self.bytes)[self.length - 1] == '\0');
18 -(const char *) terminatedCString {
19         return self.dataWithTerminatedCString.bytes;
22 -(NSData *) dataWithTerminatedCString {
23         if (self.length == 0) {
24                 return [NSData dataWithBytes:"\0" 
25                                                           length:1];
26         } else if (self.isNullTerminated) {
27                 return self;
28         } else {
29                 char* terminated_string_buffer = malloc(self.length + 1);
30                 [self getBytes:terminated_string_buffer 
31                                 length:self.length];
32                 terminated_string_buffer[self.length] = '\0';
33                 
34                 return [NSData dataWithBytesNoCopy:terminated_string_buffer 
35                                                                         length:(self.length + 1) 
36                                                           freeWhenDone:YES];
37         }
40 -(NSRange) startRange {
41         return NSMakeRange(0, 0);
44 -(NSRange) fullRange {
45         return NSMakeRange(0, self.length);
48 -(NSRange) endRange {
49         return NSMakeRange(self.length, 0);
52 -(NSRange) rangeAfterRange:(NSRange)aRange {
53         return NSMakeRange(NSMaxRange(aRange), self.length - NSMaxRange(aRange));
56 -(NSRange) rangeFromEndOfRange:(NSRange)aRange {
57         return NSMakeRange(NSMaxRange(aRange) - 1, self.length - NSMaxRange(aRange) + 1);
60 -(NSRange) rangeToEndFrom:(NSRange)aRange {
61         return NSMakeRange(aRange.location, self.length - aRange.location);
64 +(NSData *) dataWithBlankCString {
65         return [NSData dataWithBytes:"\0" 
66                                                   length:1];
69 +(NSData *) dataFromCString:(const char *)cString {
70         return [NSData dataWithBytes:cString
71                                                   length:strlen(cString)];
74 +(NSData *) dataWithCString:(char *)cString {
75         return [NSData dataWithBytesNoCopy:cString
76                                                                 length:strlen(cString)];
79 @end