# HG changeset patch # User Paper # Date 1768880849 18000 # Node ID 4562bc8bfdff956330627c4aceb43a0d95586b3e # Parent e561b7542b7b0f3e707085fa135b7636255ea032 strings: add conversion to/from CFString on Mac OS X diff -r e561b7542b7b -r 4562bc8bfdff include/core/strings.h --- a/include/core/strings.h Mon Jan 19 20:50:40 2026 -0500 +++ b/include/core/strings.h Mon Jan 19 22:47:29 2026 -0500 @@ -8,6 +8,10 @@ #include +#if defined(__MACH__) && defined(__APPLE__) +# include +#endif + class QString; class QByteArray; @@ -44,6 +48,10 @@ std::u32string ToUcs4String(const std::string &string); QString ToQString(const std::string &string); QString ToQString(const std::wstring &wstring); +#if defined(__APPLE__) && defined(__MACH__) +CFStringRef ToCFString(const std::string &string); +std::string ToUtf8String(CFStringRef str); +#endif /* not really an "int"... but who cares? */ template::value, bool> = true> diff -r e561b7542b7b -r 4562bc8bfdff src/core/strings.cc --- a/src/core/strings.cc Mon Jan 19 20:50:40 2026 -0500 +++ b/src/core/strings.cc Mon Jan 19 22:47:29 2026 -0500 @@ -206,6 +206,29 @@ return b ? "true" : "false"; // lol } +#if defined(__APPLE__) && defined(__MACH__) +CFStringRef ToCFString(const std::string &string) +{ + return CFStringCreateWithBytes(kCFAllocatorDefault, reinterpret_cast(string.data()), string.size(), kCFStringEncodingUTF8, false); +} +std::string ToUtf8String(CFStringRef str) +{ + if (const char *ptr = CFStringGetCStringPtr(str, kCFStringEncodingUTF8)) + return std::string(ptr); // easy! + + // ... + const CFIndex len = CFStringGetLength(str); + std::string buf(CFStringGetMaximumSizeForEncoding(len, kCFStringEncodingUTF8), 0); + CFRange range; + range.length = len; + range.location = 0; + CFIndex used; + CFStringGetBytes(str, range, kCFStringEncodingUTF8, 0, false, reinterpret_cast(buf.data()), buf.size(), &used); + buf.resize(used); + return buf; +} +#endif + bool ToBool(const std::string &str, bool def) { std::istringstream s(Strings::ToLower(str));