123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- /*
- Gathering run-time statistics
- */
- /* $Id$ */
- #include <stdio.h>
- #include "global.h"
- #include "linfil.h"
- #include "alloc.h"
- struct line_tally { /* one for each line */
- long lt_cnt; /* counts entrances */
- long lt_instr; /* counts instructions */
- };
- struct file_tally { /* one for each file */
- struct file_tally *next;
- ptr ft_fil; /* file name */
- long ft_limit; /* size of line array */
- struct line_tally *ft_line; /* pointer to line array */
- };
- PRIVATE struct file_tally *first_tally; /* start of chain */
- PRIVATE struct file_tally *file; /* present file */
- PRIVATE long lastLIN;
- PRIVATE tally_newFIL();
- PRIVATE enlarge();
- tally()
- {
- if (!FIL)
- return;
-
- if (!file || FIL != file->ft_fil) {
- tally_newFIL(FIL);
- file->ft_fil = FIL;
- lastLIN = -1;
- }
- if (LIN != lastLIN) {
- if (LIN >= file->ft_limit) {
- enlarge(file, LIN);
- }
- file->ft_line[LIN].lt_cnt++;
- lastLIN = LIN;
- }
- file->ft_line[LIN].lt_instr++;
- }
- PRIVATE tally_newFIL(f)
- ptr f;
- {
- struct file_tally **hook = &first_tally;
-
- while (*hook) {
- if ((*hook)->ft_fil == f)
- break;
- hook = &(*hook)->next;
- }
- if (!*hook) {
- /* first time we see this file */
- /* construct a new entry */
- struct file_tally *nt = (struct file_tally *)
- Malloc((size) sizeof (struct file_tally), "file_tally");
-
- nt->next = (struct file_tally *)0;
- nt->ft_fil = f;
- nt->ft_limit = 1; /* provisional length */
- nt->ft_line = (struct line_tally *)
- Malloc((size) sizeof (struct line_tally),
- "struct line_tally");
- nt->ft_line[0].lt_cnt = 0;
- nt->ft_line[0].lt_instr = 0;
-
- /* and hook it in */
- *hook = nt;
- }
- file = *hook;
- }
- PRIVATE enlarge(ft, l)
- struct file_tally *ft;
- long l;
- {
- long limit = allocfrac(l < 100 ? 100 : l);
-
- if (limit <= ft->ft_limit)
- return;
- ft->ft_line = (struct line_tally *)
- Realloc((char *)ft->ft_line,
- (size)(limit*sizeof (struct line_tally)),
- "array line_tally");
- while (ft->ft_limit < limit) {
- ft->ft_line[ft->ft_limit].lt_cnt = 0;
- ft->ft_line[ft->ft_limit].lt_instr = 0;
- ft->ft_limit++;
- }
- }
- PRIVATE FILE *tally_fp;
- out_tally()
- {
- struct file_tally **hook = &first_tally;
-
- if (!*hook)
- return;
- tally_fp = fopen("int.tally", "w");
- if (!tally_fp)
- return;
- while (*hook) {
- struct file_tally *ft = *hook;
- register long i;
-
- fprintf(tally_fp, "%s:\n", dt_fname(ft->ft_fil));
- for (i = 0; i < ft->ft_limit; i++) {
- struct line_tally *lt = &ft->ft_line[i];
-
- if (lt->lt_cnt) {
- /* we visited this line */
- fprintf(tally_fp, "\t%ld\t%ld\t%ld\n",
- i, lt->lt_cnt, lt->lt_instr);
- }
- }
- fprintf(tally_fp, "\n");
- hook = &(*hook)->next;
- }
- fclose(tally_fp);
- tally_fp = 0;
- }
|