This is StringStorage.m in view mode; [Download] [Up]
//
// StringStorage.h
//
// Lennart Lovstrand, Rank Xerox EuroPARC, August 1991.
//
#import "StringStorage.h"
#import <stdlib.h> // for free() etc
#import <strings.h> // for strcasecmp()
#import <objc/hashtable.h> // for NXCopyStringBuffer()
#define str_copy(str) ((str == NULL) ? NULL : NXCopyStringBuffer(str))
#define str_free(str) {if (str != NULL) free(str);}
static int (*comparefn)(char *x, char *y);
static int docompare(void *x, void *y)
{
return (*comparefn)(*(char **) x, *(char **) y);
}
@implementation StringStorage
- init;
{
return [self initCount: 0];
}
- initCount: (int) count;
{
return [self initCount: count elementSize: sizeof(char *)
description: "!"];
}
- addElement: (char *) elem
{
char *p = str_copy(elem);
return [super addElement: &p];
}
- (char *) elementAt: (int) i
{
return *(char **) [super elementAt: i];
}
- insert: (char *) elem at: (int) i
{
char *p = str_copy(elem);
return [super insert: &p at: i];
}
- removeAt: (int) i
{
str_free([self elementAt: i]);
return [super removeAt: i];
}
- replace: (char *) elem at: (int) i
{
char *p = str_copy(elem);
str_free([self elementAt: i]);
return [super replace: &p at: i];
}
- sortUsing: (int (*)()) predfn
{
char **strings;
int i, count;
count = [self count];
strings = (char **) malloc(count * sizeof(char *));
for (i = 0; i < count; i++)
strings[i] = [self elementAt: i];
comparefn = predfn;
qsort(strings, count, sizeof(char *), docompare);
for (i = 0; i < count; i++)
[super replace: &strings[i] at: i];
free(strings);
return self;
}
- sort
{
return [self sortUsing: strcasecmp];
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.