]> git.saurik.com Git - apple/security.git/blobdiff - utilities/src/SecCFWrappers.c
Security-55471.tar.gz
[apple/security.git] / utilities / src / SecCFWrappers.c
diff --git a/utilities/src/SecCFWrappers.c b/utilities/src/SecCFWrappers.c
new file mode 100644 (file)
index 0000000..d16ed67
--- /dev/null
@@ -0,0 +1,71 @@
+//
+//  SecCFWrappers.c
+//  utilities
+//
+//  Created by Michael Brouwer on 11/15/12.
+//  Copyright 2012 Apple Inc. All rights reserved.
+//
+
+#include <utilities/SecCFWrappers.h>
+
+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);
+        }
+    }
+}