sogo/SOPE/NGCards/versitCardsSaxDriver/VSStringFormatter.m
Wolfgang Sourdeau b234f02a47 Monotone-Parent: 4962ab3aba4ec12e6e80cec90be3bb7824bb7b56
Monotone-Revision: 53a7cdc42e8710e661ce709242c9857ae53542ff

Monotone-Author: wsourdeau@inverse.ca
Monotone-Date: 2007-01-31T17:11:29
Monotone-Branch: ca.inverse.sogo
2007-01-31 17:11:29 +00:00

95 lines
2.7 KiB
Objective-C

/*
Copyright (C) 2004-2005 OpenGroupware.org
This file is part of versitCardsSaxDriver, written for the OpenGroupware.org
project (OGo).
SOPE is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
SOPE is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public
License along with SOPE; see the file COPYING. If not, write to the
Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA.
*/
#include "VSStringFormatter.h"
#include "common.h"
@implementation VSStringFormatter
static NSCharacterSet *escSet = nil;
+ (void)initialize {
static BOOL didInit = NO;
if(didInit)
return;
didInit = YES;
escSet = [[NSCharacterSet characterSetWithCharactersInString:@"\\"] retain];
}
+ (id)sharedFormatter {
static id sharedInstance = nil;
if(!sharedInstance) {
sharedInstance = [[self alloc] init];
}
return sharedInstance;
}
- (NSString *)stringByUnescapingRFC2445Text:(NSString *)_s {
NSMutableString *safeString;
unsigned length;
NSRange prevRange, escRange;
NSRange todoRange;
BOOL needsEscaping;
length = [_s length];
prevRange = NSMakeRange(0, length);
escRange = [_s rangeOfCharacterFromSet:escSet options:0 range:prevRange];
needsEscaping = escRange.length > 0 ? YES : NO;
if (!needsEscaping)
return _s; /* cheap */
safeString = [NSMutableString stringWithCapacity:length];
do {
prevRange.length = escRange.location - prevRange.location;
if (prevRange.length > 0)
[safeString appendString:[_s substringWithRange:prevRange]];
/* test edge case */
if(NSMaxRange(escRange) < length) {
unichar c = [_s characterAtIndex:escRange.location + 1];
if(c == 'n' || c == 'N') {
[safeString appendString:@"\n"];
escRange.length += 1; /* skip the 'n' */
}
}
prevRange.location = NSMaxRange(escRange);
todoRange.location = prevRange.location;
todoRange.length = length - prevRange.location;
escRange = [_s rangeOfCharacterFromSet:escSet
options:0
range:todoRange];
}
while(escRange.length > 0);
if (todoRange.length > 0)
[safeString appendString:[_s substringWithRange:todoRange]];
return safeString;
}
@end /* VSStringFormatter */