v20i020: Tools for generating software metrics, Part13/14
Rich Salz
rsalz at uunet.uu.net
Wed Sep 20 04:47:41 AEST 1989
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 at uunet.uu.net.
Use a domain-based address or give alternate paths, or you may lose out.
More information about the Comp.sources.unix
mailing list