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.