/*
 Copyright (C) 2004 OpenGroupware.org
 
 This file is part of versitSaxDriver, written for the OpenGroupware.org
 project (OGo).
 
 OGo 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.
 
 OGo 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 OGo; see the file COPYING.  If not, write to the
 Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 02111-1307, USA.
 */
// $Id$


#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
