From 53d1958055b4eba6c5f2d2569b9a41451e306534 Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Thu, 20 Dec 2007 21:57:49 +0000 Subject: [PATCH] Monotone-Parent: 829091932d60b0fc62276de7ab03d48d248b54e1 Monotone-Revision: 3e42d115059ba6eeaba7c45ff4f1b67baae90829 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2007-12-20T21:57:49 Monotone-Branch: ca.inverse.sogo --- SOPE/NGCards/ChangeLog | 7 +++++ SOPE/NGCards/NGCardsSaxHandler.m | 4 +-- SOPE/NGCards/NSString+NGCards.h | 3 +- SOPE/NGCards/NSString+NGCards.m | 52 +++++++++++++++++++++++--------- 4 files changed, 49 insertions(+), 17 deletions(-) diff --git a/SOPE/NGCards/ChangeLog b/SOPE/NGCards/ChangeLog index 5e6348e4f..15921e0c0 100644 --- a/SOPE/NGCards/ChangeLog +++ b/SOPE/NGCards/ChangeLog @@ -1,3 +1,10 @@ +2007-12-20 Wolfgang Sourdeau + + * NSString+NGCards.m ([NSString + -componentsWithSafeSeparator:separator]): new method that + separated the elements of a string into an array while avoiding + escaped instances of the separator passed as parameter. + 2007-12-12 Wolfgang Sourdeau * iCalTimeZone.m ([iCalTimeZone -periodForDate:date]): at least diff --git a/SOPE/NGCards/NGCardsSaxHandler.m b/SOPE/NGCards/NGCardsSaxHandler.m index dd939c179..f01097394 100644 --- a/SOPE/NGCards/NGCardsSaxHandler.m +++ b/SOPE/NGCards/NGCardsSaxHandler.m @@ -247,7 +247,7 @@ free (content); content = NULL; // NSLog (@"content: '%@'", s); - contentValues = [s componentsSeparatedByString: @";"]; + contentValues = [s componentsWithSafeSeparator: ';']; } else contentValues = nil; @@ -270,7 +270,7 @@ else { /* increase content */ - content = + content = realloc (content, (contentLength + _len+2) * sizeof(unichar)); memcpy (&(content[contentLength]), _chars, (_len * sizeof(unichar))); diff --git a/SOPE/NGCards/NSString+NGCards.h b/SOPE/NGCards/NSString+NGCards.h index 0311ab6be..b0ccf2d86 100644 --- a/SOPE/NGCards/NSString+NGCards.h +++ b/SOPE/NGCards/NSString+NGCards.h @@ -25,6 +25,7 @@ #import +@class NSArray; @class NSCalendarDate; @class NSTimeZone; @@ -39,7 +40,7 @@ - (NSCalendarDate *) asCalendarDate; - (BOOL) isAllDayDate; -- (NSArray *) commaSeparatedValues; +- (NSArray *) componentsWithSafeSeparator: (unichar) separator; @end diff --git a/SOPE/NGCards/NSString+NGCards.m b/SOPE/NGCards/NSString+NGCards.m index 2076e63b1..2c96e2bdc 100644 --- a/SOPE/NGCards/NSString+NGCards.m +++ b/SOPE/NGCards/NSString+NGCards.m @@ -261,26 +261,50 @@ static NSString *commaSeparator = nil; return ([self length] == 8); } -- (NSArray *) commaSeparatedValues +- (NSArray *) componentsWithSafeSeparator: (unichar) separator { - NSEnumerator *rawValues; - NSMutableArray *values; - NSString *currentValue, *newValue; + NSMutableArray *components; + NSRange currentRange; + unichar *stringBuffer; + unichar currentChar; + unsigned int count, length; + BOOL escaped; - values = [NSMutableArray new]; - [values autorelease]; + components = [NSMutableArray array]; - rawValues = [[self componentsSeparatedByString: @","] objectEnumerator]; - currentValue = [rawValues nextObject]; - while (currentValue) + length = [self length]; + stringBuffer = malloc (sizeof (unichar) * length); + [self getCharacters: stringBuffer]; + + currentRange = NSMakeRange(0, 0); + escaped = NO; + count = 0; + while (count < length) { - newValue = [currentValue stringByTrimmingSpaces]; - if ([newValue length]) - [values addObject: newValue]; - currentValue = [rawValues nextObject]; + if (escaped) + currentRange.length++; + else + { + currentChar = *(stringBuffer + count); + if (currentChar == '\\') + escaped = YES; + else if (currentChar == separator) + { + [components + addObject: [self substringWithRange: currentRange]]; + currentRange = NSMakeRange (count + 1, 0); + } + else + currentRange.length++; + } + count++; } + [components + addObject: [self substringWithRange: currentRange]]; - return values; + free (stringBuffer); + + return components; } @end