From 48e8b7bfab740fa654b0528d3f849bb49d86746d Mon Sep 17 00:00:00 2001 From: Wolfgang Sourdeau Date: Tue, 15 Mar 2011 17:03:24 +0000 Subject: [PATCH] Monotone-Parent: 39ce1fba9746592044921a256d39e922dc2153d8 Monotone-Revision: a0b3d112eca99119d0e99fa3a948f74e17a73249 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-03-15T17:03:24 Monotone-Branch: ca.inverse.sogo --- SOPE/NGCards/ChangeLog | 6 ++ SOPE/NGCards/NSString+NGCards.m | 92 +++++++++++++++---- SOPE/NGCards/versitCardsSaxDriver/ChangeLog | 6 ++ .../versitCardsSaxDriver/VSSaxDriver.m | 32 +------ 4 files changed, 86 insertions(+), 50 deletions(-) diff --git a/SOPE/NGCards/ChangeLog b/SOPE/NGCards/ChangeLog index a4aeed3ff..c12b30353 100644 --- a/SOPE/NGCards/ChangeLog +++ b/SOPE/NGCards/ChangeLog @@ -1,3 +1,9 @@ +2011-03-15 Wolfgang Sourdeau + + * NSString+NGCards.m (-asCardAttributeValues): rewritten method + properly in order to parse the values string by properly taking + quoted, escaping and special characters into account. + 2011-01-14 Francis Lachapelle * iCalTimeZone.m (-computedDateForString:): new method that diff --git a/SOPE/NGCards/NSString+NGCards.m b/SOPE/NGCards/NSString+NGCards.m index d090bfe00..9b135c86c 100644 --- a/SOPE/NGCards/NSString+NGCards.m +++ b/SOPE/NGCards/NSString+NGCards.m @@ -32,16 +32,8 @@ #import "NSString+NGCards.h" -static NSString *commaSeparator = nil; - @implementation NSString (NGCardsExtensions) -- (void) _initCommaSeparator -{ - commaSeparator = [NSMutableString stringWithFormat: @"%c", 255]; - [commaSeparator retain]; -} - - (NSString *) foldedForVersitCards { NSMutableString *foldedString; @@ -76,25 +68,85 @@ static NSString *commaSeparator = nil; - (NSArray *) asCardAttributeValues { NSMutableArray *values; - NSEnumerator *rawValues; - NSString *tmpString, *rawValue, *newString; + NSString *newString; + unichar *characters, *currentChar, *lastChar, *newPart, *newCurrentChar; + NSUInteger max; + BOOL isEscaped, isQuoted; values = [NSMutableArray array]; - if (!commaSeparator) - [self _initCommaSeparator]; + max = [self length]; + characters = NSZoneMalloc (NULL, max * sizeof (unichar)); + [self getCharacters: characters]; + currentChar = characters; + lastChar = characters + max; - tmpString = [self stringByReplacingString: @"\\," - withString: commaSeparator]; - rawValues = [[tmpString componentsSeparatedByString: @","] - objectEnumerator]; - while ((rawValue = [rawValues nextObject])) + newPart = NSZoneMalloc (NULL, max * sizeof (unichar)); + newCurrentChar = newPart; + + isEscaped = NO; + isQuoted = NO; + + while (currentChar < lastChar) { - newString = [rawValue stringByReplacingString: commaSeparator - withString: @","]; - [values addObject: [newString stringByTrimmingSpaces]]; + if (isQuoted) + { + if (*currentChar == '"') + isQuoted = NO; + else + { + *newCurrentChar = *currentChar; + newCurrentChar++; + } + } + else if (isEscaped) + { + if (*currentChar == 'n' || *currentChar == 'N') + *newCurrentChar = '\n'; + else if (*currentChar == 'r' || *currentChar == 'R') + *newCurrentChar = '\r'; + else if (*currentChar == 't' || *currentChar == 'T') + *newCurrentChar = '\t'; + else if (*currentChar == 'b' || *currentChar == 'B') + *newCurrentChar = '\b'; + else + *newCurrentChar = *currentChar; + newCurrentChar++; + isEscaped = NO; + } + else + { + if (*currentChar == '"') + isQuoted = YES; + else if (*currentChar == '\\') + isEscaped = YES; + else if (*currentChar == ',') + { + newString = [[NSString alloc] + initWithCharactersNoCopy: newPart + length: (newCurrentChar - newPart) + freeWhenDone: YES]; + [values addObject: newString]; + [newString release]; + newPart = NSZoneMalloc (NULL, max * sizeof (unichar)); + newCurrentChar = newPart; + } + else + { + *newCurrentChar = *currentChar; + newCurrentChar++; + } + } + currentChar++; } + newString = [[NSString alloc] + initWithCharactersNoCopy: newPart + length: (newCurrentChar - newPart) + freeWhenDone: YES]; + [values addObject: newString]; + [newString release]; + return values; } diff --git a/SOPE/NGCards/versitCardsSaxDriver/ChangeLog b/SOPE/NGCards/versitCardsSaxDriver/ChangeLog index fe4545dcd..9b8d72a36 100644 --- a/SOPE/NGCards/versitCardsSaxDriver/ChangeLog +++ b/SOPE/NGCards/versitCardsSaxDriver/ChangeLog @@ -1,3 +1,9 @@ +2011-03-15 Wolfgang Sourdeau + + * VSSaxDriver.m (-_parseAttr:intoAttr:intoValue:): removed useless + "tag" parameter. Removed code handling the quoted values, as it's + now done from -[NSString asCardAttributeValues]. + 2010-08-11 Wolfgang Sourdeau * VSSaxDriver.m (_parseAttr:forTag:intoAttr:intoValue:): when no diff --git a/SOPE/NGCards/versitCardsSaxDriver/VSSaxDriver.m b/SOPE/NGCards/versitCardsSaxDriver/VSSaxDriver.m index 7c2797bbc..b7cc0144c 100644 --- a/SOPE/NGCards/versitCardsSaxDriver/VSSaxDriver.m +++ b/SOPE/NGCards/versitCardsSaxDriver/VSSaxDriver.m @@ -320,7 +320,6 @@ static NSCharacterSet *whitespaceCharSet = nil; } - (void) _parseAttr: (NSString *) _attr - forTag: (NSString *) _tagName intoAttr: (NSString **) attr_ intoValue: (NSString **) value_ { @@ -330,33 +329,8 @@ static NSCharacterSet *whitespaceCharSet = nil; r = [_attr rangeOfCharacterFromSet: equalSignCharSet]; if (r.length > 0) { - unsigned left, right; - attrName = [[_attr substringToIndex: r.location] uppercaseString]; - left = NSMaxRange(r); - right = [_attr length] - 1; - if (left < right) - { - if (([_attr characterAtIndex: left] == '"') && - ([_attr characterAtIndex: right] == '"')) - { - left += 1; - r = NSMakeRange(left, right - left); - attrValue = [_attr substringWithRange: r]; - } - else - { - attrValue = [_attr substringFromIndex: left]; - } - } - else if (left == right) - { - attrValue = [_attr substringFromIndex: left]; - } - else - { - attrValue = @""; - } + attrValue = [_attr substringFromIndex: NSMaxRange(r)]; } else { @@ -411,9 +385,7 @@ static NSCharacterSet *whitespaceCharSet = nil; while (curAttr) { [self _parseAttr: curAttr - forTag: _tagName - intoAttr: &mappedAttr - intoValue: &mappedValue]; + intoAttr: &mappedAttr intoValue: &mappedValue]; values = [[mappedValue asCardAttributeValues] objectEnumerator]; curValue = [values nextObject]; while (curValue)