This is MethodTable.m in view mode; [Download] [Up]
/* Generated by Interface Builder, modified by the author */ /* File: MethodTable.m */ #include <stdio.h> #include <string.h> #import "MethodTable.h" #import "ClassTable.h" #import <streams/streams.h> #import <objc/Storage.h> #import <appkit/Matrix.h> #import <appkit/Text.h> @implementation MethodTable typedef struct _methodinfo { char methodName[256]; } METHODINFO; - init /* init object */ { [super init]; table= [[Storage alloc] initCount:100 elementSize:sizeof( METHODINFO) description:NULL]; numberOfElements= 0; return self; } - reset /* reset object */ { [table empty]; numberOfElements= 0; return self; } - textlineToMethod:(char *)aTextline /* convert a textline to method */ { char *source, *source2, *dest; if( (source= index( aTextline, ';')) != NULL) /* only in interface files */ { *source= (char)0; } source= dest= aTextline; while( *source != (char)0) { while( (*source != '/') && (*source != (char)0)) /* skip comments */ { *dest++= *source++; } if( (*source == '/') && (*(source+1) == '*')) { source += 2; do { while( (*source != '*') && (*source != (char)0)) { source++; } if( *source == '*') { source++; } } while( (*source != '/') && (*source != (char)0)); if( *source == '/') { source++; } } else { *dest++= *source++; } } *dest= (char)0; source= dest= aTextline; *dest++= *source++; /* '-' or '+' */ *dest++= *source++; /* one space */ while( *source == ' ') /* not more */ { source++; } if( *source == '(') /* typecast ? */ { while( (*source != ')') && (*source != (char)0)) { source++; } if( *source == ')') { source++; } while( *source == ' ') { source++; } } while( (*source != ' ') && (*source != ':') && (*source != (char)0)) /* method */ { *dest++= *source++; } while( (*source != ':') && (*source != (char)0)) { source++; } if( *source == ':') { *dest++= *source++; } while( *source != (char)0) /* parameter */ { while( (*source != ':') && (*source != (char)0)) { source++; } if( *(source2= source) == ':') { do { source--; } while( (*source != ' ') && (*source != ':') && (*source != ')')); if( *source == ' ') { source++; while( *source != ':') { *dest++= *source++; } } else { source= source2; } *dest++= *source++; } } *dest= (char)0; return self; } - (BOOL)getLine:(char *)aString from:(NXStream *)aStream maxLength:(int)aMaxLength /* get line */ { int character, length; BOOL eof= NO; length= 0; while( (length < aMaxLength) && (eof= ((character= NXGetc( aStream)) != EOF)) && (filePosition++) && (character != 10)) { *aString++= (char)character; length++; } *aString= (char)0; if( !eof && (length == aMaxLength)) /* line to long ? */ { while( (eof= ((character= NXGetc( aStream)) != EOF)) && (filePosition++) && (character != 10)) /* skip the rest */ ; } return( !eof); } - scanFile:(char *)aFilename mode:(char)selector /* scan a file */ { char textline[1024], *textpos; int position; BOOL eof; METHODINFO methodinfo; NXStream *stream; *superclass= (char)0; if( (stream= NXMapFile( aFilename, NX_READONLY)) != NULL) { do { eof= [self getLine:textline from:stream maxLength:1023]; if( (*superclass == (char)0) && !strncmp( textline, "@interface ", 11)) { if( (textpos= index( textline+11, ':')) != NULL) { while( *(++textpos) == ' ') ; strcpy( superclass, textpos); /* the superclass */ textpos= superclass + strlen( superclass); while( *(--textpos) == ' ') ; *(textpos+1)= (char)0; } else { strcpy( superclass, "???"); /* no superclass */ } } if( (textline[0] == selector) && (textline[1] == ' ')) /* new method ? */ { [self textlineToMethod:textline]; strcpy( methodinfo.methodName, textline); position= 0; /* search position to insert */ while( (position < numberOfElements) && (NXOrderStrings( (unsigned char *)((METHODINFO *)[table elementAt:position])->methodName, (unsigned char *)methodinfo.methodName, YES, -1, NULL) < 0)) { position++; } [table insert:&methodinfo at:position]; /* insert */ numberOfElements++; } } while( !eof); NXClose( stream); } return self; } - scanFile:(char *)aFilename lookAfter:(int)aMethod isInterface:(BOOL)flag start:(int *)start end:(int *)end /* scan a file */ { char filename[1024], textline[1024], *methodName; BOOL eof; NXStream *stream; filePosition= *end= 0; methodName= (char *)((METHODINFO *)[table elementAt:aMethod])->methodName; strcpy( filename, aFilename); if( !flag) { strcpy( rindex( filename, '.'), ".m"); } if( (stream= NXMapFile( filename, NX_READONLY)) != NULL) /* open file */ { do { *start= filePosition; /* start */ eof= [self getLine:textline from:stream maxLength:1023]; if( ((textline[0] == '-') || (textline[0] == '+')) && (textline[1] == ' ')) { [self textlineToMethod:textline]; if( eof= !strcmp( textline, methodName)) /* method found ? */ { *end= filePosition; /* end */ } } } while( !eof); NXClose( stream); } if( *end == 0) /* nothing found ? */ { *start= 0; } return self; } - (int)fillMatrix:aMatrix /* fill a matrix */ { int count; for( count= 0; count < numberOfElements; count++) { [[aMatrix addRow] setTitle:((METHODINFO *)[table elementAt:count])->methodName at:count:0]; } return numberOfElements; } - (BOOL)fillFile:(char *)aFilename { char method[256]; int count; BOOL ok; NXStream *stream; if( ok= ((stream= NXOpenMemory( NULL, 0, NX_WRITEONLY)) != NULL)) /* open stream */ { for( count= 0; count < numberOfElements; count++) { strcpy( method, ((METHODINFO *)[table elementAt:count])->methodName); strcat( method, "\n"); NXWrite( stream, method, strlen( method)); /* write method */ } ok= (NXSaveToFile( stream, aFilename) == 0); /* save to file */ NXCloseMemory( stream, NX_TRUNCATEBUFFER); /* close stream */ } return ok; } - (char *)getSuperclass /* get the superclass */ { return superclass; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.