Blame tool/total.c

Packit Service 8bf002
/*
Packit Service 8bf002
 * total.c
Packit Service 8bf002
 *  Put totals of "cpp_test.tbl".
Packit Service 8bf002
 *  Usage:  total <n> <infile> <outfile>
Packit Service 8bf002
 *      Specify the number of preprocessors by <n>.
Packit Service 8bf002
 *  1998/08     kmatsui
Packit Service 8bf002
 *  2002/08     Updated for "cpp-test.txt" V.1.3    kmatsui
Packit Service 8bf002
 *  2004/11     Updated for "cpp-test.txt" V.1.5    kmatsui
Packit Service 8bf002
 *  2006/07     Changed non-prototype declarations to prototype ones.
Packit Service 8bf002
 *                                                  kmatsui
Packit Service 8bf002
 */
Packit Service 8bf002
Packit Service 8bf002
#include    "stdio.h"
Packit Service 8bf002
#include    "stdlib.h"
Packit Service 8bf002
#include    "string.h"
Packit Service 8bf002
#include    "ctype.h"
Packit Service 8bf002
Packit Service 8bf002
#define     MAX_COLS    (MAX_CASES + MAXC)
Packit Service 8bf002
#define     MAX_CASES   30
Packit Service 8bf002
#define     MAXC        1
Packit Service 8bf002
#define     OFFS        7
Packit Service 8bf002
#define     LEN         4
Packit Service 8bf002
#define     COLS        (MAXC + cases)
Packit Service 8bf002
#define     LLEN        ((COLS * LEN) + OFFS + 2 + 2)
Packit Service 8bf002
#define     MAX_LLEN    ((MAX_COLS * LEN) + OFFS + 2 + 2)
Packit Service 8bf002
Packit Service 8bf002
#define     C90         2
Packit Service 8bf002
#define     C99         3
Packit Service 8bf002
#define     CPL         4
Packit Service 8bf002
Packit Service 8bf002
int     cases;
Packit Service 8bf002
int     subtotal[ MAX_COLS];
Packit Service 8bf002
int     mttl90[ MAX_COLS];  /* mid-total of C90 conformance */
Packit Service 8bf002
int     mttl99[ MAX_COLS];  /* mid-total of C99 new features conformance    */
Packit Service 8bf002
int     mttlcpl[ MAX_COLS]; /* mid-total of C++ only features conformance   */
Packit Service 8bf002
int     grandtotal[ MAX_COLS];
Packit Service 8bf002
char    buf[ MAX_LLEN];
Packit Service 8bf002
Packit Service 8bf002
void    usage( void);
Packit Service 8bf002
void    add_points( int norm);
Packit Service 8bf002
void    put_subtotal( void);
Packit Service 8bf002
void    put_mttl( int norm);
Packit Service 8bf002
void    put_grandtotal( void);
Packit Service 8bf002
#if !__TURBOC__
Packit Service 8bf002
char    *stpcpy( char *p, const char *app);
Packit Service 8bf002
#endif
Packit Service 8bf002
Packit Service 8bf002
int main( int argc, char **argv) {
Packit Service 8bf002
    int     i, len, sitem, mitem90, mitem99, mitemcpl, gitem, cplus;
Packit Service 8bf002
Packit Service 8bf002
    if (argc < 2 || argc > 4)
Packit Service 8bf002
        usage();
Packit Service 8bf002
    len = strlen( argv[ 1]);
Packit Service 8bf002
    for (i = 0; i < len; i++) {
Packit Service 8bf002
        if (! isdigit( argv[ 1][ i]))
Packit Service 8bf002
            usage();
Packit Service 8bf002
    }
Packit Service 8bf002
    if ((cases = atoi( argv[ 1])) > MAX_CASES)
Packit Service 8bf002
        usage();
Packit Service 8bf002
    if (argc > 2)
Packit Service 8bf002
        if (freopen( argv[ 2], "r", stdin) == NULL)
Packit Service 8bf002
            usage();
Packit Service 8bf002
    if (argc == 4)
Packit Service 8bf002
        if (freopen( argv[ 3], "w", stdout) == NULL)
Packit Service 8bf002
            usage();
Packit Service 8bf002
Packit Service 8bf002
    sitem = mitem90 = mitem99 = mitemcpl = gitem = cplus = 0;
Packit Service 8bf002
Packit Service 8bf002
    while (fgets( buf, MAX_LLEN, stdin) != NULL) {
Packit Service 8bf002
        if (isalpha( buf[ 0]) && buf[ 1] == '.' && isdigit( buf[ 2])) {
Packit Service 8bf002
            add_points( C90);
Packit Service 8bf002
            sitem++;
Packit Service 8bf002
        } else if (isalpha( buf[ 0]) && buf[ 1] == '.' && isalpha( buf[ 2])) {
Packit Service 8bf002
            if (cplus) {
Packit Service 8bf002
                add_points( CPL);
Packit Service 8bf002
                mitemcpl++;
Packit Service 8bf002
            } else {
Packit Service 8bf002
                add_points( C99);
Packit Service 8bf002
                mitem99++;
Packit Service 8bf002
            }
Packit Service 8bf002
        } else if (memcmp( buf, "stotal", 6) == 0) {
Packit Service 8bf002
            put_subtotal();
Packit Service 8bf002
            fprintf( stderr, "sitem:%d\n", sitem);
Packit Service 8bf002
            mitem90 += sitem;
Packit Service 8bf002
            sitem = 0;
Packit Service 8bf002
        } else if (memcmp( buf, "mttl90", 6) == 0) {
Packit Service 8bf002
            put_mttl( C90);
Packit Service 8bf002
            fprintf( stderr, "  mitem90:%d\n", mitem90);
Packit Service 8bf002
            gitem += mitem90;
Packit Service 8bf002
            mitem90 = 0;
Packit Service 8bf002
        } else if (memcmp( buf, "mttl99", 6) == 0) {
Packit Service 8bf002
            put_mttl( C99);
Packit Service 8bf002
            fprintf( stderr, "  mitem99:%d\n", mitem99);
Packit Service 8bf002
            gitem += mitem99;
Packit Service 8bf002
            mitem99 = 0;
Packit Service 8bf002
        } else if (memcmp( buf, "mttl++", 6) == 0) {
Packit Service 8bf002
            put_mttl( CPL);
Packit Service 8bf002
            fprintf( stderr, "  mitem++:%d\n", mitemcpl);
Packit Service 8bf002
            gitem += mitemcpl;
Packit Service 8bf002
            mitemcpl = cplus = 0;
Packit Service 8bf002
        } else if (memcmp( buf, "gtotal", 6) == 0) {
Packit Service 8bf002
            put_grandtotal();
Packit Service 8bf002
            fprintf( stderr, "      gitem:%d\n", gitem);
Packit Service 8bf002
        } else if (memcmp( buf, "[C++:", 5) == 0) {
Packit Service 8bf002
            cplus = 1;
Packit Service 8bf002
        }
Packit Service 8bf002
        /* Else as it is.   */
Packit Service 8bf002
        fputs( buf, stdout);
Packit Service 8bf002
    }
Packit Service 8bf002
Packit Service 8bf002
    return 0;
Packit Service 8bf002
}
Packit Service 8bf002
Packit Service 8bf002
void    usage( void) {
Packit Service 8bf002
    char    **mesp;
Packit Service 8bf002
    static char     *mes[] = {
Packit Service 8bf002
        "Total:  Put totals of \"cpp_test.tbl\".\n",
Packit Service 8bf002
        "Usage:  total <num> cpp_test.old cpp_test.new\n",
Packit Service 8bf002
        "Specify the number of preprocessors by <num>.\n",
Packit Service 8bf002
        NULL
Packit Service 8bf002
    };
Packit Service 8bf002
Packit Service 8bf002
    mesp = mes;
Packit Service 8bf002
    while (*mesp)
Packit Service 8bf002
        fputs( *mesp++, stderr);
Packit Service 8bf002
    exit( 0);
Packit Service 8bf002
}
Packit Service 8bf002
Packit Service 8bf002
void    add_points( int norm) {
Packit Service 8bf002
    int     i;
Packit Service 8bf002
    int     len;
Packit Service 8bf002
    int     max, point;
Packit Service 8bf002
    int     *arr;
Packit Service 8bf002
    char    *p;
Packit Service 8bf002
Packit Service 8bf002
    switch (norm) {
Packit Service 8bf002
    case C90:
Packit Service 8bf002
        arr = subtotal;
Packit Service 8bf002
        break;
Packit Service 8bf002
    case C99:
Packit Service 8bf002
        arr = mttl99;
Packit Service 8bf002
        break;
Packit Service 8bf002
    case CPL:
Packit Service 8bf002
        arr = mttlcpl;
Packit Service 8bf002
        break;
Packit Service 8bf002
    }
Packit Service 8bf002
    len = strlen( buf);
Packit Service 8bf002
Packit Service 8bf002
    for (i = 0, p = buf + OFFS + 1; i < COLS && p - buf < len;
Packit Service 8bf002
            i++, p += LEN, i == MAXC ? (p += 2) : 0) {
Packit Service 8bf002
        if (*(p + 2) == ' ')    /* No point written */
Packit Service 8bf002
            continue;
Packit Service 8bf002
        point = atoi( p);
Packit Service 8bf002
        switch (i) {
Packit Service 8bf002
        case 0:     max = point;    break;
Packit Service 8bf002
        default:
Packit Service 8bf002
            if (point < 0 || max < point) {
Packit Service 8bf002
                fprintf( stderr, "Out of range: (No.%d) %d\n"
Packit Service 8bf002
                        , i - 1, point);
Packit Service 8bf002
                fputs( buf, stderr);
Packit Service 8bf002
            }
Packit Service 8bf002
            break;
Packit Service 8bf002
        }
Packit Service 8bf002
        arr[ i] += point;
Packit Service 8bf002
    }
Packit Service 8bf002
}
Packit Service 8bf002
Packit Service 8bf002
void    put_subtotal( void) {
Packit Service 8bf002
    int     i;
Packit Service 8bf002
    char    *p;
Packit Service 8bf002
    buf[ OFFS - 1] = ' ';
Packit Service 8bf002
Packit Service 8bf002
    for (i = 0, p = buf + OFFS; i < COLS; i++, p += LEN) {
Packit Service 8bf002
        if (i == MAXC)
Packit Service 8bf002
            p = stpcpy( p, "  ");
Packit Service 8bf002
        sprintf( p, "%4d", subtotal[ i]);
Packit Service 8bf002
        mttl90[ i] += subtotal[ i];
Packit Service 8bf002
        subtotal[ i] = 0;
Packit Service 8bf002
    }
Packit Service 8bf002
Packit Service 8bf002
    strcpy( p, "\n");
Packit Service 8bf002
}
Packit Service 8bf002
Packit Service 8bf002
void    put_mttl( int norm) {
Packit Service 8bf002
    int     i;
Packit Service 8bf002
    char    *p;
Packit Service 8bf002
    int     *mttl;
Packit Service 8bf002
Packit Service 8bf002
    switch (norm) {
Packit Service 8bf002
    case C90:
Packit Service 8bf002
        mttl = mttl90;
Packit Service 8bf002
        break;
Packit Service 8bf002
    case C99:
Packit Service 8bf002
        mttl = mttl99;
Packit Service 8bf002
        break;
Packit Service 8bf002
    case CPL:
Packit Service 8bf002
        mttl = mttlcpl;
Packit Service 8bf002
        break;
Packit Service 8bf002
    }
Packit Service 8bf002
    buf[ OFFS - 1] = ' ';
Packit Service 8bf002
Packit Service 8bf002
    for (i = 0, p = buf + OFFS; i < COLS; i++, p += LEN) {
Packit Service 8bf002
        if (i == MAXC)
Packit Service 8bf002
            p = stpcpy( p, "  ");
Packit Service 8bf002
        sprintf( p, "%4d", mttl[ i]);
Packit Service 8bf002
        grandtotal[ i] += mttl[ i];
Packit Service 8bf002
        mttl[ i] = 0;
Packit Service 8bf002
    }
Packit Service 8bf002
Packit Service 8bf002
    strcpy( p, "\n");
Packit Service 8bf002
}
Packit Service 8bf002
Packit Service 8bf002
void    put_grandtotal( void) {
Packit Service 8bf002
    int     i;
Packit Service 8bf002
    char    *p;
Packit Service 8bf002
Packit Service 8bf002
    buf[ OFFS - 1] = ' ';
Packit Service 8bf002
Packit Service 8bf002
    for (i = 0, p = buf + OFFS; i < COLS; i++, p += LEN) {
Packit Service 8bf002
        if (i == MAXC)
Packit Service 8bf002
            p = stpcpy( p, "  ");
Packit Service 8bf002
        sprintf( p, "%4d", grandtotal[ i]);
Packit Service 8bf002
    }
Packit Service 8bf002
Packit Service 8bf002
    strcpy( p, "\n");
Packit Service 8bf002
}
Packit Service 8bf002
Packit Service 8bf002
#if !__TURBOC__
Packit Service 8bf002
char    *stpcpy( char *p, const char *app) {
Packit Service 8bf002
    strcpy( p, app);
Packit Service 8bf002
    return p + strlen( p);
Packit Service 8bf002
}
Packit Service 8bf002
#endif
Packit Service 8bf002