1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
|
#-----------------------------------------------------------------------------#
# Copyright (C) 1994-1995, 1997 The University of Melbourne.
# This file may only be copied under the terms of the GNU General
# Public Licence - see the file COPYING in the Mercury distribution.
#-----------------------------------------------------------------------------#
#
# Usage: awk -f source_stats.awk *.m
#
# This computes some simple statistics about Mercury source code.
{ lines++; }
/^[ ]*$/ { blank++; next; }
/^[ ]*%[ %-]*$/ { blank++; next; }
/^[ ]*%/ { comments++; next; }
/is[ ]*det/ { det_preds++; }
/is[ ]*semidet/ { semidet_preds++; }
/is[ ]*nondet/ { nondet_preds++; }
/is[ ]*multi/ { multidet_preds++; }
/is[ ]*cc_nondet/ { cc_nondet_preds++; }
/is[ ]*cc_multi/ { cc_multidet_preds++; }
/is[ ]*erroneous/ { erroneous_preds++; }
/is[ ]*failure/ { failure_preds++; }
/^:-[ ]*func/ { func_count++; in_func = 1; }
/^:-[ ]*func.*::/ { funcmode_count++; in_func = 1; }
/^:-[ ]*pred/ { pred_count++; in_pred = 1; }
/^:-[ ]*pred.*::/ { predmode_count++; in_pred = 1; }
/^:-[ ]*mode/ { mode_count++; in_mode = 1; }
/^:-[ ]*type/ { type_count++; in_type = 1; }
/^:-[ ]*inst/ { inst_count++; in_inst = 1; }
/^:-/ { in_decl = 1; }
{
if (in_func) funcs++;
if (in_pred) preds++;
if (in_mode) modes++;
if (in_type) types++;
if (in_inst) insts++;
if (in_decl) decls++;
}
/\.[ ]*$/ { in_pred = in_func = in_mode = in_type = in_inst = in_decl = 0; }
END {
total_mode_count = mode_count + predmode_count + funcmode_count;
printf("Number of types: %6d\n", type_count);
printf("Number of insts: %6d\n", inst_count);
printf("Number of predicates: %6d\n", pred_count);
printf("Number of functions: %6d\n", func_count);
printf("\n");
printf("Number of predmodes: %6d\n", predmode_count);
printf("Number of funcmodes: %6d\n", funcmode_count);
printf("Number of separate modes: %6d\n", mode_count);
printf("Number of implicit function modes: ?\n");
printf("Total number of modes: >= %6d\n", total_mode_count);
printf(" =< %6d\n",
func_count + total_mode_count);
printf(" - det: %6d (%6.2f%%)\n", det_preds, 100 * det_preds / total_mode_count);
printf(" - semidet: %6d (%6.2f%%)\n", semidet_preds, 100 * semidet_preds / total_mode_count);
printf(" - nondet: %6d (%6.2f%%)\n", nondet_preds, 100 * nondet_preds / total_mode_count);
printf(" - multi: %6d (%6.2f%%)\n", multidet_preds, 100 * multidet_preds / total_mode_count);
printf(" - cc_nondet: %6d (%6.2f%%)\n", cc_nondet_preds, 100 * cc_nondet_preds / total_mode_count);
printf(" - cc_multi: %6d (%6.2f%%)\n", cc_multidet_preds, 100 * cc_multidet_preds / total_mode_count);
printf(" - erroneous: %6d (%6.2f%%)\n", erroneous_preds, 100 * erroneous_preds / total_mode_count);
printf(" - failure: %6d (%6.2f%%)\n", failure_preds, 100 * failure_preds / total_mode_count);
printf("Average modes per predicate: >= %6.3f\n", (predmode_count + mode_count) / pred_count);
printf(" =< %6.3f\n", total_mode_count / pred_count);
printf("\n");
printf("Blank lines: %6d (%6.2f%%)\n", blank, 100 * blank / lines);
printf("Comment lines: %6d (%6.2f%%)\n", comments, 100 * comments / lines);
whitespace = blank + comments;
printf("Total whitespace/comment lines: %6d (%6.2f%%)\n", whitespace, 100 * whitespace / lines);
printf("\n");
printf("Function declaration lines: %6d (%6.2f%%)\n", funcs, 100 * funcs / lines);
printf("Predicate declaration lines: %6d (%6.2f%%)\n", preds, 100 * preds / lines);
printf("Mode declaration lines: %6d (%6.2f%%)\n", modes, 100 * modes / lines);
printf("Type declaration lines: %6d (%6.2f%%)\n", types, 100 * types / lines);
printf("Inst declaration lines: %6d (%6.2f%%)\n", insts, 100 * insts / lines);
other_decls = decls - preds - funcs - modes - types - insts;
printf("Other declaration lines: %6d (%6.2f%%)\n", other_decls, 100 * other_decls / lines);
printf("Total declaration lines: %6d (%6.2f%%)\n", decls, 100 * decls / lines);
printf("\n");
code = lines - whitespace - decls;
printf("Code lines: %6d (%6.2f%%)\n", code, 100 * code / lines);
printf("\n");
printf("Total number of lines: %6d (%6.2f%%)\n", lines, 100);
}
|