62 #define OOFmt OOFormat
66 inline NSMutableString *
OOFormat( NSString *format, ... ) {
68 va_start(argp, format);
69 NSMutableString *str = [[NSMutableString alloc] initWithFormat:format arguments:argp];
96 idx = NSMakeRange( sub < 0 ? [str length]+sub : sub, 1 );
98 oo_inline OOStringSub( NSMutableString *
ref,
const NSRange &sub ) {
101 if ( (NSInteger)idx.length < 0 )
102 idx.length = [str length] + idx.length - idx.location;
103 else if ( idx.length == NSNotFound )
104 idx.length = [str length] - idx.location;
107 oo_inline BOOL isupper() {
return iswupper( **
this ); }
108 oo_inline BOOL islower() {
return iswlower( **
this ); }
116 return !!str && idx.location<[str length] ?
117 [str characterAtIndex:idx.location] : 0;
120 return [str substringWithRange:idx];
124 [str replaceCharactersInRange:idx withString:val];
128 return *
this = [NSString stringWithFormat:
@"%c", val];
131 return *
this = [NSString stringWithUTF8String:val];
168 NSMutableString *ref2;
178 if ( range.location != NSNotFound )
179 *
this = [str substringWithRange:range];
196 if ( !val )
OOWarn(
@"NULL const char * for OOString create" );
197 else rawset( [[NSMutableString
alloc] initWithUTF8String:val] );
200 if ( !val )
OOWarn(
@"NULL const char * passed in for OOString with len create" );
201 else if ( len < 0 )
OOWarn(
@"Negative length %d for const char * OOString create", (
int)len );
202 else rawset( [[NSMutableString
alloc] initWithBytes:val length:len encoding:encoding] );
205 if ( !data )
OOWarn(
@"nil OOData passed in for OOString create" );
206 else rawset( [[NSMutableString
alloc] initWithData:data encoding:encoding] );
209 *
this = val.join(
@" " );
212 #ifdef _LIBCPP_STRING
215 oo_inline operator std::string ()
const {
return [
get() UTF8String]; }
219 NSInteger len = [
get() lengthOfBytesUsingEncoding:encoding];
220 char *bytes = (
char *)malloc( len+1 );
221 [
get() getCString:bytes maxLength:len+1 encoding:encoding];
222 OOData out = [[NSData
alloc] initWithBytesNoCopy:bytes length:len freeWhenDone:YES];
231 return [
get() UTF8String];
243 unichar firstChar = (*this)[0];
244 return iswdigit( firstChar ) || firstChar ==
'.' || firstChar ==
'-' || firstChar ==
'+' ?
245 [
get() doubleValue] :
get() ? firstChar : 0;
256 OOCopyImmutable( (NSMutableString *)val );
285 [
get() replaceCharactersInRange:range withString:
@""];
289 NSString *str =[
get()
copy];
291 for (
int i=0 ; i<count ; i++ )
297 [
alloc() setString:val];
310 oo_inline BOOL
operator < ( NSString *str )
const {
return [
get() caseInsensitiveCompare:str] == NSOrderedAscending; }
312 oo_inline BOOL
operator > ( NSString *str )
const {
return [
get() caseInsensitiveCompare:str] == NSOrderedDescending; }
316 oo_inline BOOL
operator < ( NSMutableString *str )
const {
return [
get() caseInsensitiveCompare:str] == NSOrderedAscending; }
318 oo_inline BOOL
operator > ( NSMutableString *str )
const {
return [
get() caseInsensitiveCompare:str] == NSOrderedDescending; }
342 return [
noalloc() componentsSeparatedByString:sep];
374 #define OOSTRING_CONCATS( _type ) \
376 inline OOTmpString operator + ( _type left, NSString *str ) {\
377 return left.tmpcopy() += str;\
379 inline OOTmpString operator + ( _type left, int val ) {\
380 return left.tmpcopy() += val;\
382 inline OOTmpString operator + ( _type left, float val ) {\
383 return left.tmpcopy() += val;\
385 inline OOTmpString operator + ( _type left, double val ) {\
386 return left.tmpcopy() += val;\
388 inline OOTmpString operator + ( _type left, cOOString str ) {\
389 return operator + ( left, str.get() );\
391 inline OOTmpString operator + ( _type left, const char *str ) {\
392 return operator + ( left, OOString( str ) );\
394 inline OOTmpString operator + ( _type left, const OOArraySub<OOString> &str ) {\
395 return operator + ( left, str.get() );\
397 inline OOTmpString operator + ( _type left, const OODictionarySub<OOString> &str ) {\
398 return operator + ( left, str.get() );\
400 inline OOTmpString operator + ( _type left, const OOArraySub<NSString *> &str ) {\
401 return operator + ( left, str.get() );\
403 inline OOTmpString operator + ( _type left, const OODictionarySub<NSString *> &str ) {\
404 return operator + ( left, str.get() );\
408 inline OOTmpString operator - ( _type left, cOOString str ) {\
409 return left.tmpcopy() -= str;\
411 inline OOTmpString operator - ( _type left, NSString *str ) {\
412 return left.tmpcopy() -= str;\
414 inline OOTmpString operator - ( _type left, const char *val ) {\
415 return operator - ( left, OOString( val ).get() );\
425 for (
int i=0 ; i<count ; i++ )
431 template <
typename ETYPE>
433 return [
get() componentsJoinedByString:sep];
437 template <
typename ETYPE>
439 return left.
join( sep );
442 template <
typename ETYPE>
447 template <
typename ETYPE>
449 [alloc() removeAllObjects];
455 template <
typename ETYPE>
460 template <
typename ETYPE>
466 template <
typename ETYPE>
468 return OODictionarySub<ETYPE>(
this, sub.get() );
471 template <
typename ETYPE>
473 return OODictionarySub<ETYPE>(
this, sub.get() );
476 template <
typename ETYPE>
478 return OODictionarySub<ETYPE>(
this, sub.get() );
481 template <
typename ETYPE,
typename RTYPE,
typename STYPE>
483 return operator [] ( sub.get() );
486 template <
typename ETYPE,
typename RTYPE,
typename STYPE>
491 template <
typename ETYPE,
typename RTYPE,
typename STYPE>
497 template <
typename ETYPE>
498 inline OOArraySub<ETYPE> &OOArraySub<ETYPE>::operator = ( ETYPE val ) {
set( val );
return *
this; }
500 template <
typename ETYPE>
501 inline OODictionarySub<ETYPE> &OODictionarySub<ETYPE>::operator = ( ETYPE val ) {
set( val );
return *
this; }
503 template <
typename ETYPE>
504 inline OOArraySub<ETYPE> &OOArraySub<ETYPE>::operator = (
const char *val ) { *
this =
OOString(val).get();
return *
this; }
506 template <
typename ETYPE>
507 inline OODictionarySub<ETYPE> &OODictionarySub<ETYPE>::operator = (
const char *val ) { *
this =
OOString(val).get();
return *
this; }
509 template <
typename ETYPE>
511 [alloc() addObject:!val ?
OONull : (id)val];
548 template <
typename PTYPE>
555 ptr = val ==
OONull || ![val respondsToSelector:
@selector(pointerValue)] ?
556 NULL : (PTYPE)[val pointerValue];
565 return !*
this ? NULL :
ptr;
587 #if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_7 \
588 || __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0
590 #define OO_REG_FLAGS NSRegularExpressionDotMatchesLineSeparators
617 for (
int i=0 ; i<=[
regex numberOfCaptureGroups] ; i++ )
618 groups[i] =
OOString( str, [matches rangeAtIndex:i] );
625 init( patin, flags );
630 OOWarn(
@"OOPattern::init - nil pattern passed" );
634 if ( !!cache[flags][patin] ) {
635 regex = *cache[flags][patin];
639 NSError *error = nil;
640 regex = [NSRegularExpression regularExpressionWithPattern:
pat
641 options:flags error:&error];
643 OOWarn(
@"OOPattern::init() Regex compilation error: %@, in pattern: \"%@\
"",
644 [error localizedDescription], *
pat );
646 cache[flags][patin] =
regex;
651 return [
regex firstMatchInString:input options:0
range:NSMakeRange(0,[input length])];
654 return [
regex rangeOfFirstMatchInString:input options:0
range:NSMakeRange(0,[input length])];
661 for ( NSTextCheckingResult *result in [
regex matchesInString:str options:0
range:NSMakeRange(0,[str length])] ) {
663 pos = result.range.location+result.range.length;
671 for ( NSTextCheckingResult *result in [
regex matchesInString:str options:0
range:NSMakeRange(0,[str length])] )
676 if ( ![
regex numberOfCaptureGroups] )
680 for ( NSTextCheckingResult *result in [
regex matchesInString:str options:0
range:NSMakeRange(0,[str length])] )
681 for (
int i=1 ; i<=[
regex numberOfCaptureGroups] ; i++ )
682 out +=
OOString( str, [result rangeAtIndex:i] );
689 NSTextCheckingResult *result =
exec( str );
697 for ( NSTextCheckingResult *result in [
regex matchesInString:str options:0
range:NSMakeRange(0,[str length])] )
705 for ( NSTextCheckingResult *result in [
regex matchesInString:str options:0
range:NSMakeRange(0,[str length])] ) {
707 out += callback(
matchGroups( str, result ) ).get();
708 pos = result.range.location+result.range.length;
728 init( pat, rep, flags );
736 for (
const char *options = *split[3] ; *options ; options++ )
737 switch ( *options ) {
738 case 'i': flags |= NSRegularExpressionCaseInsensitive;
break;
739 case 'm': flags |= NSRegularExpressionAnchorsMatchLines;
break;
742 init( *split[1], *split[2], flags );
750 return [
pattern.
regex stringByReplacingMatchesInString:input options:0 range:NSMakeRange(0,[input length]) withTemplate:
replace];
754 __block NSUInteger pos = 0;
761 [
pattern.
regex enumerateMatchesInString:input options:0 range:NSMakeRange(0,[input length])
762 usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
763 [out appendString:
OOString( input,
OORange(pos,result.range.location) )];
764 [out appendString:[
pattern.
regex replacementStringForResult:result inString:input
765 offset:0
template:*outputs[ono++]]];
766 pos = result.range.location+result.range.length;
794 return sep.
split( *
this );
837 NSLog(
@"** nil string for subscripted match with pattern: %@", *sub );
843 NSLog(
@"** nil pattern in subscripted match" );
851 return pattern().range( *str );
860 return range().location;
868 return !*str || !pattern().exec( *str );
882 return pattern().match( *str );
889 return pattern().parseAll( *str );
899 return *
this = *
OOString( replacement );
902 return *str =
OOReplace( idx, nil ).
exec( *str, replacements );
905 return *str = pattern().blockReplace( *str, callback );
912 return *replacements[groups[0]]||*groups[0];
917 return pattern().match( *str )[group];
936 template <
typename ETYPE>
938 return *
this = search.
match();
941 template <
typename ETYPE>
943 return *
this = search.
match();
956 #define OOVars( _type, _vars... ) _type _vars; OOAssign<_type>( _vars )
957 #define OOStringVars( _vars... ) OOVars( OOString, _vars )
958 #define OOStringAssign OOAssign<OOString>
960 template <
typename ETYPE>
965 ETYPE &v1 = *(ETYPE *)NULL, ETYPE &v2 = *(ETYPE *)NULL, ETYPE &v3 = *(ETYPE *)NULL,
966 ETYPE &v4 = *(ETYPE *)NULL, ETYPE &v5 = *(ETYPE *)NULL, ETYPE &v6 = *(ETYPE *)NULL,
967 ETYPE &v7 = *(ETYPE *)NULL, ETYPE &v8 = *(ETYPE *)NULL, ETYPE &v9 = *(ETYPE *)NULL ) {
968 vars[0] = (ETYPE *)v0.ptr();
969 vars[1] = (ETYPE *)v1.ptr(); vars[2] = (ETYPE *)v2.ptr(); vars[3] = (ETYPE *)v3.ptr();
970 vars[4] = (ETYPE *)v4.ptr(); vars[5] = (ETYPE *)v5.ptr(); vars[6] = (ETYPE *)v6.ptr();
971 vars[7] = (ETYPE *)v7.ptr(); vars[8] = (ETYPE *)v8.ptr(); vars[9] = (ETYPE *)v9.ptr();
974 for (
int i=0 ; vars[i] && i<
sizeof vars/
sizeof vars[0] ; i++ )
986 #define cOORequest const OORequest &
987 #define cOOURL const OOURL &
988 #define cOOFile const OOFile &
989 #define cOOData const OOData &
991 static jmp_buf oo_jmp_env;
993 static void oo_trapper(
int sig ) {
994 NSLog(
@"SIGNAL %d", sig );
995 longjmp( oo_jmp_env, 1 );
999 signal( SIGSEGV, oo_trapper );
1000 signal( SIGBUS, oo_trapper );
1001 return setjmp( oo_jmp_env );
1018 NSURLRequestCachePolicy cachePolicy = NSURLRequestUseProtocolCachePolicy,
1019 NSTimeInterval timeoutInterval = 60. ) {
1020 rawset( [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:cachePolicy
1021 timeoutInterval:timeoutInterval] );
1037 NSURL *URL = [[NSURL alloc] initWithString:url];
1038 rawset( [[NSMutableURLRequest alloc] initWithURL:URL] );
1043 set( (id)val );
return *
this;
1047 [
get() setHTTPMethod:
@"POST"];
1048 [
get() setValue:
OOFormat(
@"%d", (
int)[data length] )
1049 forHTTPHeaderField:
@"Content-Length"];
1050 [
get() setHTTPBody:data];
1054 [
get() setValue:
@"application/x-www-form-urlencoded"
1055 forHTTPHeaderField:
@"Content-Encoding"];
1056 post( [urlEncode( str ) dataUsingEncoding:encoding allowLossyConversion:YES] );
1061 NSMutableString *encoded = [NSMutableString string];
1062 for (
const char *iptr = [text UTF8String] ; iptr && *iptr ; iptr++ )
1063 if ( *iptr > 0 && *iptr !=
'%' )
1064 [encoded appendFormat:
@"%c", *iptr];
1066 [encoded appendFormat:
@"%%%02x", *iptr&0xff];
1072 [[NSURLCache sharedURLCache] removeCachedResponseForRequest:
get()];
1074 OOData data = [NSURLConnection sendSynchronousRequest:
get() returningResponse:&lastResponse error:errorPtr];
1076 NSURLResponse *tmpResponse;
1077 OOData data = [NSURLConnection sendSynchronousRequest:
get() returningResponse:&tmpResponse error:errorPtr];
1078 lastResponse = tmpResponse;
1081 NSString *textEncoding = [lastResponse textEncodingName];
1082 CFStringEncoding coreEncoding = textEncoding ?
1083 CFStringConvertIANACharSetNameToEncoding(
OO_BRIDGE(CFStringRef)textEncoding ) :
1084 kCFStringEncodingUTF8;
1085 *encoding = CFStringConvertEncodingToNSStringEncoding( coreEncoding );
1092 NSStringEncoding tmpEnc;
1095 OOData data = this->data( encoding, errorPtr );
1096 return OOString( data, *encoding );
1103 class OORequestSub {
1115 [req->get() setValue:val forHTTPHeaderField:key];
1119 return [req->get() valueForHTTPHeaderField:key];
1124 return OORequestSub(
this, sub );
1138 setURL( url, base );
1141 setURL( url, base );
1146 [[NSURL alloc] initWithString:url relativeToURL:baseURL] :
1147 [[NSURL alloc] initWithString:url] );
1153 return [[
get() absoluteString] isEqualToString:[other absoluteString]];
1156 return [NSMutableString stringWithContentsOfURL:
get() usedEncoding:enc error:error];
1159 return [NSMutableData dataWithContentsOfURL:
get() options:readOptionsMask error:errorPtr];
1168 return [NSKeyedUnarchiver unarchiveObjectWithData:data()];
1171 return request().post( post );
1175 return save( [
string dataUsingEncoding:encoding allowLossyConversion:YES] );
1178 return [data writeToURL:*
this atomically:atomically];
1181 return save( [NSKeyedArchiver archivedDataWithRootObject:
object], atomically );
1184 OONode xml(
int flags = 0 );
1188 rawset( [[NSMutableURLRequest
alloc] initWithURL:url] );
1208 setPath( path, isDir );
1211 setPath( [[NSBundle mainBundle] pathForResource:name ofType:type] );
1215 rawset( [[NSURL alloc] initFileURLWithPath:path.get() isDirectory:isDir] );
1219 return [
get() baseURL] ? [
get() relativeString] : [
get() path];
1222 return [path() lastPathComponent];
1225 return [path() stringByDeletingLastPathComponent];
1228 return [path() pathExtension];
1231 return setPath( [path() stringByResolvingSymlinksInPath] );
1234 return [[NSFileManager defaultManager] attributesOfItemAtPath:path() error:error];
1237 return [attr() fileSize];
1241 return [[NSFileManager defaultManager] fileExistsAtPath:path()];
1244 return [[NSFileManager defaultManager] copyItemAtPath:path() toPath:to error:NULL];
1247 return [[NSFileManager defaultManager] moveItemAtPath:path() toPath:to error:NULL];
1250 return [[NSFileManager defaultManager] linkItemAtPath:path() toPath:to error:NULL];
1253 return [[NSFileManager defaultManager] removeItemAtPath:path() error:NULL];
1256 return [[NSFileManager defaultManager] createDirectoryAtPath:path()
1257 withIntermediateDirectories:flag attributes:attr error:NULL];
1260 save( str );
return *
this;
1263 save( *data );
return *
this;
1266 return *
this = file.
data();
1286 setPath( [[NSBundle mainBundle] pathForResource:**comps[0]
1287 ofType:comps>1 ? **comps[1] : nil] );
1297 #ifdef __IPHONE_OS_VERSION_MIN_REQUIRED
1299 OOFile(
OOFormat(
@"%@/Documents/%@", NSHomeDirectory(), *name ) ) {}
1302 OOFile( [[[[NSFileManager defaultManager]
1303 URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]
1304 lastObject] URLByAppendingPathComponent:name] ) {}
1313 #ifdef __IPHONE_OS_VERSION_MIN_REQUIRED
1318 OOFile( [[[[NSFileManager defaultManager]
1319 URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask]
1320 lastObject] URLByAppendingPathComponent:name] ) {}
1328 class OODefaultsSub :
public OODictionarySub<OOString> {
1333 id value = [[NSUserDefaults standardUserDefaults] objectForKey:key];
1334 if ( [value
class] == [NSArray
class] ||
1335 [value
class] == [NSDictionary
class] )
1336 OO_RELEASE(
set( value = [value mutableCopy] ) );
1338 OODictionarySub<OOString>::set( value );
1339 return value !=
OONull ? value : nil;
1342 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
1343 [defaults setObject:value forKey:key];
1345 return OODictionarySub<OOString>::set( value );
1348 oo_inline OODefaultsSub &operator = (
cOOString val ) {
set( val.get() );
return *
this; }
1349 oo_inline OODefaultsSub &operator = ( CFStringRef val ) {
set(
OO_BRIDGE(
id)val ); return *this; }
1350 oo_inline OODefaultsSub &operator = ( NSString *val ) {
set( val );
return *
this; }
1351 oo_inline OODefaultsSub &operator = ( NSArray *val ) {
set( val );
return *
this; }
1352 oo_inline OODefaultsSub &operator = ( NSDictionary *val ) {
set( val );
return *
this; }
1353 oo_inline OODefaultsSub &operator = (
const OORef<NSMutableArray *> &val ) {
set( val.get() );
return *
this; }
1354 oo_inline OODefaultsSub &operator = (
const OORef<NSMutableDictionary *> &val ) {
set( val.get() );
return *
this; }
1355 oo_inline OODefaultsSub &operator = (
long long val ) {
set( [[NSNumber numberWithLongLong:val] stringValue] );
return *
this; }
1356 oo_inline OODefaultsSub &operator = (
double val ) {
set( [[NSNumber numberWithDouble:val] stringValue] );
return *
this; }
1357 oo_inline OODefaultsSub &operator = (
float val ) {
set( [[NSNumber numberWithFloat:val] stringValue] );
return *
this; }
1358 oo_inline OODefaultsSub &operator = (
int val ) {
set( [[NSNumber numberWithInt:val] stringValue] );
return *
this; }
1359 oo_inline OODefaultsSub &operator = ( BOOL val ) {
set( [[NSNumber numberWithBool:val] stringValue] );
return *
this; }
1361 oo_inline operator long long () {
return [
get() longLongValue]; }
1362 oo_inline operator double () {
return [
get() doubleValue]; }
1363 oo_inline operator float () {
return [
get() floatValue]; }
1364 oo_inline operator BOOL () {
return [
get() boolValue]; }
1365 oo_inline operator int () {
return [
get() intValue]; }
1366 oo_inline operator NSDictionary * () {
return get(); }
1367 oo_inline operator NSString * () {
return get(); }
1368 oo_inline operator NSArray * () {
return get(); }
1370 oo_inline OODefaultsSub &operator = (
long val ) {
set( [[NSNumber numberWithLong:val] stringValue] );
return *
this; }
1371 oo_inline operator long () {
return [
get() intValue]; }
1374 [[NSUserDefaults standardUserDefaults] removeObjectForKey:key];
1375 return OODictionarySub<OOString>::operator ~ ();
1385 NSMutableDictionary *ref3;
1393 *
this <<= [[NSUserDefaults standardUserDefaults] dictionaryRepresentation];
1396 return OODefaultsSub(
this, key );
1399 return OODefaultsSub(
this, key );
1401 oo_inline OODefaultsSub operator [] (
const CFStringRef sub )
const {
1405 [[NSUserDefaults standardUserDefaults] synchronize];
1419 set( (NSMutableDictionary *)[bundle infoDictionary] );
1433 char const *argv[100], *envp[1000], **eptr = envp;
1435 for (
int i=0 ; i<command ; i++ )
1436 argv[i] = command[i];
1437 argv[command] = NULL;
1439 int input[2], output[2];
1440 if ( pipe( input ) < 0 || pipe( output ) < 0 )
1441 NSLog(
@"OOTask::exec - pipe() problem" );
1443 if ( (pid = fork()) == 0 ) {
1445 FILE *fp = popen(
"/usr/bin/perl -e 'print \"$_=$ENV{$_}\\n\" foreach keys %ENV; exit 99;'",
"r" );
1448 while( fp && fgets( line,
sizeof line, fp ) ) {
1449 line[strlen(line)-1] =
'\000';
1450 *eptr++ = strdup(line);
1452 if ( pclose( fp )>>8 != 99 )
1462 close( 0 ); dup( input[0] ); close( input[0] );
1463 close( 1 ); dup( output[1] );
1464 close( 2 ); dup( output[1] ); close( output[1] );
1466 if ( execve( argv[0], (
char *
const *)argv, (
char *
const *)envp ) < 0 )
1467 NSLog(
@"OOTask::exec - execve failed" );
1474 standardInput = input[1];
1475 return fdopen( output[0],
"r" );
1479 int input[2], output[2];
1480 if ( pipe( input ) < 0 || pipe( output ) < 0 )
1481 NSLog(
@"OOTask::exec - pipe() problem" );
1483 if ( (pid = fork()) == 0 ) {
1489 close( 0 ); dup( input[0] ); close( input[0] );
1490 close( 1 ); dup( output[1] ); close( output[1] );
1499 standardInput = input[1];
1500 return fdopen( output[0],
"r" );
1504 ssize_t wrote = write( standardInput, [input bytes], [input length] );
1505 close( standardInput );
1510 if ( standardInput >= 0 )
1511 close( standardInput );
1513 if ( waitpid(pid,&status,0) < 0 )
1514 NSLog(
@"OOTask::exec - wait problem" );
1519 #if __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_7 \
1520 || __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_5_0
1530 set( [NSJSONSerialization JSONObjectWithData:data
1531 options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:NULL] );
1535 return [NSJSONSerialization dataWithJSONObject:
get() options:NSJSONWritingPrettyPrinted error:NULL];
1547 inline NSInteger OOAlert(
OOString msg,
id del = nil,
1549 NSLog(
@"** OOAlert: %@", *msg );
1550 #ifdef APPKIT_EXTERN
1551 return [[NSAlert alertWithMessageText:*
OOInfo()[kCFBundleNameKey]
1552 defaultButton:cancel alternateButton:b1 otherButton:b2
1553 informativeTextWithFormat:
@"%@", *msg] runModal];
1555 #ifdef __IPHONE_OS_VERSION_MIN_REQUIRED
1556 dispatch_async( dispatch_get_main_queue(), ^ {
1557 UIAlertView *alert = [[UIAlertView alloc]
1558 initWithTitle:*
OOInfo()[
@"CFBundleDisplayName"] message:msg delegate:del
1559 cancelButtonTitle:cancel otherButtonTitles:*b1, *b2, nil];
1575 rawset( [[NSNumber alloc] initWithDouble:d] );
1581 oo_inline operator NSNumber * ()
const {
return get(); }
1582 oo_inline operator double ()
const {
return [
get() doubleValue]; }
1604 OO_RELEASE( *(scan = [[NSScanner alloc] initWithString:input]) );
1608 NSString *out = nil;
1609 [*scan scanString:str intoString:&out];
1613 NSString *out = nil;
1614 [*scan scanUpToString:str intoString:&out];
1618 [*scan scanDouble:&d];
1622 [*scan scanFloat:&f];