Monotone-Parent: 39ce1fba9746592044921a256d39e922dc2153d8
Monotone-Revision: a0b3d112eca99119d0e99fa3a948f74e17a73249 Monotone-Author: wsourdeau@inverse.ca Monotone-Date: 2011-03-15T17:03:24 Monotone-Branch: ca.inverse.sogomaint-2.0.2
parent
d1e4cd97e6
commit
48e8b7bfab
|
@ -1,3 +1,9 @@
|
||||||
|
2011-03-15 Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||||
|
|
||||||
|
* 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 <flachapelle@inverse.ca>
|
2011-01-14 Francis Lachapelle <flachapelle@inverse.ca>
|
||||||
|
|
||||||
* iCalTimeZone.m (-computedDateForString:): new method that
|
* iCalTimeZone.m (-computedDateForString:): new method that
|
||||||
|
|
|
@ -32,16 +32,8 @@
|
||||||
|
|
||||||
#import "NSString+NGCards.h"
|
#import "NSString+NGCards.h"
|
||||||
|
|
||||||
static NSString *commaSeparator = nil;
|
|
||||||
|
|
||||||
@implementation NSString (NGCardsExtensions)
|
@implementation NSString (NGCardsExtensions)
|
||||||
|
|
||||||
- (void) _initCommaSeparator
|
|
||||||
{
|
|
||||||
commaSeparator = [NSMutableString stringWithFormat: @"%c", 255];
|
|
||||||
[commaSeparator retain];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSString *) foldedForVersitCards
|
- (NSString *) foldedForVersitCards
|
||||||
{
|
{
|
||||||
NSMutableString *foldedString;
|
NSMutableString *foldedString;
|
||||||
|
@ -76,24 +68,84 @@ static NSString *commaSeparator = nil;
|
||||||
- (NSArray *) asCardAttributeValues
|
- (NSArray *) asCardAttributeValues
|
||||||
{
|
{
|
||||||
NSMutableArray *values;
|
NSMutableArray *values;
|
||||||
NSEnumerator *rawValues;
|
NSString *newString;
|
||||||
NSString *tmpString, *rawValue, *newString;
|
unichar *characters, *currentChar, *lastChar, *newPart, *newCurrentChar;
|
||||||
|
NSUInteger max;
|
||||||
|
BOOL isEscaped, isQuoted;
|
||||||
|
|
||||||
values = [NSMutableArray array];
|
values = [NSMutableArray array];
|
||||||
|
|
||||||
if (!commaSeparator)
|
max = [self length];
|
||||||
[self _initCommaSeparator];
|
characters = NSZoneMalloc (NULL, max * sizeof (unichar));
|
||||||
|
[self getCharacters: characters];
|
||||||
|
currentChar = characters;
|
||||||
|
lastChar = characters + max;
|
||||||
|
|
||||||
tmpString = [self stringByReplacingString: @"\\,"
|
newPart = NSZoneMalloc (NULL, max * sizeof (unichar));
|
||||||
withString: commaSeparator];
|
newCurrentChar = newPart;
|
||||||
rawValues = [[tmpString componentsSeparatedByString: @","]
|
|
||||||
objectEnumerator];
|
isEscaped = NO;
|
||||||
while ((rawValue = [rawValues nextObject]))
|
isQuoted = NO;
|
||||||
|
|
||||||
|
while (currentChar < lastChar)
|
||||||
{
|
{
|
||||||
newString = [rawValue stringByReplacingString: commaSeparator
|
if (isQuoted)
|
||||||
withString: @","];
|
{
|
||||||
[values addObject: [newString stringByTrimmingSpaces]];
|
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;
|
return values;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,9 @@
|
||||||
|
2011-03-15 Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||||
|
|
||||||
|
* 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 <wsourdeau@inverse.ca>
|
2010-08-11 Wolfgang Sourdeau <wsourdeau@inverse.ca>
|
||||||
|
|
||||||
* VSSaxDriver.m (_parseAttr:forTag:intoAttr:intoValue:): when no
|
* VSSaxDriver.m (_parseAttr:forTag:intoAttr:intoValue:): when no
|
||||||
|
|
|
@ -320,7 +320,6 @@ static NSCharacterSet *whitespaceCharSet = nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void) _parseAttr: (NSString *) _attr
|
- (void) _parseAttr: (NSString *) _attr
|
||||||
forTag: (NSString *) _tagName
|
|
||||||
intoAttr: (NSString **) attr_
|
intoAttr: (NSString **) attr_
|
||||||
intoValue: (NSString **) value_
|
intoValue: (NSString **) value_
|
||||||
{
|
{
|
||||||
|
@ -330,33 +329,8 @@ static NSCharacterSet *whitespaceCharSet = nil;
|
||||||
r = [_attr rangeOfCharacterFromSet: equalSignCharSet];
|
r = [_attr rangeOfCharacterFromSet: equalSignCharSet];
|
||||||
if (r.length > 0)
|
if (r.length > 0)
|
||||||
{
|
{
|
||||||
unsigned left, right;
|
|
||||||
|
|
||||||
attrName = [[_attr substringToIndex: r.location] uppercaseString];
|
attrName = [[_attr substringToIndex: r.location] uppercaseString];
|
||||||
left = NSMaxRange(r);
|
attrValue = [_attr substringFromIndex: 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 = @"";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -411,9 +385,7 @@ static NSCharacterSet *whitespaceCharSet = nil;
|
||||||
while (curAttr)
|
while (curAttr)
|
||||||
{
|
{
|
||||||
[self _parseAttr: curAttr
|
[self _parseAttr: curAttr
|
||||||
forTag: _tagName
|
intoAttr: &mappedAttr intoValue: &mappedValue];
|
||||||
intoAttr: &mappedAttr
|
|
||||||
intoValue: &mappedValue];
|
|
||||||
values = [[mappedValue asCardAttributeValues] objectEnumerator];
|
values = [[mappedValue asCardAttributeValues] objectEnumerator];
|
||||||
curValue = [values nextObject];
|
curValue = [values nextObject];
|
||||||
while (curValue)
|
while (curValue)
|
||||||
|
|
Loading…
Reference in New Issue