[comp.sources.unix] v20i017: Tools for generating software metrics, Part10/14

rsalz@uunet.uu.net (Rich Salz) (09/20/89)

Submitted-by: Brian Renaud <huron.ann-arbor.mi.us!bdr>
Posting-number: Volume 20, Issue 17
Archive-name: metrics/part10

---- Cut Here and unpack ----
#!/bin/sh
# this is part 10 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file src/mccabe/mccabe.sh continued
#
CurArch=10
if test ! -r s2_seq_.tmp
then echo "Please unpack part 1 first!"
     exit 1; fi
( read Scheck
  if test "$Scheck" != $CurArch
  then echo "Please unpack part $Scheck next!"
       exit 1;
  else exit 0; fi
) < s2_seq_.tmp || exit 1
echo "x - Continuing file src/mccabe/mccabe.sh"
sed 's/^X//' << 'SHAR_EOF' >> src/mccabe/mccabe.sh
X			  File, nofunc, complexity[nofunc], returns[nofunc]);
X		else
X			printf("%s\t%s\t%d\t%d\n",\
X			  File, nofunc, complexity[nofunc], returns[nofunc]);
X		}
X	}
X	'
Xdone
Xexit 0
SHAR_EOF
echo "File src/mccabe/mccabe.sh is complete"
chmod 0644 src/mccabe/mccabe.sh || echo "restore of src/mccabe/mccabe.sh fails"
echo "x - extracting src/mccabe/test.result (Text)"
sed 's/^X//' << 'SHAR_EOF' > src/mccabe/test.result
XFile          	Name           	Complexity	No. of returns
X--------------	---------------	----------	--------------
Xtest1.c       	Malloc         	         2	         2
Xtest1.c       	lockedtoday    	         5	         1
Xtest1.c       	main           	         9	         3
Xtest1.c       	touch          	        18	         1
Xtest2.y       	mbcheck        	         7	         0
Xtest2.y       	***            	        17	         0
Xtest2.y       	savetype       	         1	         0
Xtest2.y       	savename       	         1	         0
Xtest3.c       	Malloc         	         2	         2
Xtest3.c       	data_filter    	         2	         0
Xtest3.c       	firstdd        	         1	         1
Xtest3.c       	build_outlist  	        13	         2
Xtest3.c       	loaddd         	         8	         1
Xtest3.c       	finddd         	         3	         1
Xtest3.c       	main           	         3	         3
Xtest3.c       	argcheck       	        13	         1
Xtest3.c       	newfd          	         1	         1
Xtest3.c       	buildcmd       	         4	         1
Xtest3.c       	nextdd         	         2	         1
SHAR_EOF
chmod 0644 src/mccabe/test.result || echo "restore of src/mccabe/test.result fails"
echo "x - extracting src/parse.sccs/parse.prs (Text)"
sed 's/^X//' << 'SHAR_EOF' > src/parse.sccs/parse.prs
X: parse output from sccs prs command
X
Xfor file in $*
Xdo
X	prs ${file} | awk '
X	BEGIN {
X		True = 1;
X		False = 0;
X		inMR = False;
X		inComment = False;
X		first = True;
X		delcount = 0;
X		# quarter into which month falls
X		quarter[01] = 1; quarter[02] = 1; quarter[03] = 1;
X		quarter[04] = 2; quarter[05] = 2; quarter[06] = 2;
X		quarter[07] = 3; quarter[08] = 3; quarter[09] = 3;
X		quarter[10] = 4; quarter[11] = 4; quarter[12] = 4;
X	}
X
X	$0 == "" {	#blank line between entries
X		inMR = False;
X		inComment = False;
X		next;
X	}
X
X	$0 ~ /^D [0-9][0-9]*\.[0-9][0-9]*/ { # got delta entry
X
X		if ( split($8, delchgs, "/") != 3)
X		{
X			printf("%s: unable to split add/delete/nochange field in sccs\n", "'"$0"'");
X			printf("   for entry %s\n", $0);
X			next;
X		}
X		if ( delchgs[1] + 0 != 0 || delchgs[2] + 0 != 0 )
X		{
X			split($3, date, "/");
X			if ( $2 == "1.1" )		# grab original author
X			{
X				origname = $5 "," date[1] "," quarter[date[2]+0];
X				origlines = delchgs[1];
X			}
X			else
X				changect++;
X			delcount++;
X			delname[delcount] = $5 "," date[1] "," quarter[date[2]+0];
X			deladds[delcount] = delchgs[1] - delchgs[2];
X		}
X		next;
X	}
X
X	$1 ~ /^MRs:/ {
X		inMR = True;
X		next;
X	}
X
X	$1 ~ /^COMMENT/ {
X		inComment = True;
X		next;
X	}
X
X	inMR == 1 {	# skipping through MR section - maybe use this later
X		next;
X	}
X
X	inComment == 1 {	# skipping through comment section
X		next;
X	}
X
X	{
X		# a new file, right?
X		if ( first )
X			first = False;
X		else
X			# print stats for previous file
X			printf("%s\t%d\n", file, changect);
X		changect = 0;
X		file = $1;
X	}
X	END {
X		lines = 0;
X		for ( i = 1; i <= delcount; i++ )
X			lines += deladds[i];
X		for ( i = 1; i <= delcount; i++)
X		{
X			if ( deladds[i] < 0 )
X				deladds[i] *= -1;
X			delpctg[ delname[i] ] += deladds[i] / lines;
X		}
X		printf("%s\t%d", file, changect);
X		printf("\t%s\t%.3f", origname, origlines / lines);
X		for (name in delpctg)
X			printf("\t%s\t%.3f", name, delpctg[name]);
X		printf("\n");
X	}
X	' | sed 's/:	/	/' | sed 's@/s\.@/@'
Xdone
SHAR_EOF
chmod 0644 src/parse.sccs/parse.prs || echo "restore of src/parse.sccs/parse.prs fails"
echo "x - extracting src/testfiles/test1.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > src/testfiles/test1.c
X/* cause program to be run once per day */
X
X/* arguments:
X * argument 1	lock name
X * argument 2..n	command to execute
X */
X#ifndef NO_SCCS_ID
Xstatic char *sccsid = "@(#)daylock.c	1.1 (bdr) 11/6/86";
X#endif
X
X#include <stdio.h>
X#include <sys/types.h>
X#include <sys/stat.h>
X#include <time.h>
X#include <errno.h>
X#include "bdr.h"
X
XBool	lockedtoday();	/* lockedtoday returns true if locked today */
XBool	touch();	/* returns true if touch succeeded */
Xchar	*Cmdname;
X
Xmain( argc, argv )
X	int	argc;
X	char	*argv[];
X{
X	int	result;
X	char	*Malloc();
X	char	*usrcmd;
X
X	if ( argc < 2 )
X	{
X		fprintf(stderr,
X			"usage: %s <lock-file> <command> [<argument>]\n",
X			argv[0]);
X		exit(1);
X	}
X	Cmdname = argv[0];
X
X
X	if ( lockedtoday( argv[1] ) )
X		result = 1;
X	else
X	{
X		if ( ! touch( argv[1] ) )
X			result = 1;
X		else
X		{
X			int	cmdsize, argidx;
X
X		
X			for (argidx = 2; argidx < argc; argidx++)
X				cmdsize += strlen( argv[argidx] ) + 1;
X			usrcmd = (char *) Malloc( cmdsize );
X
X			strcpy(usrcmd, argv[2]);
X			for ( argidx = 3; argidx < argc; argidx++)
X				{
X				strcat(usrcmd, " ");
X				strcat(usrcmd, argv[argidx]);
X				}
X			strcat(usrcmd,'\0');
X
X			/* ok, now execute the user's command */
X			if ( system( usrcmd ) == 127 )
X				{
X				perror("");
X				exit(1);
X				}
X			result = 0;
X		}
X	}
X	exit (result);
X}
X
X
XBool
Xlockedtoday( filename )
X	char	*filename;
X{
X
X	/* check to see if the file specified as an argument has been touched
X	 * (locked) today.  If so, return 0, else return 1.  If the file
X	 * cannot be opened, assume it has not been touched, return 1
X	 */
X	long time();
X	struct tm *localtime();
X	struct stat	buf;
X	Bool	result;
X
X	if ( stat(filename, &buf) == 0 )
X	{
X		/* even though systime and buf.st_mtime are declared
X		 * differently (thanks a lot berkeley) we are going
X		 * to compare them, assuming they represent the same
X		 * quality
X		 */
X		long	systime, secs_today;
X		struct tm	*tptr;
X
X		time( &systime );
X		tptr = localtime( &systime );
X
X		secs_today = tptr->tm_sec + ( tptr->tm_min * 60L ) +
X		             ( tptr->tm_hour * 3600L );
X
X		if ( ( systime - secs_today ) > buf.st_mtime )
X			result = False;	/* locked before start of day */
X		else
X			result = True;	/* locked after start of day */
X	}
X	else
X		result = False;
X	return result;
X}
X
XBool
Xtouch( filename )
X	char	*filename;
X{
X	/* create file if it does not exist, otherwise try to read then
X	 * write first byte of file
X	 * returns true if succeeded, false otherwise
X	 */
X	extern int	errno;
X
X	FILE	*fp;
X	char	buf;
X	struct stat	statbuf;
X	Bool	result, succeeded = False;
X
X	/* first check to see if file exists */
X	if ( stat(filename, &statbuf) != 0 )
X	{
X		if ( errno == ENOENT )
X		{
X			if ( (fp = fopen( filename, "w")) != NULL )
X				if ( fwrite( &buf, sizeof(buf), 1, fp) != 0 )
X					if ( fclose( fp ) != EOF )
X						succeeded = True;
X			if ( succeeded )
X				result = True;
X			else
X			{
X				fprintf(stderr, "%s: %s: ",Cmdname, filename);
X				perror("");
X				result = False;
X			}
X		}
X		else
X		{
X			fprintf(stderr, "%s: %s: ",Cmdname, filename);
X			perror("");
X			result = False;
X		}
X	}
X	else
X	{
X		if ( (fp = fopen( filename, "r+")) != NULL )
X		{
X			if ( fread( &buf, sizeof(buf), 1, fp ) != 0)
X				if ( fseek( fp, 0L, 0) !=  -1 )
X					if ( fwrite( &buf, sizeof(buf), 1, fp) != 0 )
X						if ( fclose( fp ) != EOF )
X							succeeded = True;
X
X			if ( succeeded )
X				result = True;
X			else
X			{
X				fclose(fp);
X				result = False;
X			}
X		}
X		else
X		{
X			fprintf( stderr, "%s: %s: ", Cmdname, filename);
X			perror("");
X			result = False;
X		}
X	}
X	return result;
X}
X
X
Xchar *
XMalloc( size )
X	register int	size;
X{
X	register char *vast_tracts ;
X	char	*malloc();
X
X	if ( ! ( vast_tracts = malloc( size ) ) )
X	{
X		fprintf(stderr, "%s: unable to allocate more space\n", Cmdname);
X		exit(1);
X	}
X	return( vast_tracts );
X}
SHAR_EOF
chmod 0644 src/testfiles/test1.c || echo "restore of src/testfiles/test1.c fails"
echo "x - extracting src/testfiles/test2.y (Text)"
sed 's/^X//' << 'SHAR_EOF' > src/testfiles/test2.y
X%{
X/* this file (cdgram.y) borrowed from the excellent ``cdecl'' utility
X * currently maintained by Chris Torek.  I should produce code this
X * useful.
X*/
X#include <stdio.h>
X
X#define	MB_SHORT	0001
X#define	MB_LONG		0002
X#define	MB_UNSIGNED	0004
X#define MB_INT		0010
X#define MB_CHAR		0020
X#define MB_FLOAT	0040
X#define MB_DOUBLE	0100
X
Xint modbits = 0;
Xint arbdims = 1;
Xchar *savedtype;
Xchar *savedname;
Xchar *ds(), *cat();
Xchar *index(), *malloc();
Xchar prev;
X%}
X
X%union {
X	char *dynstr;
X	struct {
X		char *left;
X		char *right;
X	} halves;
X}
X
SHAR_EOF
echo "End of part 10"
echo "File src/testfiles/test2.y is continued in part 11"
echo "11" > s2_seq_.tmp
exit 0


-- 
Please send comp.sources.unix-related mail to rsalz@uunet.uu.net.
Use a domain-based address or give alternate paths, or you may lose out.