home *** CD-ROM | disk | FTP | other *** search
- /* counts number of statements, lines of code, comments, comment lines
- * and blank lines
- ***************************************************************************/
- /***************************************************************************
- * kdsi has been modified to include headers (titles) above statistics *
- * scott maretick *
- ***************************************************************************/
- /***************************************************************************
- * kdsi has been modified to also count '//' lines as comments for C++ or *
- * Objective-C *
- * scott maretick *
- ***************************************************************************/
-
- #include <stdio.h>
-
- 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)
-
- Bool only_stdin = False; /* true if reading from stdin */
-
- char objc_comm = 'N';
-
- main(argc, argv)
- int argc;
- char *argv[];
- {
- Token GetChar();
- FILE *nextfp();
- register Token input;
- register State statevar = Quiescent, laststate = Quiescent;
- FILE *fp;
- char *filename;
- int filecount = 0;
- long cod_linect, com_linect, blnk_linect;
- long tot_cdline, tot_cmline, tot_bkline;
- long grand_tot_cdline, grand_tot_cmline, grand_tot_bkline;
- Bool following_com = False;
-
- tot_cdline = tot_cmline = tot_bkline = 0;
- grand_tot_cdline = grand_tot_cmline = grand_tot_bkline = 0;
- while ( (fp = nextfp(argc, argv, &filename)) != FNULL )
- {
- cod_linect = com_linect = blnk_linect = 0;
- filecount++;
-
- while ( (input = GetChar(fp)) != STOP_INPUT )
- {
- 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:
- /* 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:
- fprintf(stderr, "kdsi: illegal token (%d) returned from GetChar\n", input);
- exit(1);
- break;
-
- }
- }
- if ( !only_stdin ) {
-
- printf(" LOC BLANKS COMM PGM\n");
- printf("%8ld %8ld %6ld %s\n",
- cod_linect, blnk_linect, com_linect,
- filename); }
- else {
- printf(" LOC BLANKS COMM PGM\n");
- printf("%8ld %8ld %6ld %s\n",
- cod_linect, blnk_linect, com_linect); }
- tot_cdline += cod_linect;
- tot_cmline += com_linect;
- tot_bkline += blnk_linect;
-
- grand_tot_cdline += tot_cdline;
- grand_tot_cmline += tot_cmline;
- grand_tot_bkline += tot_bkline;
- }
- if ( !only_stdin && filecount > 1 ) {
-
- printf(" TOT TOT TOT TOT \n");
- printf(" LOC BLANKS COMM PGM\n");
- printf("%8ld %8ld %6ld total\n",
- tot_cdline, tot_bkline, tot_cmline); }
-
- /* if (STOP_INPUT) {
-
- printf(" GT_LOC GT_BLANKS GT_COMM PGM\n");
- printf("%8ld %8ld %6ld total\n",
- grand_tot_cdline, grand_tot_bkline, grand_tot_cmline); }*/
- exit(0);
- }
-
- Token
- GetChar( file )
- FILE *file;
- {
- /* 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(file);
-
- switch ( c )
- {
- case EOF:
- retval = STOP_INPUT;
- break;
- case '\n':
- retval = NEWLINE;
- break;
- case '/':
- buf = getc( file );
- if ( buf == '*' )
- retval = START_COMMENT;
- else if (buf == '/' ) {
- objc_comm = 'Y';
- retval = END_COMMENT; }
- else
- {
- inbuf = True;
- retval = MISC_CHARACTER;
- }
- break;
- case '*':
- buf = getc( file );
- 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 );
-
- return (retval);
- }
-
- FILE *
- nextfp( argc, argv, p_filename)
- int argc;
- char *argv[];
- char **p_filename;
- {
- /* looks through parameters trying to return next FILE * to next
- * specified file
- * passes back a pointer to the filename as a side effect
- */
-
- static Bool first = True;
- static int index = 1;
- static FILE *result = FNULL;
-
- *p_filename = CNULL;
-
- if ( result != FNULL )
- {
- fclose( result );
- result = FNULL;
- }
- while ( index < argc && *argv[index] == '-' )
- index++;
-
- if ( index < argc )
- {
- if ( (result = fopen( argv[index], "r")) == NULL )
- {
- fprintf(stderr, "%s: unable to open %s for read\n",
- argv[0], argv[index]);
- exit(1);
- }
- else
- *p_filename = argv[index];
- index++;
- }
- if ( first )
- {
- /* if no files specified, read from stdin */
- /* filename remains null */
- if ( result == FNULL )
- {
- result = stdin;
- only_stdin = True;
- }
- first = False;
- }
- return ( result );
- }
-