[vlc-commits] include/vlc_charset: Add FromCFString for darwin

Marvin Scholz git at videolan.org
Sat May 18 20:09:30 CEST 2019


vlc/vlc-3.0 | branch: master | Marvin Scholz <epirat07 at gmail.com> | Mon Oct  8 10:51:33 2018 +0200| [f2772f2e40f41b2ff6ed14a4deb9ba7813f7b9d7] | committer: Felix Paul Kühne

include/vlc_charset: Add FromCFString for darwin

This is a helper function to obtain the copy of a char* from a
CFStringRef.

(cherry picked from commit f4b57268547f27172966cc7d850f797acaaa77d3)
Signed-off-by: Felix Paul Kühne <felix at feepk.net>

> http://git.videolan.org/gitweb.cgi/vlc/vlc-3.0.git/?a=commit;h=f2772f2e40f41b2ff6ed14a4deb9ba7813f7b9d7
---

 include/vlc_charset.h | 44 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/include/vlc_charset.h b/include/vlc_charset.h
index 05092257a4..0954291b33 100644
--- a/include/vlc_charset.h
+++ b/include/vlc_charset.h
@@ -124,6 +124,50 @@ VLC_API char * vlc_strcasestr(const char *, const char *) VLC_USED;
 VLC_API char * FromCharset( const char *charset, const void *data, size_t data_size ) VLC_USED;
 VLC_API void * ToCharset( const char *charset, const char *in, size_t *outsize ) VLC_USED;
 
+#ifdef __APPLE__
+# include <CoreFoundation/CoreFoundation.h>
+
+/* Obtains a copy of the contents of a CFString in specified encoding.
+ * Returns char* (must be freed by caller) or NULL on failure.
+ */
+VLC_USED static inline char *FromCFString(const CFStringRef cfString,
+    const CFStringEncoding cfStringEncoding)
+{
+    // Try the quick way to obtain the buffer
+    const char *tmpBuffer = CFStringGetCStringPtr(cfString, cfStringEncoding);
+
+    if (tmpBuffer != NULL) {
+       return strdup(tmpBuffer);
+    }
+
+    // The quick way did not work, try the long way
+    CFIndex length = CFStringGetLength(cfString);
+    CFIndex maxSize =
+        CFStringGetMaximumSizeForEncoding(length, cfStringEncoding);
+
+    // If result would exceed LONG_MAX, kCFNotFound is returned
+    if (unlikely(maxSize == kCFNotFound)) {
+        return NULL;
+    }
+
+    // Account for the null terminator
+    maxSize++;
+
+    char *buffer = (char *)malloc(maxSize);
+
+    if (unlikely(buffer == NULL)) {
+        return NULL;
+    }
+
+    // Copy CFString in requested encoding to buffer
+    Boolean success = CFStringGetCString(cfString, buffer, maxSize, cfStringEncoding);
+
+    if (!success)
+        FREENULL(buffer);
+    return buffer;
+}
+#endif
+
 #ifdef _WIN32
 VLC_USED
 static inline char *FromWide (const wchar_t *wide)



More information about the vlc-commits mailing list