Annotation of Examples/AppKit/Backspace/ModuleList.m, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.