X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/c38e3ce98599a410a47dc10253faa4d5830f13b2..427c49bcad63d042b29ada2ac27e3dfc4845c779:/utilities/src/SecCFWrappers.c diff --git a/utilities/src/SecCFWrappers.c b/utilities/src/SecCFWrappers.c new file mode 100644 index 00000000..d16ed676 --- /dev/null +++ b/utilities/src/SecCFWrappers.c @@ -0,0 +1,71 @@ +// +// SecCFWrappers.c +// utilities +// +// Created by Michael Brouwer on 11/15/12. +// Copyright 2012 Apple Inc. All rights reserved. +// + +#include + +void CFStringPerformWithCStringAndLength(CFStringRef inStr, void(^operation)(const char *utf8String, size_t utf8Length)) { + const char *cstr = CFStringGetCStringPtr(inStr, kCFStringEncodingUTF8); + if (cstr) { + operation(cstr, strlen(cstr)); + } else { + CFIndex neededLen = 0; + CFRange range = { 0, CFStringGetLength(inStr) }; + CFStringGetBytes(inStr, range, kCFStringEncodingUTF8, + 0, FALSE, NULL, 0, &neededLen); + CFIndex usedLen = 0; + if (neededLen < 4096) { + char buf[neededLen + 1]; + CFStringGetBytes(inStr, range, kCFStringEncodingUTF8, + 0, FALSE, (UInt8 *)buf, neededLen, &usedLen); + assert(usedLen == neededLen); + buf[usedLen] = 0; + operation(buf, (size_t)usedLen); + //cc_zero(neededLen, buf); + } else { + char *buf = malloc(neededLen + 1); + CFStringGetBytes(inStr, range, kCFStringEncodingUTF8, + 0, FALSE, (UInt8 *)buf, neededLen, &usedLen); + assert(usedLen == neededLen); + buf[usedLen] = 0; + operation(buf, (size_t)usedLen); + //cc_zero(neededLen, buf); + free(buf); + } + } +} + +void CFStringPerformWithCString(CFStringRef inStr, void(^operation)(const char *utf8String)) { + const char *cstr = CFStringGetCStringPtr(inStr, kCFStringEncodingUTF8); + if (cstr) { + operation(cstr); + } else { + CFIndex neededLen = 0; + CFRange range = { 0, CFStringGetLength(inStr) }; + CFStringGetBytes(inStr, range, kCFStringEncodingUTF8, + 0, FALSE, NULL, 0, &neededLen); + CFIndex usedLen = 0; + if (neededLen < 4096) { + char buf[neededLen + 1]; + CFStringGetBytes(inStr, range, kCFStringEncodingUTF8, + 0, FALSE, (UInt8 *)buf, neededLen, &usedLen); + assert(usedLen == neededLen); + buf[usedLen] = 0; + operation(buf); + //cc_zero(neededLen, buf); + } else { + char *buf = malloc(neededLen + 1); + CFStringGetBytes(inStr, range, kCFStringEncodingUTF8, + 0, FALSE, (UInt8 *)buf, neededLen, &usedLen); + assert(usedLen == neededLen); + buf[usedLen] = 0; + operation(buf); + //cc_zero(neededLen, buf); + free(buf); + } + } +}