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