137 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			137 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
	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;
 | 
						|
}
 | 
						|
 |