|
|
1.1 ! root 1: // ! 2: // ModuleList.m ! 3: // ! 4: // a simple storage class that holds all the information BackSpace needs ! 5: // about each module. This file contains 2 classes; one for the information ! 6: // on a single module and one for a list to store those ModuleInfo's ! 7: // ! 8: // You may freely copy, distribute, and reuse the code in this example. ! 9: // NeXT disclaims any warranty of any kind, expressed or implied, as to its ! 10: // fitness for any particular use. ! 11: ! 12: ! 13: ! 14: #import "ModuleList.h" ! 15: #import <stdlib.h> // for free() etc ! 16: #import <strings.h> // for strcasecmp() ! 17: #import <objc/hashtable.h> // for NXCopyStringBuffer() ! 18: ! 19: #define str_copy(str) ((str == NULL) ? NULL : NXCopyStringBuffer(str)) ! 20: #define str_free(str) {if (str) free(str);} ! 21: ! 22: ! 23: @implementation ModuleInfo ! 24: - init ! 25: { return [self initWithView:nil name:NULL path:NULL]; ! 26: } ! 27: ! 28: - initWithView:aView name:(const char *)aName path:(const char *)aPath ! 29: { ! 30: [super init]; ! 31: view = aView; ! 32: viewName = str_copy(aName); ! 33: path = str_copy(aPath); ! 34: return self; ! 35: } ! 36: ! 37: - setView:newView ! 38: { ! 39: id oldView = view; ! 40: view = newView; ! 41: return oldView; ! 42: } ! 43: ! 44: - view ! 45: { return view; ! 46: } ! 47: ! 48: - setHeader:(struct mach_header *)h ! 49: { header = h; ! 50: return self; ! 51: } ! 52: ! 53: - (struct mach_header *) header ! 54: { return header; ! 55: } ! 56: ! 57: - (const char *) viewName ! 58: { return viewName; ! 59: } ! 60: ! 61: - (const char *) path ! 62: { return path; ! 63: } ! 64: ! 65: - setPath: (const char *)p ! 66: { ! 67: str_free(path); ! 68: path = str_copy(p); ! 69: return self; ! 70: } ! 71: ! 72: - appendPath: (const char *)p ! 73: { ! 74: if (altPaths) ! 75: { ! 76: altPaths = realloc(altPaths,strlen(altPaths)+strlen(p)+2); ! 77: strcat(altPaths,"\t"); ! 78: strcat(altPaths,p); ! 79: } ! 80: else altPaths = str_copy(p); ! 81: return self; ! 82: } ! 83: ! 84: // if the path is bogus, this will set the path to the next one ! 85: // returns self if successful, nil if there is no additional path ! 86: - useNextPath ! 87: { ! 88: char *p1, *p2; ! 89: ! 90: if (altPaths) ! 91: { ! 92: p1 = p2 = altPaths; ! 93: while (*p1 && *p1 != '\t') p1++; ! 94: if (*p1 == '\t') ! 95: { ! 96: *p1=0; ! 97: path = realloc(path,strlen(p1)+1); ! 98: strcpy(path,p1); ! 99: while (*p2++ = *p1++); ! 100: altPaths = realloc(altPaths,strlen(altPaths)+1); ! 101: } ! 102: else // last one ! 103: { ! 104: str_free(path); ! 105: path = altPaths; ! 106: altPaths = NULL; ! 107: } ! 108: return self; ! 109: } ! 110: return nil; ! 111: } ! 112: ! 113: - discardAltPaths ! 114: { ! 115: str_free(altPaths); ! 116: altPaths = NULL; ! 117: return self; ! 118: } ! 119: ! 120: - free ! 121: { ! 122: [view free]; ! 123: str_free(viewName); ! 124: str_free(path); ! 125: str_free(altPaths); ! 126: return [super free]; ! 127: } ! 128: ! 129: @end ! 130: ! 131: @implementation ModuleList ! 132: ! 133: - (const char *) nameAt: (int) i ! 134: { ! 135: return [[self objectAt: i] viewName]; ! 136: } ! 137: ! 138: - viewAt: (int) i ! 139: { ! 140: return [[self objectAt: i] view]; ! 141: } ! 142: ! 143: static int docompare(const void *x, const void *y) ! 144: { ! 145: return strcasecmp([(id)(*(ModuleInfo **)x) viewName], [(id)(*(ModuleInfo **)y) viewName]); ! 146: } ! 147: ! 148: - sort ! 149: { ! 150: qsort((ModuleInfo **)dataPtr, numElements, sizeof(id), docompare); ! 151: return self; ! 152: } ! 153: ! 154: @end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.