This is MiscString_ExtendedParsing.m in view mode; [Download] [Up]
//
// MiscString_ExtendedParsing.m -- substrings with token elimiters
// Written by Thomas Engel Copyright (c) 1994 by Thomas Engel.
// Version 1.00. All rights reserved.
// This notice may not be removed from this source code.
//
// This object is included in the MiscKit by permission from the author
// and its use is governed by the MiscKit license, found in the file
// "LICENSE.rtf" in the MiscKit distribution. Please refer to that file
// for a list of all applicable permissions and restrictions.
//
#import <misckit/MiscString.h>
@implementation MiscString(ExtendedParsing)
- substringFromToken:(int)start toToken:(int)end ofList:aList
{
// We want to get the substring between two tokens of the tokenList.
// If there is no tokenlist we will do a standard tokenization.
// If you pass a wrong list and wrong numbers you might get wrong
// results!
BOOL mustFreeList = NO;
int i;
id substring;
id aString;
id token;
if( !aList )
{
mustFreeList = YES;
aList = [self tokenize:" \t\n\r" into:nil];
}
// Now check the token numbers. we could return nil in these cases but
// We'll try to find something 'useful'.
if( start > end )
{
i = start;
start = end;
end = i;
}
if( end > [aList count]-1 ) end = [aList count]-1;
if( end < 0 ) end = 0;
if( start > [aList count]-1 ) start = [aList count]-1;
if( start < 0 ) start = 0;
// Ok. from what pos to what pos does our substring range.
// Lets reduce it step by step from the edges.
// If the token List has no items at all we'll do nothing
substring = [self copy];
if( [aList count] != 0 )
{
for( i=0; i<start+1; i++ )
{
// We will try to remove every token up to the wanted.
// But we will have to remove leading spaces etc. too.
token = [aList objectAt:i];
do
{
if( [substring length] < 1 ) break;
if( [substring compareTo:token
n:[token length] caseSensitive:YES] == 0 ) break;
// Seems like the substing does not start with the wanted token
// So lets remove one char and try it again.
aString = [substring substringFrom:1 to:[substring length]-1];
[substring free];
substring = aString;
}
while( YES );
// If this is not the token we are searching for...remove it.
if( i != start )
{
aString = [substring substringFrom:[token length]
to:[substring length]-1];
[substring free];
substring = aString;
}
}
// Now lets kill the unimportant stuff to the right...
// No big deal same as before.
for( i=[aList count]-1; i>end-1; --i )
{
// We will try to remove every token up to the wanted.
// But we will have to remove leading spaces etc. too.
token = [aList objectAt:i];
do
{
if( [substring length] < 1 ) break;
if( [substring endCompareTo:token n:[token length]
caseSensitive:YES] == 0 ) break;
// Seems like the substing does not start with the wanted token
// So lets remove one char and try it again.
aString = [substring substringFrom:0 to:[substring length]-2];
[substring free];
substring = aString;
}
while( YES );
// If this is not the token we are searching for...remove it.
if( i != end )
{
aString = [substring substringFrom:0
to:[substring length]-
[token length] - 1];
[substring free];
substring = aString;
}
}
}
// Now lets free the list if needed.
if( mustFreeList ) [aList free];
return substring;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.