annotate foosdk/sdk/pfc/obj-c.mm @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 //
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2 // PFC-ObjC.m
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 // pfc-test
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 //
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5 // Created by PEPE on 28/07/14.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 // Copyright (c) 2014 PEPE. All rights reserved.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7 //
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 #ifdef __APPLE__
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 #import <Foundation/Foundation.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 #include <TargetConditionals.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14 #if TARGET_OS_MAC && !TARGET_OS_IPHONE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 #import <Cocoa/Cocoa.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 #include "pfc.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19 #include "sortstring.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 namespace pfc {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 void * thread::g_entry(void * arg) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24 @autoreleasepool {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 reinterpret_cast<thread*>(arg)->entry();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 return NULL;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 void thread::appleStartThreadPrologue() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 if (![NSThread isMultiThreaded]) [[[NSThread alloc] init] start];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 bool isShiftKeyPressed() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 #if TARGET_OS_MAC && !TARGET_OS_IPHONE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 return ( [NSEvent modifierFlags] & NSEventModifierFlagShift ) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 bool isCtrlKeyPressed() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 #if TARGET_OS_MAC && !TARGET_OS_IPHONE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 return ( [NSEvent modifierFlags] & NSEventModifierFlagControl ) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 bool isAltKeyPressed() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 #if TARGET_OS_MAC && !TARGET_OS_IPHONE
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 return ( [NSEvent modifierFlags] & NSEventModifierFlagOption ) != 0;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 #else
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 void inAutoReleasePool(std::function<void()> f) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 @autoreleasepool {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57 f();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61 void appleDebugLog( const char * str ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 NSLog(@"%s\n", str );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 bool appleRecycleFile( const char * path ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 @autoreleasepool {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67 NSFileManager * manager = [NSFileManager defaultManager];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 NSURL * url = [NSURL fileURLWithPath: [NSString stringWithUTF8String: path] ];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 if (@available(iOS 11.0, *)) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 NSError * error = nil;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 if ([manager trashItemAtURL: url resultingItemURL: nil error: &error]) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
73 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
74 if ([error.domain isEqualToString: NSCocoaErrorDomain] && error.code == NSFeatureUnsupportedError) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
75 // trashcan not supported, fall thru
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
76 } else {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
77 // failed to remove
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
78 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
79 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
80 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
81 return [manager removeItemAtURL: url error: nil];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
82 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
83 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
84 void appleSetThreadDescription( const char * str ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
85 @autoreleasepool {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
86 [NSThread currentThread].name = [NSString stringWithUTF8String: str];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
87 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
88 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
89
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
90 pfc::string8 unicodeNormalizeD(const char * str) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
91 @autoreleasepool {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
92 pfc::string8 ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
93 NSString * v = [[NSString stringWithUTF8String: str] decomposedStringWithCanonicalMapping];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
94 if ( v ) ret = v.UTF8String;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
95 else ret = str;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
96 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
97 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
98 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
99 pfc::string8 unicodeNormalizeC(const char * str) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
100 @autoreleasepool {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
101 pfc::string8 ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
102 NSString * v = [[NSString stringWithUTF8String: str] precomposedStringWithCanonicalMapping];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
103 if ( v ) ret = v.UTF8String;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
104 else ret = str;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
105 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
106 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
107 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
108
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
109 int appleNaturalSortCompare(const char* s1, const char* s2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
110 @autoreleasepool {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
111 NSString * str1 = [NSString stringWithUTF8String: s1];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
112 NSString * str2 = [NSString stringWithUTF8String: s2];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
113 return (int) [str1 localizedCompare: str2];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
114 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
115 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
116 int appleNaturalSortCompareI(const char* s1, const char* s2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
117 @autoreleasepool {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
118 NSString * str1 = [NSString stringWithUTF8String: s1];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
119 NSString * str2 = [NSString stringWithUTF8String: s2];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
120 return (int) [str1 localizedCaseInsensitiveCompare: str2];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
121 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
122 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
123 [[noreturn]] void appleThrowException( const char * name, const char * reason ) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
124 @autoreleasepool {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
125 @throw [NSException exceptionWithName: [NSString stringWithUTF8String: name] reason:[NSString stringWithUTF8String: reason] userInfo:nil];
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
126 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
127 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
128
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
129 #ifndef PFC_SORTSTRING_GENERIC
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
130 sortString_t makeSortString(const char* str) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
131 sortString_t ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
132 ret.Attach( CFStringCreateWithCString(NULL, str, kCFStringEncodingUTF8) );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
133 return ret;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
134 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
135 int sortStringCompare(sortString_t const& s1, sortString_t const& s2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
136 return (int) CFStringCompare(s1.p, s2.p, kCFCompareLocalized | kCFCompareNumerically );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
137 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
138 int sortStringCompareI(sortString_t const& s1, sortString_t const& s2) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
139 return (int) CFStringCompare(s1.p, s2.p, kCFCompareLocalized | kCFCompareNumerically | kCFCompareCaseInsensitive );
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
140 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
141 #endif
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
142 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
143 #endif