This is String.m in view mode; [Download] [Up]
/* Implementation for Objective-C String object
Copyright (C) 1993 Free Software Foundation, Inc.
Written by: R. Andrew McCallum <mccallum@cs.rochester.edu>
Dept. of Computer Science, U. of Rochester, Rochester, NY 14627
This file is part of the GNU Objective-C Collection library.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* WARNING: This implementation is incomplete and preliminary.
I'm just trying to get a
feel for how Strings will fit together with IndexedCollection.
cheng@iesd.auc.dk may be working on a String heirarchy.
*/
#include <coll/String.h>
#include <coll/IndexedCollectionPrivate.h>
/* memcpy(), strlen(), strcmp() are gcc builtin's */
@implementation String
+ initialize
{
if (self == [String class])
[self setVersion:-1]; /* alpha release */
return self;
}
// INITIALIZING;
/* This is the designated initializer for this class */
- initFromCString: (char*)aCharPtr range: (IndexRange)aRange
{
[super initEncoding:@encode(char)];
_count = aRange.end - aRange.start;
OBJC_MALLOC(_contents_chars, char, _count+1);
memcpy(_contents_chars, aCharPtr + aRange.start, _count);
_contents_chars[_count] = '\0';
return self;
}
#warning: many methods in String not implemented
- write: (TypedStream*)aStream
{
// archive inst vars;
[self notImplemented:_cmd];
[super write:aStream];
return self;
}
- read: (TypedStream*)aStream
{
// archive inst vars;
[self notImplemented:_cmd];
[super read:aStream];
return self;
}
/* Empty copy must empty an allocCopy'ed version of self */
- emptyCopy
{
String *copy = [super emptyCopy];
OBJC_MALLOC(copy->_contents_chars, char, _count+1);
copy->_count = 0;
copy->_contents_chars[_count] = '\0';
return copy;
}
/* This must work without sending any messages to content objects */
- empty
{
_count = 0;
_contents_chars[_count] = '\0';
return self;
}
/* Override the designated initializer of superclass */
- initEncoding: (const char *)contentEncoding
{
if (strcmp(contentEncoding, @encode(char)))
[self error:"invalid args to String initializer"];
[self init];
return self;
}
- initFromCString: (char*)aCharPtr length: (unsigned)aLength
{
return [self initFromCString:aCharPtr
range:((IndexRange){0,aLength})];
}
- initFromCString: (char*)aCharPtr
{
return [self initFromCString:aCharPtr
range:((IndexRange){0, strlen(aCharPtr)})];
}
- initFromCFormat: (char*)formatCharPtr, ...
{
return [self notImplemented:_cmd];
}
- initFromFormat: (String*)aFormatString withArgList: (va_list)arg
{
return [self notImplemented:_cmd];
}
- init
{
return [self initFromCString:""];
}
- initFromString: (String*)aString range: (IndexRange)aRange
{
return [self notImplemented:_cmd];
}
- initFromString: (String*)aString length: (unsigned)aLength
{
return [self notImplemented:_cmd];
}
- initFromString: (String*)aString
{
return [self notImplemented:_cmd];
}
- initFromFormat: (String*)aFormatString, ...
{
return [self notImplemented:_cmd];
}
- initFromCFormat: (char*)formatCharPtr withArgList: (va_list)arg
{
return [self notImplemented:_cmd];
}
// COPYING;
- (char *) cStringCopyRange: (IndexRange)aRange;
{
char *ret;
int len = aRange.end - aRange.start;
// need to check aRange for errors;
OBJC_MALLOC(ret, char, len + 1);
memcpy(ret, _contents_chars, len);
ret[len] = '\0';
return ret;
}
- (char *) cStringCopyLength: (unsigned)aLength
{
// need to check aLength against _count;
return [self cStringCopyRange:((IndexRange){0,aLength})];
}
- (char *) cStringCopy
{
return [self cStringCopyRange:((IndexRange){0,_count})];
}
- setCString: (char *)buffer range: (IndexRange)aRange
{
return [self notImplemented:_cmd];
}
- setCString: (char *)buffer length: (unsigned)aLength
{
return [self notImplemented:_cmd];
}
- setCString: (char *)buffer
{
return [self notImplemented:_cmd];
}
// REPLACING;
- replaceAllStrings: (String*)oldString with: (String*)newString
{
return [self notImplemented:_cmd];
}
- replaceFirstString: (String*)oldString with: (String*)newString
{
return [self notImplemented:_cmd];
}
- replaceFirstString: (String*)oldString
afterIndex: (unsigned)index
with: (String*)newString
{
return [self notImplemented:_cmd];
}
- setToAllCapitals
{
return [self notImplemented:_cmd];
}
- setToInitialCapitals
{
return [self notImplemented:_cmd];
}
- setToLowerCase
{
return [self notImplemented:_cmd];
}
- trimBlanks
{
return [self notImplemented:_cmd];
}
// TESTING;
- (const char *) contentsDescription
{
return @encode(char);
}
- (int(*)(elt,elt)) comparisonFunction
{
return elt_compare_chars;
}
- (BOOL) isEqual: anObject
{
if (self == anObject)
return YES;
if (! [anObject isKindOf:[String class]]
|| [self count] != [anObject count]
|| [anObject hash] != [self hash] )
return NO;
return ! [self compare:anObject ignoreCase:NO];
}
- (unsigned) hash
{
[self notImplemented:_cmd];
return 0;
}
- (int) compare: anObject ignoreCase: (BOOL)flag
{
[self notImplemented:_cmd];
return 0;
}
- (int) compare: anObject
{
[self notImplemented:_cmd];
return 0;
}
- (unsigned) count
{
return _count;
}
- copy
{
return [self notImplemented:_cmd];
}
- (IndexRange) stringRange
{
IndexRange r;
[self notImplemented:_cmd];
return r;
}
- (unsigned) indexOfChar: (char)aChar ignoreCase: (BOOL)flag
{
[self notImplemented:_cmd];
return 0;
}
- (unsigned) indexOfChar: (char)aChar
{
[self notImplemented:_cmd];
return 0;
}
- (unsigned) indexOfLastChar: (char)aChar ignoreCase: (BOOL)flag
{
[self notImplemented:_cmd];
return 0;
}
- (unsigned) indexOfLastChar: (char)aChar
{
[self notImplemented:_cmd];
return 0;
}
- (unsigned) indexOfString: (String*)aString ignoreCase: (BOOL)flag
{
[self notImplemented:_cmd];
return 0;
}
- (unsigned) indexOfString: (String*)aString
{
[self notImplemented:_cmd];
return 0;
}
- (char) charAtIndex: (unsigned)index
{
CHECK_INDEX_RANGE_ERROR(index, _count);
return _contents_chars[index];
}
// GETTING VALUES;
- (int) intValue
{
[self notImplemented:_cmd];
return 0;
// return atoi(_contents_chars);
}
- (float) floatValue
{
[self notImplemented:_cmd];
return 0;
// return (float) atof(_contents_chars);
}
- (double) doubleValue
{
return atof(_contents_chars);
}
- (const char *) cStringValue
{
return _contents_chars;
}
- (String *) stringValue
{
return self;
}
// SETTING VALUES;
- setIntValue: (int)anInt
{
return [self notImplemented:_cmd];
}
- setFloatValue: (float)aFloat
{
return [self notImplemented:_cmd];
}
- setDoubleValue: (double)aDouble
{
return [self notImplemented:_cmd];
}
- setCStringValue: (const char *)aCString
{
return [self notImplemented:_cmd];
}
- setStringValue: (String*)aString
{
return [self notImplemented:_cmd];
}
// FOR FILE AND PATH NAMES;
- (IndexRange) fileRange
{
IndexRange r;
[self notImplemented:_cmd];
return r;
}
- (IndexRange) pathRange
{
IndexRange r;
[self notImplemented:_cmd];
return r;
}
- (IndexRange) extensionRange
{
IndexRange r;
[self notImplemented:_cmd];
return r;
}
- (IndexRange) fileWithOutExtentionRange
{
IndexRange r;
[self notImplemented:_cmd];
return r;
}
- (BOOL) isAbsolute
{
[self notImplemented:_cmd];
return NO;
}
- (BOOL) isRelative
{
[self notImplemented:_cmd];
return NO;
}
// FOR IndexedCollection SUPPORT;
static inline void
stringIncrementCountAndMakeHoleAt(String *self, unsigned index)
{
#ifndef STABLE_MEMCPY
{
int i;
for (i = self->_count; i >= index; i--)
self->_contents_chars[i+1] = self->_contents_chars[i];
}
#else
memcpy(self->_contents_chars + index,
self->_contents_chars + index + 1,
self->_count - index);
#endif /* STABLE_MEMCPY */
(self->_count)++;
}
static inline void
stringDecrementCountAndFillHoleAt(String *self, unsigned index)
{
(self->_count)--;
#ifndef STABLE_MEMCPY
{
int i;
for (i = index; i <= self->_count; i++)
self->_contents_chars[i] = self->_contents_chars[i+1];
}
#else
memcpy(self->_contents_chars + index + 1,
self->_contents_chars + index,
self->_count - index);
#endif /* STABLE_MEMCPY */
}
- insertElement: (elt)newElement atIndex: (unsigned)index
{
CHECK_INDEX_RANGE_ERROR(index, _count+1);
// one for the next char, one for the '\0';
OBJC_REALLOC(_contents_chars, char, _count+1+1);
stringIncrementCountAndMakeHoleAt(self, index);
_contents_chars[index] = newElement.char_u;
_contents_chars[_count] = '\0';
return self;
}
- (elt) removeElementAtIndex: (unsigned)index
{
elt ret;
CHECK_INDEX_RANGE_ERROR(index, _count);
ret = _contents_chars[index];
stringDecrementCountAndFillHoleAt(self, index);
// OBJC_REALLOC(_contents_chars, char, _count);
_contents_chars[_count] = '\0';
return ret;
}
- (elt) elementAtIndex: (unsigned)index
{
elt ret_elt;
CHECK_INDEX_RANGE_ERROR(index, _count);
ret_elt.char_u = _contents_chars[index];
return ret_elt;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.