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.