This is ConvertObject.m in view mode; [Download] [Up]
#import "ConvertObject.h" #import <appkit/Form.h> #define EXTENSION_LIST "c", "h", "m", "cc", "e" @implementation ConvertObject - convertMethod:sender { typedef int Token ; #define STOP_INPUT 0 #define NEWLINE 1 #define START_COMMENT 2 #define END_COMMENT 3 #define MISC_CHARACTER 4 #define WHITE_SPACE 5 typedef char Bool; #define True 1 #define False 0 typedef int State; #define Code 0 #define Comment 1 #define Quiescent 2 #define FNULL ( (FILE *) 0) #define CNULL ( (char *) 0) char objc_comm = 'N'; id myobj; { register Token input; register State statevar = Quiescent, laststate = Quiescent; int filecount = 0; long cod_linect, com_linect, blnk_linect, comment_ct; long tot_cdline, tot_cmline, tot_bkline, tot_comment; long grand_tot_cdline, grand_tot_cmline, grand_tot_bkline, grand_tot_comment; Bool following_com = False; FILE *fp; const char *file, *directory; const char *const *filenames; static const char *const wordTypes[] = {EXTENSION_LIST, NULL}; char fullPathName[MAXPATHLEN]; id openPanel = [OpenPanel new]; [openPanel allowMultipleFiles:NO]; if ([openPanel runModalForTypes:wordTypes]) { filenames = [openPanel filenames]; directory = [openPanel directory]; file = *(filenames++); strcpy(fullPathName, directory); strcat(fullPathName, "/"); strcat(fullPathName, file); strcpy(filename, file); } if( strncmp(fullPathName, "\000", 1) == 0 || (fp = fopen(fullPathName, "r")) == NULL ) { return NO; } tot_cdline = tot_cmline = tot_bkline = tot_comment = 0; grand_tot_cdline = grand_tot_cmline = grand_tot_bkline = grand_tot_comment = 0; { cod_linect = com_linect = blnk_linect = comment_ct = 0; filecount++; while (!feof(fp)) { { { /* return Token for char type, taking into account comment delims */ /* ignores spaces and tabs */ register int c; register Token retval; static int buf; static Bool inbuf = False; do { if ( inbuf ) { c = buf; inbuf = False; } else c = getc(fp); switch ( c ) { case EOF: retval = STOP_INPUT; break; case '\n': retval = NEWLINE; break; case '/': buf = getc(fp); if ( buf == '*' ) retval = START_COMMENT; else if (buf == '/' ) { objc_comm = 'Y'; retval = END_COMMENT; } else { inbuf = True; retval = MISC_CHARACTER; } break; case '*': buf = getc(fp); if ( buf == '/' ) retval = END_COMMENT; else { inbuf = True; retval = MISC_CHARACTER; } break; case ' ': case '\t': retval = WHITE_SPACE; break; default: retval = MISC_CHARACTER; } } while ( retval == WHITE_SPACE ); input = retval; switch ( input ) { case NEWLINE: if ( statevar == Code && objc_comm == 'N') cod_linect++; else if ( statevar == Comment || objc_comm == 'Y') {com_linect++; objc_comm = 'N';} /* state is quiescent */ else if ( laststate == Comment ) { /* if is supposed to catch cases where a comment * follows a line of code */ if ( following_com ) cod_linect++; else com_linect++; } else blnk_linect++; if ( statevar != Comment ) { laststate = Quiescent; statevar = Quiescent; } following_com = False; break; case START_COMMENT: laststate = statevar; statevar = Comment; break; case END_COMMENT: comment_ct++; /* if true, is a comment on same line as code */ if ( laststate == Code ) following_com = True; laststate = Comment; statevar = Quiescent; break; case MISC_CHARACTER: if ( statevar == Quiescent ) { laststate = statevar; statevar = Code; } break; default: lines = cod_linect; blanks = blnk_linect; comments = com_linect; } } tot_cdline += lines; tot_cdline += cod_linect; tot_cmline += com_linect; tot_bkline += blnk_linect; tot_comment += comment_ct; grand_tot_cdline += tot_cdline; grand_tot_cmline += tot_cmline; grand_tot_bkline += tot_bkline; grand_tot_comment += tot_comment; } } } } myobj = [[ConvertObject alloc] init]; [fileOutlet setStringValue:filename]; [linesOutlet setFloatValue:lines]; [blnkOutlet setFloatValue:blanks]; [comOutlet setFloatValue:comments]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.