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