From cdf070c8d76ffc4eaa24e8671756cbbe9ceb2890 Mon Sep 17 00:00:00 2001 From: thomasvl Date: Mon, 14 Apr 2008 17:21:02 +0000 Subject: See the ReleaseNotes for the full details, highlights: - bug fixes - code coverage support - more complete unittests - full support for unittesting UIs - support for the iphone sdk (include ui unittesting) --- Foundation/GTMNSString+HTML.m | 65 +++++++++++++++++++++---------------------- 1 file changed, 31 insertions(+), 34 deletions(-) (limited to 'Foundation/GTMNSString+HTML.m') diff --git a/Foundation/GTMNSString+HTML.m b/Foundation/GTMNSString+HTML.m index f9e99dc..a6abb0e 100644 --- a/Foundation/GTMNSString+HTML.m +++ b/Foundation/GTMNSString+HTML.m @@ -17,7 +17,10 @@ // the License. // +#import "GTMDefines.h" #import "GTMNSString+HTML.h" +#import "GTMNSString+Utilities.h" +#import "GTMMethodCheck.h" typedef struct { NSString *escapeSequence; @@ -355,7 +358,7 @@ static HTMLEscapeMap gUnicodeHTMLEscapeMap[] = { // Utility function for Bsearching table above -static int escapeMapCompare(const void *ucharVoid, const void *mapVoid) { +static int EscapeMapCompare(const void *ucharVoid, const void *mapVoid) { unichar *uchar = (unichar*)ucharVoid; HTMLEscapeMap *map = (HTMLEscapeMap*)mapVoid; int val; @@ -370,45 +373,49 @@ static int escapeMapCompare(const void *ucharVoid, const void *mapVoid) { } @implementation NSString (GTMNSStringHTMLAdditions) +GTM_METHOD_CHECK(NSString, gtm_UTF16StringWithLength:); - (NSString *)gtm_stringByEscapingHTMLUsingTable:(HTMLEscapeMap*)table ofSize:(int)size - escapingUnicode:(BOOL)escapeUnicode { - NSMutableString *finalString = [NSMutableString string]; + escapingUnicode:(BOOL)escapeUnicode { int length = [self length]; - require_quiet(length != 0, cantConvertAnything); + if (!length) { + return nil; + } + + NSMutableString *finalString = [NSMutableString string]; - unichar *buffer = malloc(sizeof(unichar) * length); - require_action(buffer, cantAllocBuffer, finalString = nil); - unichar *buffer2 = malloc(sizeof(unichar) * length); - require_action(buffer2, cantAllocBuffer2, finalString = nil); + NSMutableData *data2 = [NSMutableData dataWithCapacity:sizeof(unichar) * length]; + const unichar *buffer = (const unichar *)[self gtm_UTF16StringWithLength:nil]; + + if (!buffer || !data2) { + // COV_NF_BEGIN + _GTMDevLog(@"Unable to allocate buffer or data2"); + return nil; + // COV_NF_END + } + + unichar *buffer2 = (unichar *)[data2 mutableBytes]; - [self getCharacters:buffer]; int buffer2Length = 0; for (int i = 0; i < length; ++i) { HTMLEscapeMap *val = bsearch(&buffer[i], table, size / sizeof(HTMLEscapeMap), - sizeof(HTMLEscapeMap), escapeMapCompare); + sizeof(HTMLEscapeMap), EscapeMapCompare); if (val || (escapeUnicode && buffer[i] > 127)) { if (buffer2Length) { - CFStringRef buffer2String = - CFStringCreateWithCharactersNoCopy(kCFAllocatorDefault, - buffer2, buffer2Length, - kCFAllocatorNull); - require_action(buffer2String, cantCreateString, finalString = nil); - [finalString appendString:(NSString*)buffer2String]; - CFRelease(buffer2String); + CFStringAppendCharacters((CFMutableStringRef)finalString, + buffer2, + buffer2Length); buffer2Length = 0; } if (val) { [finalString appendString:val->escapeSequence]; } - else if (escapeUnicode && buffer[i] > 127) { + else { + _GTMDevAssert(escapeUnicode && buffer[i] > 127, @"Illegal Character"); [finalString appendFormat:@"&#%d;", buffer[i]]; - } else { - // Should never get here. Assert in debug. - require_action(NO, cantCreateString, finalString = nil); } } else { buffer2[buffer2Length] = buffer[i]; @@ -416,20 +423,10 @@ static int escapeMapCompare(const void *ucharVoid, const void *mapVoid) { } } if (buffer2Length) { - CFStringRef buffer2String = - CFStringCreateWithCharactersNoCopy(kCFAllocatorDefault, - buffer2, buffer2Length, - kCFAllocatorNull); - require_action(buffer2String, cantCreateString, finalString = nil); - [finalString appendString:(NSString*)buffer2String]; - CFRelease(buffer2String); + CFStringAppendCharacters((CFMutableStringRef)finalString, + buffer2, + buffer2Length); } -cantCreateString: - free(buffer2); -cantAllocBuffer2: - free(buffer); -cantAllocBuffer: -cantConvertAnything: return finalString; } -- cgit v1.2.3