Mercurial > minori
changeset 405:4562bc8bfdff
strings: add conversion to/from CFString on Mac OS X
| author | Paper <paper@tflc.us> |
|---|---|
| date | Mon, 19 Jan 2026 22:47:29 -0500 |
| parents | e561b7542b7b |
| children | 31ce85df55a8 |
| files | include/core/strings.h src/core/strings.cc |
| diffstat | 2 files changed, 31 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- 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 <cstdint> +#if defined(__MACH__) && defined(__APPLE__) +# include <CoreFoundation/CoreFoundation.h> +#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<typename T = int, std::enable_if_t<std::is_arithmetic<T>::value, bool> = true>
--- 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<const UInt8 *>(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<UInt8 *>(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));
