mirror of
https://github.com/gnustep/libs-gsweb.git
synced 2025-02-23 19:51:13 +00:00
o fix in -incrementLastElementIDComponent when incrementing elementID
whose last part is a componentID (i.e. not a number) o cache nonNumericSet object o rewritten -isSearchOverForSenderID: to handle number appending to string element git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gsweb/trunk@18740 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
52a196ac17
commit
3f89316d12
1 changed files with 168 additions and 91 deletions
|
@ -1,6 +1,6 @@
|
|||
/** GSWElementIDString.m - <title>GSWeb: Class GSWElementIDString</title>
|
||||
|
||||
Copyright (C) 1999-2003 Free Software Foundation, Inc.
|
||||
Copyright (C) 1999-2004 Free Software Foundation, Inc.
|
||||
|
||||
Written by: Manuel Guesdon <mguesdon@orange-concept.com>
|
||||
Date: Jan 1999
|
||||
|
@ -33,10 +33,21 @@ RCS_ID("$Id$")
|
|||
|
||||
#include "GSWeb.h"
|
||||
|
||||
static NSCharacterSet* nonNumericSet=nil;
|
||||
|
||||
//====================================================================
|
||||
@implementation GSWElementIDString
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
+(void)initialize
|
||||
{
|
||||
if (self==[GSWElementIDString class])
|
||||
{
|
||||
ASSIGN(nonNumericSet,([[NSCharacterSet decimalDigitCharacterSet] invertedSet]));
|
||||
};
|
||||
};
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
+ (id) allocWithZone: (NSZone*)z
|
||||
{
|
||||
if (self == [GSWElementIDString class])
|
||||
|
@ -216,107 +227,134 @@ RCS_ID("$Id$")
|
|||
-(BOOL)isSearchOverForSenderID:(NSString*)senderID
|
||||
{
|
||||
BOOL over=NO;
|
||||
|
||||
LOGObjectFnStart();
|
||||
|
||||
if (senderID == nil)
|
||||
[NSException raise:NSInvalidArgumentException
|
||||
format:@"compare with nil"];
|
||||
else
|
||||
{
|
||||
BOOL finished=NO;
|
||||
NSCharacterSet* nonNumericSet=[[NSCharacterSet decimalDigitCharacterSet] invertedSet];
|
||||
NSArray* selfElements=[self componentsSeparatedByString:@"."];
|
||||
NSArray* senderIDElements=[senderID componentsSeparatedByString:@"."];
|
||||
int i=0;
|
||||
int selfElementsCount=[selfElements count];
|
||||
int senderIDElementsCount=[senderIDElements count];
|
||||
int count=min(selfElementsCount,senderIDElementsCount);
|
||||
for(i=0;i<count && !over && !finished;i++)
|
||||
|
||||
NSDebugMLLog(@"gswdync",@"selfElements=%@",selfElements);
|
||||
NSDebugMLLog(@"gswdync",@"senderIDElements=%@",senderIDElements);
|
||||
|
||||
//NSLog(@"%s %i: selfElements=%@",__FILE__,__LINE__,selfElements);
|
||||
//NSLog(@"%s %i: senderIDElements=%@",__FILE__,__LINE__,senderIDElements);
|
||||
|
||||
for(i=0;i<count && !over;i++)
|
||||
{
|
||||
NSString* selfElement=[selfElements objectAtIndex:i];
|
||||
NSString* senderIDElement=[senderIDElements objectAtIndex:i];
|
||||
BOOL selfElementIsNumeric=[selfElement rangeOfCharacterFromSet:nonNumericSet].length==0;
|
||||
BOOL selfAStringIsNumeric=[senderIDElement rangeOfCharacterFromSet:nonNumericSet].length==0;
|
||||
if (selfElementIsNumeric && selfAStringIsNumeric) //Numeric comparison
|
||||
NSRange selfRange=[selfElement rangeOfCharacterFromSet:nonNumericSet
|
||||
options:NSBackwardsSearch];
|
||||
NSRange senderRange=[senderIDElement rangeOfCharacterFromSet:nonNumericSet
|
||||
options:NSBackwardsSearch];
|
||||
|
||||
BOOL selfElementIsNumeric=(selfRange.length==0);
|
||||
BOOL senderIDElementIsNumeric=(senderRange.length==0);
|
||||
|
||||
//NSLog(@"%s %i: selfElement=%@",__FILE__,__LINE__,selfElement);
|
||||
//NSLog(@"%s %i: senderIDElement=%@",__FILE__,__LINE__,senderIDElement);
|
||||
|
||||
//NSLog(@"%s %i: selfElementIsNumeric=%d",__FILE__,__LINE__,selfElementIsNumeric);
|
||||
//NSLog(@"%s %i: senderIDElementIsNumeric=%d",__FILE__,__LINE__,senderIDElementIsNumeric);
|
||||
|
||||
if (selfElementIsNumeric && senderIDElementIsNumeric)
|
||||
{
|
||||
//Numeric comparison like 2 and 24
|
||||
int selfIntValue=[selfElement intValue];
|
||||
int senderIDIntValue=[senderIDElement intValue];
|
||||
if (selfIntValue>senderIDIntValue)
|
||||
over=YES;
|
||||
}
|
||||
else if (!selfElementIsNumeric && !selfAStringIsNumeric)//string comparison
|
||||
{
|
||||
if ([selfElement compare:senderIDElement]==NSOrderedDescending)
|
||||
over=YES;
|
||||
}
|
||||
else
|
||||
finished=YES;
|
||||
{
|
||||
NSComparisonResult cResult=NSOrderedSame;
|
||||
NSString* selfNumberString=nil;
|
||||
NSString* selfNonNumberString=nil;
|
||||
|
||||
NSString* senderIDNumberString=nil;
|
||||
NSString* senderIDNonNumberString=nil;
|
||||
|
||||
if (selfElementIsNumeric)
|
||||
{
|
||||
selfNumberString=selfElement;
|
||||
selfNonNumberString=@"";
|
||||
}
|
||||
else
|
||||
{
|
||||
int selfElementLength=[selfElement length];
|
||||
if (selfRange.location+selfRange.length<selfElementLength)
|
||||
{
|
||||
selfNonNumberString=[selfElement substringToIndex:
|
||||
selfRange.location+selfRange.length];
|
||||
selfNumberString=[selfElement substringFromIndex:
|
||||
selfRange.location+selfRange.length];
|
||||
}
|
||||
else
|
||||
{
|
||||
selfNumberString=@"";
|
||||
selfNonNumberString=selfElement;
|
||||
};
|
||||
};
|
||||
|
||||
//NSLog(@"%s %i: selfElement range=%@",__FILE__,__LINE__,NSStringFromRange(selfRange));
|
||||
//NSLog(@"%s %i: selfNonNumberString=%@",__FILE__,__LINE__,selfNonNumberString);
|
||||
//NSLog(@"%s %i: selfNumberString=%@",__FILE__,__LINE__,selfNumberString);
|
||||
|
||||
if (senderIDElementIsNumeric)
|
||||
{
|
||||
senderIDNumberString=senderIDElement;
|
||||
senderIDNonNumberString=@"";
|
||||
}
|
||||
else
|
||||
{
|
||||
int senderElementLength=[senderIDElement length];
|
||||
if (senderRange.location+senderRange.length<senderElementLength)
|
||||
{
|
||||
senderIDNonNumberString=[senderIDElement substringToIndex:
|
||||
senderRange.location+senderRange.length];
|
||||
senderIDNumberString=[senderIDElement substringFromIndex:
|
||||
senderRange.location+senderRange.length];
|
||||
}
|
||||
else
|
||||
{
|
||||
senderIDNumberString=@"";
|
||||
senderIDNonNumberString=senderIDElement;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
//NSLog(@"%s %i: senderIDElement range=%@",__FILE__,__LINE__,NSStringFromRange(senderRange));
|
||||
//NSLog(@"%s %i: senderIDNumberString=%@",__FILE__,__LINE__,senderIDNumberString);
|
||||
//NSLog(@"%s %i: senderIDNonNumberString=%@",__FILE__,__LINE__,senderIDNonNumberString);
|
||||
|
||||
// First compare on string
|
||||
cResult=[selfNonNumberString compare:senderIDNonNumberString];
|
||||
if (cResult==NSOrderedDescending)
|
||||
over=YES;
|
||||
else if (cResult==NSOrderedSame
|
||||
&& [selfNumberString intValue]>[senderIDNumberString intValue])
|
||||
over=YES;
|
||||
};
|
||||
NSDebugMLLog(@"gswdync",@"i=%d selfElement='%@' senderIDElement='%@' => over=%d",
|
||||
i,selfElement,senderIDElement,over);
|
||||
};
|
||||
/* if (!over && !finished)
|
||||
{
|
||||
if (selfElementsCount>senderIDElementsCount)
|
||||
over=YES;
|
||||
};
|
||||
*/
|
||||
NSDebugMLLog(@"gswdync",@"selfElements=%@ senderIDElements=%@ => over=%d",
|
||||
selfElements,senderIDElements,over);
|
||||
};
|
||||
|
||||
LOGObjectFnStop();
|
||||
|
||||
return over;
|
||||
}
|
||||
/*
|
||||
{
|
||||
NSComparisonResult result=NSOrderedSame;
|
||||
if (aString == nil)
|
||||
[NSException raise:NSInvalidArgumentException
|
||||
format:@"compare with nil"];
|
||||
else if (mask!=0) //TODO
|
||||
[NSException raise:NSInvalidArgumentException
|
||||
format:@"no options are allowed in GSWElementIDString compare"];
|
||||
else if (aRange.location!=0)
|
||||
[NSException raise:NSInvalidArgumentException
|
||||
format:@"GSWElementIDString compare only on full string (range.location=%d instead of 0)",
|
||||
aRange.location];
|
||||
else if (aRange.length!=[self length])
|
||||
[NSException raise:NSInvalidArgumentException
|
||||
format:@"GSWElementIDString compare only on full string (range.length=%d instead of %d)",
|
||||
aRange.length,
|
||||
[self length]];
|
||||
else
|
||||
{
|
||||
NSCharacterSet* nonNumericSet=[[NSCharacterSet decimalDigitCharacterSet] invertedSet];
|
||||
NSArray* selfElements=[self componentsSeparatedByString:@"."];
|
||||
NSArray* aStringElements=[aString componentsSeparatedByString:@"."];
|
||||
int i=0;
|
||||
int selfElementsCount=[selfElements count];
|
||||
int aStringElementsCount=[aStringElements count];
|
||||
int count=min(selfElementsCount,aStringElementsCount);
|
||||
for(i=0;i<count && result==NSOrderedSame;i++)
|
||||
{
|
||||
NSString* selfElement=[selfElements objectAtIndex:i];
|
||||
NSString* aStringElement=[aStringElements objectAtIndex:i];
|
||||
BOOL selfElementIsNumeric=[selfElement rangeOfCharacterFromSet:nonNumericSet].length==0;
|
||||
BOOL selfAStringIsNumeric=[aStringElement rangeOfCharacterFromSet:nonNumericSet].length==0;
|
||||
if (selfElementIsNumeric && selfAStringIsNumeric) //Numeric comparison
|
||||
{
|
||||
int selfIntValue=[selfElement intValue];
|
||||
int aStringIntValue=[aStringElement intValue];
|
||||
result=(selfIntValue==aStringIntValue ? 0 : (selfIntValue>aStringIntValue ? NSOrderedDescending : NSOrderedAscending));
|
||||
}
|
||||
else if (selfElementIsNumeric) //we consider strictly num < string
|
||||
result=NSOrderedAscending;
|
||||
else if (selfAStringIsNumeric) //we consider strictly num < string
|
||||
result=NSOrderedDescending;
|
||||
else //string comparison
|
||||
result=[selfElement compare:aStringElement];
|
||||
};
|
||||
if (result==NSOrderedSame)
|
||||
{
|
||||
if (selfElementsCount<aStringElementsCount)
|
||||
result=NSOrderedAscending;
|
||||
else if (selfElementsCount>aStringElementsCount)
|
||||
result=NSOrderedDescending;
|
||||
};
|
||||
};
|
||||
return result;
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
@end
|
||||
|
||||
|
@ -357,20 +395,51 @@ RCS_ID("$Id$")
|
|||
-(void)incrementLastElementIDComponent
|
||||
{
|
||||
NSArray* ids=nil;
|
||||
int idsCount=0;
|
||||
LOGObjectFnStart();
|
||||
ids=[self componentsSeparatedByString:@"."];
|
||||
if (ids && [ids count]>0)
|
||||
idsCount=[ids count];
|
||||
if (ids && idsCount>0)
|
||||
{
|
||||
NSString* _last=[ids lastObject];
|
||||
NSString* _new=nil;
|
||||
_last=[NSString stringWithFormat:@"%d",([_last intValue]+1)];
|
||||
if ([ids count]>1)
|
||||
_new=[[[ids subarrayWithRange:NSMakeRange(0,[ids count]-1)]
|
||||
componentsJoinedByString:@"."]
|
||||
stringByAppendingFormat:@".%@",_last];
|
||||
NSString* lastPart=[ids lastObject];
|
||||
if ([lastPart length]==0) // not possible ?
|
||||
{
|
||||
// ads a '1' at the end
|
||||
[self appendString:@"1"];
|
||||
}
|
||||
else
|
||||
_new=_last;
|
||||
[self setString:_new];
|
||||
{
|
||||
// find last 'number'
|
||||
// search for last non '0'-'9' char
|
||||
NSRange range=[lastPart rangeOfCharacterFromSet:nonNumericSet
|
||||
options:NSBackwardsSearch];
|
||||
if (range.length>0) // a string and (may be) a number
|
||||
{
|
||||
if ((range.location+range.length)==[lastPart length]) // no number
|
||||
{
|
||||
lastPart=[lastPart stringByAppendingString:@"1"]; // add '1' at the end
|
||||
}
|
||||
else
|
||||
{
|
||||
NSString* numberString=[lastPart substringFromIndex:range.location+range.length];
|
||||
NSString* nonNumberString=[lastPart substringToIndex:range.location+range.length];
|
||||
lastPart=[NSString stringWithFormat:@"%@%d",
|
||||
nonNumberString,
|
||||
[numberString intValue]+1];
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
// it's a number
|
||||
lastPart=[NSString stringWithFormat:@"%d",([lastPart intValue]+1)];
|
||||
};
|
||||
if (idsCount>1)
|
||||
[self setString:[[[ids subarrayWithRange:NSMakeRange(0,idsCount-1)]
|
||||
componentsJoinedByString:@"."]
|
||||
stringByAppendingFormat:@".%@",lastPart]];
|
||||
else
|
||||
[self setString:lastPart];
|
||||
};
|
||||
};
|
||||
LOGObjectFnStop();
|
||||
};
|
||||
|
@ -387,13 +456,21 @@ RCS_ID("$Id$")
|
|||
};
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
-(void)appendElementIDComponent:(id)_element
|
||||
-(void)appendElementIDComponent:(id)element
|
||||
{
|
||||
NSRange range;
|
||||
LOGObjectFnStart();
|
||||
if (self && [self length]>0)
|
||||
[self appendFormat:@".%@",_element];
|
||||
[self appendFormat:@".%@",element];
|
||||
else
|
||||
[self setString:_element];
|
||||
[self setString:element];
|
||||
range=[self rangeOfCharacterFromSet:nonNumericSet
|
||||
options:NSBackwardsSearch];
|
||||
if (range.location+range.length<[self length])
|
||||
{
|
||||
NSWarnLog(@"You'll may get problems if you use anElementID which ends with decimal character like you do: '%@'",
|
||||
element);
|
||||
};
|
||||
LOGObjectFnStop();
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue