This is PXKList.m in view mode; [Download] [Up]
/*
* Filename: PXKList.m
* Project: Pascal's X Kit
* Module: Basic application components
*
* Function: Quick and dirty list class
*
* Author: Pascal Forget <pascal@wsc.com>
* Date: August 1995
*
* See header file for modifications
*
* Copyright (C)1996 Pascal Forget. All Rights Reserved.
*/
#include "PXKList.h"
@implementation PXKList
- addObject:newObject;
{
if (count == capacity) {
capacity *= 2;
if ((objects = realloc(objects, capacity * sizeof(id))) == NULL) {
fprintf(stderr, "Error expanding list. Exiting.\n");
exit(-1);
}
}
objects[count++] = newObject;
return self;
}
- (void)addObjectsFromArray:(id)otherArray;
{
[self appendList:otherArray];
}
- appendList:aList;
{
int i, newCount;
if ((aList != nil) && ((newCount = [(PXKList *)aList count]) > 0)) {
for (i=0; i<newCount; i++) {
[self addObject:[(PXKList *)aList objectAtIndex:i]];
}
return self;
}
return nil;
}
- (unsigned int)count;
{
return count;
}
- empty;
{
count = 0;
capacity = 1;
if ( (objects = (realloc(objects, capacity * sizeof(id)))) == NULL) {
fprintf(stderr, "Error emptying list. Exiting.\n");
exit(-1);
}
return self;
}
- firstObject;
{
if (count > 0) {
return (id)objects[0];
} else {
return nil;
}
}
- (unsigned int)indexOfObject:object;
{
unsigned int i = 4099999;
for (i=0; i<count; i++) {
if ((id)objects[i] == object) {
return i;
}
}
return i;
}
- init;
{
return [self initWithCapacity:1];
}
- initWithCapacity:(unsigned int)newCapacity;
{
count = 0;
capacity = newCapacity;
objects = malloc(capacity * sizeof(id));
if (objects == NULL) {
fprintf(stderr, "PXKList: error allocating list. Exiting.\n");
exit(-1);
}
return self;
}
- lastObject;
{
if (count > 0) {
return objects[count-1];
} else {
return nil;
}
}
- makeObjectsPerform:(SEL)aSel;
{
#if 0
unsigned int i;
for (i=0; i<count; i++) {
if ([(id)objects[i] respondsToSelector:aSel] == YES) {
objc_msg_send((id)objects[i], aSel);
}
}
#endif
return self;
}
- objectAtIndex:(unsigned int)index;
{
if ((index < count) && (count > 0)) {
return (id)objects[index];
} else {
return nil;
}
}
- removeAllObjects;
{
return [self empty];
}
- removeLastObject;
{
if (count > 0) {
objects[count-1] = nil;
count--;
return self;
} else {
return nil;
}
}
- removeObjectAtIndex:(unsigned int)index;
{
if ((index != PXK_NOT_IN_LIST) && (index<count)) {
count--;
for (; index<count; index++) {
objects[index] = objects[index+1];
}
objects[count] = nil;
/* Shrink array if neccessary */
if ((capacity > 256) && (capacity > (count * 3))) {
capacity = count * 2;
objects = (id *)realloc(objects, capacity * sizeof(id));
/* Verify that realloc() was successful */
if (objects == NULL) {
fprintf(stderr, "PXKList removeObjectAtIndex: "
"error allocating memory. Exiting.\n");
exit(1);
}
}
return self;
}
return nil;
}
- removeObject:object;
{
return [self removeObjectAtIndex:[self indexOfObject:object]];
}
- replaceObjectAtIndex:(unsigned int)index with:newObject;
{
if (count < (index-1)) {
fprintf(stderr, "PXKList error in replaceObjectAtIndex:with: "
"invalid position (%d)\n", index);
return nil;
}
objects[index] = newObject;
return self;
}
- (void)replaceObjectAtIndex:(unsigned int)index withObject:newObject;
{
[self replaceObjectAtIndex:index with:newObject];
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.