From 11cd030858934f62f5e91b0bff5924f8fa098f90 Mon Sep 17 00:00:00 2001 From: "Jay Freeman (saurik)" Date: Wed, 17 Jun 2009 06:42:06 +0000 Subject: 20 minutes of typing. --- UICaboodle/Internals.h | 10 -------- UICaboodle/UCInternal.h | 10 ++++++++ UICaboodle/UCPlatform.h | 49 +++++++++++++++++++++++++++++++++++++ UICaboodle/UCString.h | 16 +++++++++++++ UICaboodle/UCYield.h | 64 +++++++++++++++++++++++++++++++++++++++++++++++++ UICaboodle/UICaboodle.h | 46 ----------------------------------- 6 files changed, 139 insertions(+), 56 deletions(-) delete mode 100644 UICaboodle/Internals.h create mode 100644 UICaboodle/UCInternal.h create mode 100644 UICaboodle/UCPlatform.h create mode 100644 UICaboodle/UCYield.h delete mode 100644 UICaboodle/UICaboodle.h diff --git a/UICaboodle/Internals.h b/UICaboodle/Internals.h deleted file mode 100644 index 62b46e2..0000000 --- a/UICaboodle/Internals.h +++ /dev/null @@ -1,10 +0,0 @@ -- (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; -} diff --git a/UICaboodle/UCInternal.h b/UICaboodle/UCInternal.h new file mode 100644 index 0000000..62b46e2 --- /dev/null +++ b/UICaboodle/UCInternal.h @@ -0,0 +1,10 @@ +- (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; +} diff --git a/UICaboodle/UCPlatform.h b/UICaboodle/UCPlatform.h new file mode 100644 index 0000000..0940406 --- /dev/null +++ b/UICaboodle/UCPlatform.h @@ -0,0 +1,49 @@ +#define __STDC_LIMIT_MACROS +#include + +#include + +#include +#include + +#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 diff --git a/UICaboodle/UCString.h b/UICaboodle/UCString.h index 77ee6a1..d776728 100644 --- a/UICaboodle/UCString.h +++ b/UICaboodle/UCString.h @@ -3,8 +3,14 @@ #import +@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) @@ -21,6 +27,16 @@ 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*/ diff --git a/UICaboodle/UCYield.h b/UICaboodle/UCYield.h new file mode 100644 index 0000000..dc75f8f --- /dev/null +++ b/UICaboodle/UCYield.h @@ -0,0 +1,64 @@ +@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([[context objectAtIndex:0] pointerValue])); + id object([[context objectAtIndex:1] nonretainedObjectValue]); + volatile bool &stopped(*reinterpret_cast([[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(&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 diff --git a/UICaboodle/UICaboodle.h b/UICaboodle/UICaboodle.h deleted file mode 100644 index f9a4eb3..0000000 --- a/UICaboodle/UICaboodle.h +++ /dev/null @@ -1,46 +0,0 @@ -#define __STDC_LIMIT_MACROS -#include - -#include - -#include -#include - -#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)) -- cgit v1.2.3