CFRange CFDataFind(CFDataRef data, CFDataRef dataToFind, CFRange searchRange, CFDataSearchFlags compareOptions) { // No objc dispatch __CFGenericValidateType(data, __kCFDataTypeID); __CFGenericValidateType(dataToFind, __kCFDataTypeID); __CFDataValidateRange(data, searchRange, __PRETTY_FUNCTION__); return _CFDataFindBytes(data, dataToFind, searchRange, compareOptions); }
void CFDataReplaceBytes(CFMutableDataRef data, CFRange range, const uint8_t *newBytes, CFIndex newLength) { CF_OBJC_FUNCDISPATCHV(__kCFDataTypeID, void, (NSMutableData *)data, replaceBytesInRange:NSMakeRange(range.location, range.length) withBytes:(const void *)newBytes length:(NSUInteger)newLength); __CFGenericValidateType(data, __kCFDataTypeID); __CFDataValidateRange(data, range, __PRETTY_FUNCTION__); CFAssert1(__CFDataIsMutable(data), __kCFLogAssertion, "%s(): data is immutable", __PRETTY_FUNCTION__); CFAssert2(0 <= newLength, __kCFLogAssertion, "%s(): newLength (%d) cannot be less than zero", __PRETTY_FUNCTION__, newLength); CFIndex len = __CFDataLength(data); if (len < 0 || range.length < 0 || newLength < 0) HALT; CFIndex newCount = len - range.length + newLength; if (newCount < 0) HALT; uint8_t *bytePtr = (uint8_t *)CFDataGetMutableBytePtr(data); uint8_t *srcBuf = (uint8_t *)newBytes; switch (__CFMutableVariety(data)) { case kCFMutable: if (__CFDataNumBytes(data) < newCount) { if (bytePtr && newBytes && newBytes < bytePtr + __CFDataCapacity(data) && bytePtr < newBytes + newLength) { srcBuf = (uint8_t *)malloc(newLength * sizeof(uint8_t)); memmove(srcBuf, newBytes, newLength * sizeof(uint8_t)); } __CFDataGrow(data, newLength - range.length, false); bytePtr = (uint8_t *)CFDataGetMutableBytePtr(data); } break; case kCFFixedMutable: CFAssert1(newCount <= __CFDataCapacity(data), __kCFLogAssertion, "%s(): fixed-capacity data is full", __PRETTY_FUNCTION__); // Continuing after this could cause buffer overruns. if (newCount > __CFDataCapacity(data)) HALT; break; } if (newLength != range.length && range.location + range.length < len) { memmove(bytePtr + range.location + newLength, bytePtr + range.location + range.length, (len - range.location - range.length) * sizeof(uint8_t)); } if (0 < newLength) { memmove(bytePtr + range.location, srcBuf, newLength * sizeof(uint8_t)); } if (srcBuf != newBytes) free(srcBuf); __CFDataSetNumBytesUsed(data, newCount); __CFDataSetLength(data, newCount); }
void CFDataGetBytes(CFDataRef data, CFRange range, uint8_t *buffer) { CF_OBJC_FUNCDISPATCHV(__kCFDataTypeID, void, (NSData *)data, getBytes:(void *)buffer range:NSMakeRange(range.location, range.length)); __CFDataValidateRange(data, range, __PRETTY_FUNCTION__); memmove(buffer, CFDataGetBytePtr(data) + range.location, range.length); }
void CFDataGetBytes(CFDataRef data, CFRange range, uint8_t *buffer) { CF_OBJC_FUNCDISPATCH2(__kCFDataTypeID, void, data, "getBytes:range:", buffer, range); __CFDataValidateRange(data, range, __PRETTY_FUNCTION__); memmove(buffer, CFDataGetBytePtr(data) + range.location, range.length); }