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
 | |
| 
 |