Subject: v20i020: Tools for generating software metrics, Part13/14 Newsgroups: comp.sources.unix Sender: sources Approved: rsalz@uunet.UU.NET Submitted-by: Brian Renaud 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 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... */ 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 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