This is ModuleList.m in view mode; [Download] [Up]
//
// ModuleList.m
//
// a simple storage class that holds all the information BackSpace needs
// about each module. This file contains 2 classes; one for the information
// on a single module and one for a list to store those ModuleInfo's
//
// You may freely copy, distribute, and reuse the code in this example.
// NeXT disclaims any warranty of any kind, expressed or implied, as to its
// fitness for any particular use.
#import "ModuleList.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) free(str);}
@implementation ModuleInfo
- init
{ return [self initWithView:nil name:NULL path:NULL];
}
- initWithView:aView name:(const char *)aName path:(const char *)aPath
{
[super init];
view = aView;
viewName = str_copy(aName);
path = str_copy(aPath);
return self;
}
- setView:newView
{
id oldView = view;
view = newView;
return oldView;
}
- view
{ return view;
}
- setHeader:(struct mach_header *)h
{ header = h;
return self;
}
- (struct mach_header *) header
{ return header;
}
- (const char *) viewName
{ return viewName;
}
- (const char *) path
{ return path;
}
- setPath: (const char *)p
{
str_free(path);
path = str_copy(p);
return self;
}
- appendPath: (const char *)p
{
if (altPaths)
{
altPaths = realloc(altPaths,strlen(altPaths)+strlen(p)+2);
strcat(altPaths,"\t");
strcat(altPaths,p);
}
else altPaths = str_copy(p);
return self;
}
// if the path is bogus, this will set the path to the next one
// returns self if successful, nil if there is no additional path
- useNextPath
{
char *p1, *p2;
if (altPaths)
{
p1 = p2 = altPaths;
while (*p1 && *p1 != '\t') p1++;
if (*p1 == '\t')
{
*p1=0;
path = realloc(path,strlen(p1)+1);
strcpy(path,p1);
while (*p2++ = *p1++);
altPaths = realloc(altPaths,strlen(altPaths)+1);
}
else // last one
{
str_free(path);
path = altPaths;
altPaths = NULL;
}
return self;
}
return nil;
}
- discardAltPaths
{
str_free(altPaths);
altPaths = NULL;
return self;
}
- free
{
[view free];
str_free(viewName);
str_free(path);
str_free(altPaths);
return [super free];
}
@end
@implementation ModuleList
- (const char *) nameAt: (int) i
{
return [[self objectAt: i] viewName];
}
- viewAt: (int) i
{
return [[self objectAt: i] view];
}
static int docompare(const void *x, const void *y)
{
return strcasecmp([(id)(*(ModuleInfo **)x) viewName], [(id)(*(ModuleInfo **)y) viewName]);
}
- sort
{
qsort((ModuleInfo **)dataPtr, numElements, sizeof(id), docompare);
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.