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 != NULL) 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 != NULL) {
altPaths = realloc(altPaths, strlen(altPaths) + strlen(p) + 2);
(void) strcat(strcat(altPaths,"\t"), 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 = altPaths, *p2 = altPaths;
if (altPaths == NULL) return nil;
while (*p1 != '\0' && *p1 != '\t') p1++;
if (*p1 == '\t') {
*p1 = '\0';
path = realloc(path, strlen(p1) + 1);
(void) strcpy(path, p1);
while (*p2++ = *p1++);
altPaths = realloc(altPaths, strlen(altPaths) + 1);
}
else { // last one
str_free(path);
path = altPaths;
altPaths = NULL;
}
return self;
}
- 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];
}
- (int) indexOfName:(const char *) name;
{
int i, n = [self count];
for (i = 0; i < n; i++) {
if (strcmp(name, [[self objectAt:i] viewName]) == 0) return i;
}
return -1;
}
- 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.