diff --git a/GSWeb.framework/GSWElementIDString.m b/GSWeb.framework/GSWElementIDString.m
index d70f306..5ffe113 100644
--- a/GSWeb.framework/GSWElementIDString.m
+++ b/GSWeb.framework/GSWElementIDString.m
@@ -1,6 +1,6 @@
/** GSWElementIDString.m -
GSWeb: Class GSWElementIDString
- Copyright (C) 1999-2003 Free Software Foundation, Inc.
+ Copyright (C) 1999-2004 Free Software Foundation, Inc.
Written by: Manuel Guesdon
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;isenderIDIntValue)
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[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;iaStringIntValue ? 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 (selfElementsCountaStringElementsCount)
- result=NSOrderedDescending;
- };
- };
- return result;
-}
-
-*/
@end
@@ -357,24 +395,55 @@ 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();
};
-
+
//--------------------------------------------------------------------
-(void)appendZeroElementIDComponent
{
@@ -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();
};