Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

99 lines (85 sloc) 4.414 kb
#import "VTPG_Common.h"
// Copyright (c) 2008-2010, Vincent Gable.
// http://vincentgable.com
//
//based off http://www.dribin.org/dave/blog/archives/2008/09/22/convert_to_nsstring/
//
static BOOL TypeCodeIsCharArray(const char *typeCode){
int lastCharOffset = strlen(typeCode) - 1;
int secondToLastCharOffset = lastCharOffset - 1 ;
BOOL isCharArray = typeCode[0] == '[' &&
typeCode[secondToLastCharOffset] == 'c' && typeCode[lastCharOffset] == ']';
for(int i = 1; i < secondToLastCharOffset; i++)
isCharArray = isCharArray && isdigit(typeCode[i]);
return isCharArray;
}
//since BOOL is #defined as a signed char, we treat the value as
//a BOOL if it is exactly YES or NO, and a char otherwise.
static NSString* VTPGStringFromBoolOrCharValue(BOOL boolOrCharvalue) {
if(boolOrCharvalue == YES)
return @"YES";
if(boolOrCharvalue == NO)
return @"NO";
return [NSString stringWithFormat:@"'%c'", boolOrCharvalue];
}
static NSString *VTPGStringFromFourCharCodeOrUnsignedInt32(FourCharCode fourcc) {
return [NSString stringWithFormat:@"%u ('%c%c%c%c')",
fourcc,
(fourcc >> 24) & 0xFF,
(fourcc >> 16) & 0xFF,
(fourcc >> 8) & 0xFF,
fourcc & 0xFF];
}
static NSString *StringFromNSDecimalWithCurrentLocal(NSDecimal dcm) {
return NSDecimalString(&dcm, [NSLocale currentLocale]);
}
NSString * VTPG_DDToStringFromTypeAndValue(const char * typeCode, void * value) {
#define IF_TYPE_MATCHES_INTERPRET_WITH(typeToMatch,func) \
if (strcmp(typeCode, @encode(typeToMatch)) == 0) \
return (func)(*(typeToMatch*)value)
#if TARGET_OS_IPHONE
IF_TYPE_MATCHES_INTERPRET_WITH(CGPoint,NSStringFromCGPoint);
IF_TYPE_MATCHES_INTERPRET_WITH(CGSize,NSStringFromCGSize);
IF_TYPE_MATCHES_INTERPRET_WITH(CGRect,NSStringFromCGRect);
#else
IF_TYPE_MATCHES_INTERPRET_WITH(NSPoint,NSStringFromPoint);
IF_TYPE_MATCHES_INTERPRET_WITH(NSSize,NSStringFromSize);
IF_TYPE_MATCHES_INTERPRET_WITH(NSRect,NSStringFromRect);
#endif
IF_TYPE_MATCHES_INTERPRET_WITH(NSRange,NSStringFromRange);
IF_TYPE_MATCHES_INTERPRET_WITH(Class,NSStringFromClass);
IF_TYPE_MATCHES_INTERPRET_WITH(SEL,NSStringFromSelector);
IF_TYPE_MATCHES_INTERPRET_WITH(BOOL,VTPGStringFromBoolOrCharValue);
IF_TYPE_MATCHES_INTERPRET_WITH(NSDecimal,StringFromNSDecimalWithCurrentLocal);
#define IF_TYPE_MATCHES_INTERPRET_WITH_FORMAT(typeToMatch,formatString) \
if (strcmp(typeCode, @encode(typeToMatch)) == 0) \
return [NSString stringWithFormat:(formatString), (*(typeToMatch*)value)]
IF_TYPE_MATCHES_INTERPRET_WITH_FORMAT(CFStringRef,@"%@"); //CFStringRef is toll-free bridged to NSString*
IF_TYPE_MATCHES_INTERPRET_WITH_FORMAT(CFArrayRef,@"%@"); //CFArrayRef is toll-free bridged to NSArray*
IF_TYPE_MATCHES_INTERPRET_WITH(FourCharCode, VTPGStringFromFourCharCodeOrUnsignedInt32);
IF_TYPE_MATCHES_INTERPRET_WITH_FORMAT(long long,@"%lld");
IF_TYPE_MATCHES_INTERPRET_WITH_FORMAT(unsigned long long,@"%llu");
IF_TYPE_MATCHES_INTERPRET_WITH_FORMAT(float,@"%f");
IF_TYPE_MATCHES_INTERPRET_WITH_FORMAT(double,@"%f");
IF_TYPE_MATCHES_INTERPRET_WITH_FORMAT(id,@"%@");
IF_TYPE_MATCHES_INTERPRET_WITH_FORMAT(short,@"%hi");
IF_TYPE_MATCHES_INTERPRET_WITH_FORMAT(unsigned short,@"%hu");
IF_TYPE_MATCHES_INTERPRET_WITH_FORMAT(int,@"%i");
IF_TYPE_MATCHES_INTERPRET_WITH_FORMAT(unsigned, @"%u");
IF_TYPE_MATCHES_INTERPRET_WITH_FORMAT(long,@"%i");
IF_TYPE_MATCHES_INTERPRET_WITH_FORMAT(long double,@"%Lf"); //WARNING on older versions of OS X, @encode(long double) == @encode(double)
//C-strings
IF_TYPE_MATCHES_INTERPRET_WITH_FORMAT(char*, @"%s");
IF_TYPE_MATCHES_INTERPRET_WITH_FORMAT(const char*, @"%s");
if(TypeCodeIsCharArray(typeCode))
return [NSString stringWithFormat:@"%s", (char*)value];
IF_TYPE_MATCHES_INTERPRET_WITH_FORMAT(void*,@"(void*)%p");
//This is a hack to print out CLLocationCoordinate2D, without needing to #import <CoreLocation/CoreLocation.h>
//A CLLocationCoordinate2D is a struct made up of 2 doubles.
//We detect it by hard-coding the result of @encode(CLLocationCoordinate2D).
//We get at the fields by treating it like an array of doubles, which it is identical to in memory.
if(strcmp(typeCode, "{?=dd}")==0)//@encode(CLLocationCoordinate2D)
return [NSString stringWithFormat:@"{latitude=%g,longitude=%g}",((double*)value)[0],((double*)value)[1]];
//we don't know how to convert this typecode into an NSString
return nil;
}
Jump to Line
Something went wrong with that request. Please try again.