void CFDataSetLength(CFMutableDataRef data, CFIndex newLength) { CFIndex oldLength, capacity; Boolean isGrowable; CF_OBJC_FUNCDISPATCHV(__kCFDataTypeID, void, (NSMutableData *)data, setLength:(NSUInteger)newLength); CFAssert1(__CFDataIsMutable(data), __kCFLogAssertion, "%s(): data is immutable", __PRETTY_FUNCTION__); oldLength = __CFDataLength(data); capacity = __CFDataCapacity(data); isGrowable = __CFDataIsGrowable(data); if (__CFDataIsMutable(data)) { if (newLength < 0) { if (isGrowable) { __CFDataHandleOutOfMemory(data, newLength); } else { HALT; } } else if (capacity < newLength) { if (isGrowable) { __CFDataGrow(data, newLength - oldLength, true); } else { CFAssert1(newLength <= __CFDataCapacity(data), __kCFLogAssertion, "%s(): fixed-capacity data is full", __PRETTY_FUNCTION__); } } else if (oldLength < newLength && __CFDataNeedsToZero(data)) { memset(CFDataGetMutableBytePtr(data) + oldLength, 0, newLength - oldLength); } else if (newLength < oldLength) { __CFDataSetNeedsToZero(data, true); } } __CFDataSetLength(data, newLength); __CFDataSetNumBytesUsed(data, newLength); }
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 CFDataDeleteBytes(CFMutableDataRef data, CFRange range) { CF_OBJC_FUNCDISPATCHV(__kCFDataTypeID, void, (NSMutableData *)data, replaceBytesInRange:NSMakeRange(range.location, range.length) withBytes:NULL length:0); CFAssert1(__CFDataIsMutable(data), __kCFLogAssertion, "%s(): data is immutable", __PRETTY_FUNCTION__); CFDataReplaceBytes(data, range, NULL, 0); }
void CFDataAppendBytes(CFMutableDataRef data, const uint8_t *bytes, CFIndex length) { CF_OBJC_FUNCDISPATCHV(__kCFDataTypeID, void, (NSMutableData *)data, appendBytes:(const void *)bytes length:(NSUInteger)length); CFAssert1(__CFDataIsMutable(data), __kCFLogAssertion, "%s(): data is immutable", __PRETTY_FUNCTION__); CFDataReplaceBytes(data, CFRangeMake(__CFDataLength(data), 0), bytes, length); }
void CFDataIncreaseLength(CFMutableDataRef data, CFIndex extraLength) { CF_OBJC_FUNCDISPATCHV(__kCFDataTypeID, void, (NSMutableData *)data, increaseLengthBy:(NSUInteger)extraLength); CFAssert1(__CFDataIsMutable(data), __kCFLogAssertion, "%s(): data is immutable", __PRETTY_FUNCTION__); if (extraLength < 0) HALT; // Avoid integer overflow. CFDataSetLength(data, __CFDataLength(data) + extraLength); }
uint8_t *CFDataGetMutableBytePtr(CFMutableDataRef data) { CF_OBJC_FUNCDISPATCHV(__kCFDataTypeID, uint8_t *, (NSMutableData *)data, mutableBytes); CFAssert1(__CFDataIsMutable(data), __kCFLogAssertion, "%s(): data is immutable", __PRETTY_FUNCTION__); // compaction: if inline, always do the computation. return __CFDataBytesInline(data) ? (uint8_t *)__CFDataInlineBytesPtr(data) : data->_bytes; }
void CFDataDeleteBytes(CFMutableDataRef data, CFRange range) { CF_OBJC_FUNCDISPATCH3(__kCFDataTypeID, void, data, "replaceBytesInRange:withBytes:length:", range, NULL, 0); CFAssert1(__CFDataIsMutable(data), __kCFLogAssertion, "%s(): data is immutable", __PRETTY_FUNCTION__); CFDataReplaceBytes(data, range, NULL, 0); }
// WINOBJC: This function is for Foundation's benefit; no one else should use it. CF_EXPORT Boolean _CFDataIsMutable(CFDataRef data) { return __CFDataIsMutable(data); }