+++ /dev/null
-- (NSMethodSignature *) methodSignatureForSelector:(SEL)selector {
- fprintf(stderr, "[%s]S-%s\n", class_getName(self->isa), sel_getName(selector));
- return [super methodSignatureForSelector:selector];
-}
-
-- (BOOL) respondsToSelector:(SEL)selector {
- BOOL responds = [super respondsToSelector:selector];
- fprintf(stderr, "[%s]R%c%s\n", class_getName(self->isa), (responds ? '+' : '-'), sel_getName(selector));
- return responds;
-}
--- /dev/null
+- (NSMethodSignature *) methodSignatureForSelector:(SEL)selector {
+ fprintf(stderr, "[%s]S-%s\n", class_getName(self->isa), sel_getName(selector));
+ return [super methodSignatureForSelector:selector];
+}
+
+- (BOOL) respondsToSelector:(SEL)selector {
+ BOOL responds = [super respondsToSelector:selector];
+ fprintf(stderr, "[%s]R%c%s\n", class_getName(self->isa), (responds ? '+' : '-'), sel_getName(selector));
+ return responds;
+}
--- /dev/null
+#define __STDC_LIMIT_MACROS
+#include <stdint.h>
+
+#include <objc/objc.h>
+
+#include <sys/time.h>
+#include <time.h>
+
+#define _forever \
+ for (;;)
+
+extern struct timeval _ltv;
+extern bool _itv;
+
+#define _trace() do { \
+ struct timeval _ctv; \
+ gettimeofday(&_ctv, NULL); \
+ if (!_itv) { \
+ _itv = true; \
+ _ltv = _ctv; \
+ } \
+ fprintf(stderr, "%lu.%.6u[%f]:_trace()@%s:%u[%s]\n", \
+ _ctv.tv_sec, _ctv.tv_usec, \
+ (_ctv.tv_sec - _ltv.tv_sec) + (_ctv.tv_usec - _ltv.tv_usec) / 1000000.0, \
+ __FILE__, __LINE__, __FUNCTION__\
+ ); \
+ _ltv = _ctv; \
+} while (false)
+
+#define _assert(test) do \
+ if (!(test)) { \
+ fprintf(stderr, "_assert(%d:%s)@%s:%u[%s]\n", errno, #test, __FILE__, __LINE__, __FUNCTION__); \
+ exit(-1); \
+ } \
+while (false)
+
+#define _not(type) ((type) ~ (type) 0)
+
+#define _transient
+
+#define _label__(x) _label ## x
+#define _label_(y) _label__(y)
+#define _label _label_(__LINE__)
+
+#define _packed \
+ __attribute__((packed))
+
+//#define _finline __attribute__((force_inline))
+#define _finline inline
#import <Foundation/NSString.h>
+@interface NSString (UIKit)
+- (NSString *) stringByAddingPercentEscapes;
+- (NSString *) stringByReplacingCharacter:(unsigned short)arg0 withCharacter:(unsigned short)arg1;
+@end
+
@interface NSString (UICaboodle)
+ (NSString *) stringWithDataSize:(double)size;
+- (NSString *) stringByAddingPercentEscapesIncludingReserved;
@end
@implementation NSString (UICaboodle)
return [NSString stringWithFormat:@"%.1f%s", size, powers_[power]];
}
+- (NSString *) stringByAddingPercentEscapesIncludingReserved {
+ return [(id)CFURLCreateStringByAddingPercentEscapes(
+ kCFAllocatorDefault,
+ (CFStringRef) self,
+ NULL,
+ CFSTR(";/?:@&=+$,"),
+ kCFStringEncodingUTF8
+ ) autorelease];
+}
+
@end
#endif/*UICABOODLE_UCSTRING_H*/
--- /dev/null
+@interface NSObject (UICaboodle)
+- (id) yieldToSelector:(SEL)selector withObject:(id)object;
+- (id) yieldToSelector:(SEL)selector;
+@end
+
+@implementation NSObject (UICaboodle)
+
+- (void) doNothing {
+}
+
+- (void) _yieldToContext:(NSMutableArray *)context { _pooled
+ SEL selector(reinterpret_cast<SEL>([[context objectAtIndex:0] pointerValue]));
+ id object([[context objectAtIndex:1] nonretainedObjectValue]);
+ volatile bool &stopped(*reinterpret_cast<bool *>([[context objectAtIndex:2] pointerValue]));
+
+ /* XXX: deal with exceptions */
+ id value([self performSelector:selector withObject:object]);
+
+ NSMethodSignature *signature([self methodSignatureForSelector:selector]);
+ [context removeAllObjects];
+ if ([signature methodReturnLength] != 0 && value != nil)
+ [context addObject:value];
+
+ stopped = true;
+
+ [self
+ performSelectorOnMainThread:@selector(doNothing)
+ withObject:nil
+ waitUntilDone:NO
+ ];
+}
+
+- (id) yieldToSelector:(SEL)selector withObject:(id)object {
+ /*return [self performSelector:selector withObject:object];*/
+
+ volatile bool stopped(false);
+
+ NSMutableArray *context([NSMutableArray arrayWithObjects:
+ [NSValue valueWithPointer:selector],
+ [NSValue valueWithNonretainedObject:object],
+ [NSValue valueWithPointer:const_cast<bool *>(&stopped)],
+ nil]);
+
+ NSThread *thread([[[NSThread alloc]
+ initWithTarget:self
+ selector:@selector(_yieldToContext:)
+ object:context
+ ] autorelease]);
+
+ [thread start];
+
+ NSRunLoop *loop([NSRunLoop currentRunLoop]);
+ NSDate *future([NSDate distantFuture]);
+
+ while (!stopped && [loop runMode:NSDefaultRunLoopMode beforeDate:future]);
+
+ return [context count] == 0 ? nil : [context objectAtIndex:0];
+}
+
+- (id) yieldToSelector:(SEL)selector {
+ return [self yieldToSelector:selector withObject:nil];
+}
+
+@end
+++ /dev/null
-#define __STDC_LIMIT_MACROS
-#include <stdint.h>
-
-#include <objc/objc.h>
-
-#include <sys/time.h>
-#include <time.h>
-
-#define _forever \
- for (;;)
-
-extern struct timeval _ltv;
-extern bool _itv;
-
-#define _trace() do { \
- struct timeval _ctv; \
- gettimeofday(&_ctv, NULL); \
- if (!_itv) { \
- _itv = true; \
- _ltv = _ctv; \
- } \
- fprintf(stderr, "%lu.%.6u[%f]:_trace()@%s:%u[%s]\n", \
- _ctv.tv_sec, _ctv.tv_usec, \
- (_ctv.tv_sec - _ltv.tv_sec) + (_ctv.tv_usec - _ltv.tv_usec) / 1000000.0, \
- __FILE__, __LINE__, __FUNCTION__\
- ); \
- _ltv = _ctv; \
-} while (false)
-
-#define _assert(test) do \
- if (!(test)) { \
- fprintf(stderr, "_assert(%d:%s)@%s:%u[%s]\n", errno, #test, __FILE__, __LINE__, __FUNCTION__); \
- exit(-1); \
- } \
-while (false)
-
-#define _not(type) ((type) ~ (type) 0)
-
-#define _transient
-
-#define _label__(x) _label ## x
-#define _label_(y) _label__(y)
-#define _label _label_(__LINE__)
-
-#define _packed \
- __attribute__((packed))