/*! @header ECParameterString @abstract Module of Encore @availability OS X, GNUstep @copyright 2004, 2005, 2006 Oliver Langer Author: Oliver Langer This library 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.1 of the License, or (at your option) any later version. This library 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 this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  -------------------------------------------------------------------------
  Modification history

  18.01.06 ola     initial version
  22.08.06 ola     license changed
  -------------------------------------------------------------------------
  
*/ #include #include #include /** * Specifies the maximum number of variable parameters */ #define _MAX_NR_OF_PARAMETERS 10 @implementation ECParameterString - initWithFormat: (NSString *) aFormatString parameterEvaluater: (id ) aParameterEvaluater { self = [super init]; if( nil == aParameterEvaluater ) { [[[ECIllegalArgumentException alloc] initWithArgumentInfo: @"ECParameterString::initWithFormat: "\ "parameterValue may not equal nil!"] raise]; } self->parameterEvaluater = [aParameterEvaluater retain]; self->parameters = [[NSMutableArray alloc] init]; [self parseFormatString: aFormatString]; return self; } - (void) dealloc { if( nil != formatString ) { [formatString release]; } if( nil != self->parameterEvaluater ) { [self->parameterEvaluater release]; } if( nil != self->parameters ) { [self->parameters release]; } [super dealloc]; } - (id) parseFormatString: (NSString *) aFormatString { NSCharacterSet *variableDeclEND; NSString *variableDeclSTART; NSScanner *scanner; NSString *interimString; int nrOfParameters = 0; self->formatString = [[NSMutableString alloc] init]; EC_AUTORELEASEPOOL_BEGIN variableDeclEND = [NSCharacterSet characterSetWithCharactersInString: @"}"]; variableDeclSTART = @"${"; scanner = [NSScanner scannerWithString: aFormatString]; [scanner setCharactersToBeSkipped: nil]; while( NO == [scanner isAtEnd] ) { /** * Read all characters up to "${": */ if( [scanner scanUpToString: variableDeclSTART intoString: &interimString ] ) { [self->formatString appendString: interimString]; } /** * Read (and thereby skip) "${" */ if( [scanner scanString: variableDeclSTART intoString: NULL] ) { /** * Read variable name: */ if( [scanner scanUpToString: @"}" intoString: &interimString] ) { /** * now check wether the substring at the current scan position * equals "}". If not then the rest of the string can be added * to the result string. Otherwise we have the variable name and * should skip the "}" */ if( [scanner scanString: @"}" intoString: NULL] ) { /** * got variable name: */ [self->formatString appendString: @"%@"]; [self->parameters addObject: interimString]; nrOfParameters++; if( _MAX_NR_OF_PARAMETERS < nrOfParameters ) { [[[ECIllegalArgumentException alloc] initWithArgumentInfo: @"ECParameterString::substituteVariables"\ "Too many variable parameters given! At "\ "present only 10 variable parameters are supported!"] raise]; } } else { [self->formatString appendString: interimString]; } } } } EC_AUTORELEASEPOOL_END return self; } - (NSString *) substituteVariables { NSDictionary *parameterValues; NSString *toReturn = nil; if( nil != self->parameters ) { parameterValues = [self->parameterEvaluater evaluateParameters:self->parameters]; /** * The following lines might look strange but i do not know * a different approach for manually handing over va_args in a * compatible way... */ switch( [self->parameters count] ) { case 0: toReturn = self->formatString; break; case 1: toReturn = [[[NSString alloc] initWithFormat: self->formatString, [parameterValues objectForKey: [self->parameters objectAtIndex: 0]]] autorelease]; break; case 2: toReturn = [[[NSString alloc] initWithFormat: self->formatString, [parameterValues objectForKey: [self->parameters objectAtIndex: 0]], [parameterValues objectForKey: [self->parameters objectAtIndex: 1]]] autorelease]; break; case 3: toReturn = [[[NSString alloc] initWithFormat: self->formatString, [parameterValues objectForKey: [self->parameters objectAtIndex: 0]], [parameterValues objectForKey: [self->parameters objectAtIndex: 1]], [parameterValues objectForKey: [self->parameters objectAtIndex: 2]]] autorelease]; break; case 4: toReturn = [[[NSString alloc] initWithFormat: self->formatString, [parameterValues objectForKey: [self->parameters objectAtIndex: 0]], [parameterValues objectForKey: [self->parameters objectAtIndex: 1]], [parameterValues objectForKey: [self->parameters objectAtIndex: 2]], [parameterValues objectForKey: [self->parameters objectAtIndex: 3]]] autorelease]; break; case 5: toReturn = [[[NSString alloc] initWithFormat: self->formatString, [parameterValues objectForKey: [self->parameters objectAtIndex: 0]], [parameterValues objectForKey: [self->parameters objectAtIndex: 1]], [parameterValues objectForKey: [self->parameters objectAtIndex: 2]], [parameterValues objectForKey: [self->parameters objectAtIndex: 3]], [parameterValues objectForKey: [self->parameters objectAtIndex: 4]]] autorelease]; break; case 6: toReturn = [[[NSString alloc] initWithFormat: self->formatString, [parameterValues objectForKey: [self->parameters objectAtIndex: 0]], [parameterValues objectForKey: [self->parameters objectAtIndex: 1]], [parameterValues objectForKey: [self->parameters objectAtIndex: 2]], [parameterValues objectForKey: [self->parameters objectAtIndex: 3]], [parameterValues objectForKey: [self->parameters objectAtIndex: 4]], [parameterValues objectForKey: [self->parameters objectAtIndex: 5]]] autorelease]; break; case 7: toReturn = [[[NSString alloc] initWithFormat: self->formatString, [parameterValues objectForKey: [self->parameters objectAtIndex: 0]], [parameterValues objectForKey: [self->parameters objectAtIndex: 1]], [parameterValues objectForKey: [self->parameters objectAtIndex: 2]], [parameterValues objectForKey: [self->parameters objectAtIndex: 3]], [parameterValues objectForKey: [self->parameters objectAtIndex: 4]], [parameterValues objectForKey: [self->parameters objectAtIndex: 5]], [parameterValues objectForKey: [self->parameters objectAtIndex: 6]]] autorelease]; break; case 8: toReturn = [[[NSString alloc] initWithFormat: self->formatString, [parameterValues objectForKey: [self->parameters objectAtIndex: 0]], [parameterValues objectForKey: [self->parameters objectAtIndex: 1]], [parameterValues objectForKey: [self->parameters objectAtIndex: 2]], [parameterValues objectForKey: [self->parameters objectAtIndex: 3]], [parameterValues objectForKey: [self->parameters objectAtIndex: 4]], [parameterValues objectForKey: [self->parameters objectAtIndex: 5]], [parameterValues objectForKey: [self->parameters objectAtIndex: 6]], [parameterValues objectForKey: [self->parameters objectAtIndex: 7]]] autorelease]; break; case 9: toReturn = [[[NSString alloc] initWithFormat: self->formatString, [parameterValues objectForKey: [self->parameters objectAtIndex: 0]], [parameterValues objectForKey: [self->parameters objectAtIndex: 1]], [parameterValues objectForKey: [self->parameters objectAtIndex: 2]], [parameterValues objectForKey: [self->parameters objectAtIndex: 3]], [parameterValues objectForKey: [self->parameters objectAtIndex: 4]], [parameterValues objectForKey: [self->parameters objectAtIndex: 5]], [parameterValues objectForKey: [self->parameters objectAtIndex: 6]], [parameterValues objectForKey: [self->parameters objectAtIndex: 7]], [parameterValues objectForKey: [self->parameters objectAtIndex: 8]]] autorelease]; break; case 10: toReturn = [[[NSString alloc] initWithFormat: self->formatString, [parameterValues objectForKey: [self->parameters objectAtIndex: 0]], [parameterValues objectForKey: [self->parameters objectAtIndex: 1]], [parameterValues objectForKey: [self->parameters objectAtIndex: 2]], [parameterValues objectForKey: [self->parameters objectAtIndex: 3]], [parameterValues objectForKey: [self->parameters objectAtIndex: 4]], [parameterValues objectForKey: [self->parameters objectAtIndex: 5]], [parameterValues objectForKey: [self->parameters objectAtIndex: 6]], [parameterValues objectForKey: [self->parameters objectAtIndex: 7]], [parameterValues objectForKey: [self->parameters objectAtIndex: 8]], [parameterValues objectForKey: [self->parameters objectAtIndex: 9]]] autorelease]; break; default: [[[ECIllegalArgumentException alloc] initWithArgumentInfo: @"ECParameterString::substituteVariables: "\ "Too many variable parameters given! At "\ "present only 10 variable parameters are supported!"] raise]; } } return toReturn; } @end // --------------------------------------------- ECDefaultParameterEvaluatorImpl @implementation ECDefaultParameterEvaluaterImpl - init { self = [super init]; self->parameterToValue = [[NSMutableDictionary alloc] init]; return self; } - (void) dealloc { if( nil != self->parameterToValue ) { [self->parameterToValue release]; } [super dealloc]; } - (NSDictionary *) evaluateParameters: (NSArray *) parameters { return [self parameterValues]; } - (NSDictionary *) parameterValues { return [NSDictionary dictionaryWithDictionary: self->parameterToValue]; } - removeAllVariables { if( nil != self->parameterToValue ) { [self->parameterToValue release]; } self->parameterToValue = [[NSMutableDictionary alloc] init]; return self; } - setParameterValues: (NSDictionary *) dictionary { if( nil == dictionary ) { [self removeAllVariables]; return self; } if( nil != self->parameterToValue ) { [self->parameterToValue release]; } self->parameterToValue = [[NSMutableDictionary alloc] initWithDictionary: dictionary]; return self; } - setValue: (NSString *) aValue forVariable: (NSString *) aVariable { [self->parameterToValue setObject: aValue forKey: aVariable]; return self; } @end