[comp.sources.unix] v20i020: Tools for generating software metrics, Part13/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 20
Archive-name: metrics/part13

---- Cut Here and unpack ----
#!/bin/sh
# this is part 13 of a multipart archive
# do not concatenate these parts, unpack them in order with /bin/sh
# file src/utils/bdr.h continued
#
CurArch=13
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/utils/bdr.h"
sed 's/^X//' << 'SHAR_EOF' >> src/utils/bdr.h
X * Local means it should be private to module */
X#define Global	extern
X#define Local	extern
X
X#endif /* BDR_H */
SHAR_EOF
echo "File src/utils/bdr.h is complete"
chmod 0644 src/utils/bdr.h || echo "restore of src/utils/bdr.h fails"
echo "x - extracting src/utils/stripcom.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > src/utils/stripcom.c
X/* strip comments from c program */
X/* read from stdin, write to stdout */
X#include <stdio.h>
X#include "bdr.h"
X#include "argfiles.h"
X
X#define COMMENT 0
X#define CODE 1
X#define STRING 2
X#define CHARSTR 3
X
Xvoid	cstrip();
Xvoid	shstrip();
Xvoid	poundstrip();
Xvoid	vmenustrip();
XFILE	*nextfp();
X
Xmain(argc, argv)
X	int	argc;
X	char	*argv[];
X{
X	FILE	*input;
X	int	filetype;
X
X	while ( (input = nextfp(argc, argv, &filetype)) != FNULL )
X	{
X		switch ( filetype )
X		{
X		case HEADER:
X			cstrip( input );
X			break;
X		case YACC:
X			cstrip( input );
X			break;
X		case C:
X			cstrip( input );
X			break;
X		case PASCAL:
X			fprintf(stderr,
X				"%s: does not support comment stripping for pascal programs\n",
X				argv[0]);
X			break;
X		case SHELL:
X			shstrip( input );
X			break;
X		case ASSEMBLY:
X			fprintf(stderr,
X				"%s: does not support comment stripping for assembly programs\n",
X				argv[0]);
X			break;
X		case AWK:
X			poundstrip( input );
X			break;
X		case VMENU:
X			vmenustrip( input );
X			break;
X		case COBOL:
X			fprintf(stderr,
X				"%s: does not support comment stripping for Cobol programs\n",
X				argv[0]);
X			break;
X		case MAKEFILE:
X			poundstrip( input );
X			break;
X		case STDINP:
X			cstrip( input );
X			break;
X		case OTHER:
X			cstrip( input );
X			break;
X		default:
X			fprintf(stderr,
X				"%s: SYSTEM ERROR, bad filetype (%d)\n",
X				filetype);
X			break;
X		}
X	}
X	exit(0);
X}
X
Xvoid
Xcstrip( fp )
X	register FILE	*fp;
X{
X	register int	c;
X	register int	state=CODE;
X
X	while ( (c = getc( fp )) != EOF )
X	{
X		if ( state != COMMENT && c == '\\' )
X		{
X			if ( (c = getc(fp)) != EOF )
X			{
X				if ( c == '\'' || c == '"' )
X				{
X					putchar( '\\' );
X					putchar( c );
X					continue;
X				}
X				else
X					putchar( '\\' );
X			}
X			else
X			{
X				putchar( '\\' );
X				break;
X			}
X		}
X		if ( state == CODE )
X		{
X			if ( c == '/' )
X			{
X				if ( (c = getc(fp)) != EOF )
X				{
X					if ( c == '*' )
X						state = COMMENT;
X					else
X					{
X						putchar( '/' );
X						ungetc( c, fp );
X					}
X				}
X				else
X				{
X					putchar( '/' );
X					break;
X				}
X			}
X			else if ( c == '"' )
X			{
X				state = STRING;
X				putchar( c );
X			}
X			else if ( c == '\'' )
X			{
X				state = CHARSTR;
X				putchar( c ) ;
X			}
X			else
X				putchar( c );
X		}
X		else if ( state == STRING )
X		{
X			if ( c == '"' )
X				state = CODE;
X			putchar( c );
X		}
X		else if ( state == CHARSTR )
X		{
X			if ( c == '\'' )
X				state = CODE;
X			putchar( c );
X		}
X		else	/* state is comment */
X		{
X			if ( c == '*' )
X			{
X				if ( (c = getc(fp)) != EOF )
X				{
X					if ( c == '/' )
X						state = CODE;
X					else
X						ungetc( c, fp );
X				}
X				else
X					break;
X			}
X		}
X	}
X}
X
Xvoid
Xshstrip( fp )
X	register FILE	*fp;
X{
X	/* strip comments in a shell file */
X	/* ignores continuations on a : comment; to wit:
X	 * : this is an example of a\
X	 * continuation
X	 * also ignores a : not on first char of line
X	 */
X
X	register int	c;
X	register int	state = CODE;
X	Bool	first = True;
X
X
X	while ( (c = getc( fp )) != EOF )
X	{
X		switch ( c )
X		{
X		case '#':
X			if ( state == CODE )
X				state = COMMENT;
X			break;
X		case ':':
X			if ( first )
X				state = COMMENT;
X			break;
X		case '\n':
X			if ( (c = getc(fp)) != EOF )
X			{
X				if ( c == ':' )
X				{
X					state = COMMENT;
X					putchar('\n');
X				}
X				else
X				{
X					ungetc( c, fp );
X					state = CODE;
X					c = '\n';
X				}
X			}
X			else
X			{
X				if ( state == COMMENT )
X					putchar( '\n' );
X				else
X					c = '\n';
X			}
X			break;
X		case '\\':
X			/* things like \# do not start comments */
X			if ( (c = getc(fp)) != EOF )
X			{
X				if ( c != '#' )
X				{
X					ungetc( c, fp );
X					c = '\\';
X				}
X				else
X					putchar( '\\' );
X			}
X			break;
X		case '"':
X			if ( state == STRING )
X				state = CODE;
X			else if ( state == CODE )
X				state = STRING;
X			/* if it is in a comment, just ignore it */
X			break;
X		case '\'':
X			if ( state == CHARSTR )
X				state = CODE;
X			else if ( state == CODE )
X				state = CHARSTR;
X			/* if it is in a comment, just ignore it */
X			break;
X		default:
X			break;
X		}
X		if ( state != COMMENT )
X			putchar( c );
X		first = False;
X	}
X}
X
Xvoid
Xpoundstrip( fp )
X	register FILE	*fp;
X{
X	/* strip of the form # ...comment... <NEWLINE> */
X
X	register int	c;
X	register int	state = CODE;
X	int	old_state;
X
X	while ( (c = getc( fp )) != EOF )
X	{
X		if ( c == '#' && state == CODE )
X			state = COMMENT;
X		else if ( c == '\n' )
X			state = CODE;
X		else if ( c == '\\' )
X		{
X			/* things like \# do not start comments */
X			if ( (c = getc(fp)) != EOF )
X			{
X				if ( c != '#' )
X					ungetc( c, fp );
X				else
X					putchar( '\\' );
X			}
X			else
X				break;
X		}
X		else if ( c == '"' )
X		{
X			if ( state == STRING )
X				state = CODE;
X			else if ( state == CODE )
X				state = STRING;
X			/* if it is in a comment, just ignore it */
X		}
X		else if ( c == '\'' )
X		{
X			if ( state == CHARSTR )
X				state = CODE;
X			else if ( state == CODE )
X				state = CHARSTR;
X			/* if it is in a comment, just ignore it */
X		}
X		if ( state != COMMENT )
X			putchar( c );
X	}
X}
X
Xvoid
Xvmenustrip( fp )
X	register FILE	*fp;
X{
X	register int	c;
X	/* this is real easy now, visual has no comments */
X
X	while ( (c = getc( fp )) != EOF )
X		putchar( c );
X}
SHAR_EOF
chmod 0644 src/utils/stripcom.c || echo "restore of src/utils/stripcom.c fails"
echo "x - extracting src/utils/stripstr.c (Text)"
sed 's/^X//' << 'SHAR_EOF' > src/utils/stripstr.c
X/* remove strings from input - where a string is anything 
X * between (and including) two quotes (")
X */
X#include <stdio.h>
X
X
Xtypedef char	Bool;
X#define True	1
X#define False	0
X
Xtypedef int	State;
X#define	Not_String	0
X#define String	1
X#define Escape	2
X#define Prime	3
X
X#define FNULL	( (FILE *) 0)
X#define CNULL	( (char *) 0)
X
X#ifdef DEBUG
X#define transstate(X,Y)  printf("[%d to %d]", X, Y)
X#else
X#define transstate(X,Y)
X#endif /* DEBUG */
X
Xint
Xmain(argc, argv)
X	int	argc;
X	char	*argv[];
X{
X	register int	input;
X	register State	statevar;
X	register FILE	*fp;
X	State	laststate;
X	char	*filename;
X	Bool	long_prime=False;	/* where many chars between primes */
X	Bool	inprime=False;	/* true if processing a "prime string" */
X
X	FILE	*nextfp();
X
X	while ( (fp = nextfp(argc, argv, &filename)) != FNULL )
X	{
X
X		statevar = laststate = Not_String;
X		while ( (input = getc(fp)) != EOF )
X		{
X			switch ( statevar )
X			{
X			case Not_String:
X				if ( input == '"' )
X				{
X					transstate(statevar, String);
X					statevar = String;
X				}
X				else 
X				{
X					if ( input == '\\' )
X					{
X						laststate = statevar;
X						statevar = Escape;
X						transstate(laststate, statevar);
X					}
X					else if ( input == '\'' )
X					{
X						/* if it is a long prime string
X						 * just dump the prime and
X						 * continue
X						 */
X						if ( !long_prime )
X						{
X							laststate = statevar;
X							statevar = Prime;
X							transstate(laststate, statevar);
X						}
X						long_prime = False;
X					}
X					putchar( input );
X				}
X				break;
X			case String:
X				if ( input == '"' )
X				{
X					transstate( statevar, Not_String );
X					statevar = Not_String;
X				}
X				else if ( input == '\\' )
X				{
X					laststate = statevar;
X					statevar = Escape;
X					transstate(laststate, statevar);
X				}
X				break;
X			case Escape:	/* collapses two states, so use */
X					/* laststate variable */
X				if ( laststate != String )
X					putchar( input );
X				transstate(statevar, laststate);
X				statevar = laststate;
X				break;
X			case Prime:
X				putchar( input );
X				if ( input == '\\' )
X				{
X					laststate = statevar;
X					statevar = Escape;
X					transstate(Prime, Escape);
X					inprime = True;
X				}
X				else
X				{
X					if ( inprime )
X					{
X						if ( input == '\'' )
X							long_prime = False;
X						else
X							long_prime = True;
X						statevar = Not_String;
X						transstate( Prime, Not_String );
X						inprime = False;
X					}
X					else
X						inprime = True;
X				}
X				break;
X			default:
X				fprintf(stderr,
X					"%s: PROGRAM ERROR: state %d used but not defined; (file %s)\n",
X					argv[0], statevar, filename);
X				exit(1);
X				break;
X			}
X		}
X	}
SHAR_EOF
echo "End of part 13"
echo "File src/utils/stripstr.c is continued in part 14"
echo "14" > 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.