#! /usr/bin/ksh
##--------------------------------------------------------------------------
## Count lines of code, comments, etc.
##
## Usage: codeCount
##
## Output file: ./codeCount.rpt
##
## Author: HP, JJB, Jeff Bralley, Aug95.
## $Header: codeCount,v 78.1 96/01/03 16:16:41 ssa Exp $
##--------------------------------------------------------------------------
typeset    tmpD=/usr/tmp/$LOGNAME; [ ! -d $tmpD ] && mkdir $tmpD
typeset    tmpF=$tmpD/t.codeCount
typeset -i i=0 linesPerPage=55

cd /pd/$LOGNAME

Header(){
    printf "\f\n"
    printf "--------- -------- -------- ---------- ---------- ------ ---------------------\n"
    printf "BLANK     TYPEDEFS DEFINES  COMMENTS   CODE       LINES  FILENAME\n"
    printf "--------- -------- -------- ---------- ---------- ------ ---------------------\n"
}

for f in $( find src inc -name '*.cpp' -o -name '*.h' | sort ); do
    ((!(i%linesPerPage))) && Header
    # Sed strips leading and trailing whitespace from each line.
    sed '
        s!^[\t ]*!!
        s![ \t]*$!!
    ' $f |\
    awk -v fileN=$f '
        {nLines=nLines+1}
        $0 ~ "^$"       { blankLines = blankLines + 1; next; }
        $0 ~ "^#define" { defines    = defines    + 1; next; }
        $0 ~ "typedef"  { typedefs   = typedefs   + 1; next; }
        $0 ~ "^//"      { CCcomments = CCcomments + 1; next; }
        $0 ~ "^/\\*"    { startCcomment = NR; }
        $0 ~ "\\*/ "    { endCcomments  = NR;
                          Ccomments = Ccomments+endCcomment-startCcomment+1;
                          next; }
        END\
        {
            comments=CCcomments+Ccomments
            codeLines=nLines-comments-defines-typedefs-blankLines
            if ( nLines > 0 ) codeLinesPercent    = codeLines  / nLines * 100;
            else              codeLinesPercent    = 0;
            if ( nLines > 0 ) commentLinesPercent = comments   / nLines * 100;
            else              commentLinesPercent = 0;
            if ( nLines > 0 ) defineLinesPercent  = defines    / nLines * 100;
            else              defineLinesPercent  = 0;
            if ( nLines > 0 ) typedefLinesPercent = typedefs   / nLines * 100;
            else              typedefLinesPercent = 0;
            if ( nLines > 0 ) blankLinesPercent   = blankLines / nLines * 100;
            else              blankLinesPercent = 0;
            printf( "%5d%3d%% %4d%3d%% %4d%3d%% %6d%3d%% %6d%3d%% %6d %s\n",
                   blankLines,blankLinesPercent,
                   typedefs,  typedefLinesPercent,
                   defines,   defineLinesPercent,
                   comments,  commentLinesPercent,
                   codeLines, codeLinesPercent,
                   nLines,    fileN )
        }
    '
    ((i=i+1))
done >$tmpF.body

awk '
    NF==12{
        blankLines = blankLines + $1
        typedefs   = typedefs   + $3
        defines    = defines    + $5
        comments   = comments   + $7
        codeLines  = codeLines  + $9
        nLines     = nLines     + $11
    }
    END\
    {
        if ( nLines > 0 ) codeLinesPercent    = codeLines  / nLines * 100;
        else              codeLinesPercent    = 0;
        if ( nLines > 0 ) commentLinesPercent = comments   / nLines * 100;
        else              commentLinesPercent = 0;
        if ( nLines > 0 ) defineLinesPercent  = defines    / nLines * 100;
        else              defineLinesPercent  = 0;
        if ( nLines > 0 ) typedefLinesPercent = typedefs   / nLines * 100;
        else              typedefLinesPercent = 0;
        if ( nLines > 0 ) blankLinesPercent   = blankLines / nLines * 100;
        else              blankLinesPercent   = 0;
        printf( "%5d%3d%% %4d%3d%% %4d%3d%% %6d%3d%% %6d%3d%% %6d\n",
               blankLines, blankLinesPercent,
               typedefs,   typedefLinesPercent,
               defines,    defineLinesPercent,
               comments,   commentLinesPercent,
               codeLines,  codeLinesPercent,
               nLines )
    }
' <$tmpF.body >$tmpF.sum

(
cat $tmpF.body
Header
cat $tmpF.sum
Header
) >codeCount.rpt

rm -rf $tmpF.*
