home *** CD-ROM | disk | FTP | other *** search
- Subject: v20i020: Tools for generating software metrics, Part13/14
- Newsgroups: comp.sources.unix
- Sender: sources
- Approved: rsalz@uunet.UU.NET
-
- 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
-
-
-