rsalz@uunet.uu.net (Rich Salz) (09/20/89)
Submitted-by: Brian Renaud <huron.ann-arbor.mi.us!bdr> Posting-number: Volume 20, Issue 12 Archive-name: metrics/part05 ---- Cut Here and unpack ---- #!/bin/sh # this is part 5 of a multipart archive # do not concatenate these parts, unpack them in order with /bin/sh # file src/control/proj_stats continued # CurArch=5 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/control/proj_stats" sed 's/^X//' << 'SHAR_EOF' >> src/control/proj_stats X# -files <filename> - <filename> is name of a file containing a line X# for every directory of code to be analyzed. Each X# line is of the form: X# X# dirname filelist sccsdir sccsfiles X# X# dirname is the name of a directory containing code X# filelist is a pattern which describes source code X# sccsdir is where this source is sccs'ed X# sccsfiles is a pattern which describes the sccs X# files X# X# an example line from <filename> is: X# /usr/pascal/src/compiler *.[cy] /usr/pascal/sccs/compiler s.*.[cy] X Xsourcebase=`pwd` Xgottarget=0 Xgotfiles=0 X Xwhile [ $# -gt 0 ] Xdo X case $1 in X -sourcebase) X sourcebase=$2 X shift ;; X -target) X gottarget=1 X target=$2 X shift ;; X -files) X gotfiles=1 X filespec=$2 X shift ;; X *) X echo "usage: $0 -target <directory> -files <filename> [-sourcebase <directory>]" X exit 1 X esac X shift Xdone X Xbase=`pwd` Xcd $sourcebase X X# where we find the directories and file specs Xif [ $gotfiles -ne 1 ] Xthen X echo "usage: $0 -target <directory> -files <filename> [-sourcebase <directory>]" X exit 1 Xfi Xthen X X X# temporary log for statistics for each directory Xroutine=$base/@routine_defs Xfile=$base/@file_defs X X# empty out the target statistics fiels X>$target/@file_defs X>$target/@routine_defs X Xexec < $filespec X Xwhile read dirname filelist sccsdir sccsfiles Xdo X echo gathering stats in $dirname file types "$filelist" X gather_stats -file $file -routine $routine \ X -source $dirname "$filelist" -sccs $sccsdir "$sccsfiles" X if [ $? != 0 ] X then X echo "unable to gather statistics on the $dirname directory" X exit 1 X fi X sed "s@^@$dirname/@" < $file >> $target/@file_defs X sed "s@^@$dirname/@" < $routine >> $target/@routine_defs Xdone SHAR_EOF echo "File src/control/proj_stats is complete" chmod 0754 src/control/proj_stats || echo "restore of src/control/proj_stats fails" echo "x - extracting src/halstead/Makefile (Text)" sed 's/^X//' << 'SHAR_EOF' > src/halstead/Makefile X# makefile for halstead utilities X XBIN=../bin XTEST=../testfiles X X#LDFLAGS= -i -s XLDFLAGS= X XCFLAGS= -O X XPROGS= halstead c_halsfilt X Xall: $(PROGS) X X Xhalstead: halstead.sh X cp halstead.sh halstead X chmod u+x halstead X X# if you have lex problems, "cp c_halsfilt_c c_halsfilt.c" Xc_halsfilt: c_halsfilt.l X $(LEX) c_halsfilt.l X mv lex.yy.c c_halsfilt.c X $(CC) $(LDFLAGS) c_halsfilt.c -o c_halsfilt -ll X X Xinstall: all X mv halstead $(BIN)/halstead X chmod 755 $(BIN)/halstead X X mv c_halsfilt $(BIN)/c_halsfilt X chmod 755 $(BIN)/c_halsfilt X Xclean: X -rm -f $(PROGS) core *.o c_halsfilt.c _test X Xtest: X @echo results of this command should be the same as test.result X @echo see halstead/README for systems with known differences X @cp $(TEST)/test1.c $(TEST)/test2.y $(TEST)/test3.c . X halstead test1.c test2.y test3.c > _test X diff _test test.result X @/bin/rm -f test1.c test2.y test3.c SHAR_EOF chmod 0644 src/halstead/Makefile || echo "restore of src/halstead/Makefile fails" echo "x - extracting src/halstead/c_halsfilt.l (Text)" sed 's/^X//' << 'SHAR_EOF' > src/halstead/c_halsfilt.l X/* this lex routine breaks up C programs into operators and operands */ X/* operands go to stdout, operators go to stderr */ X/* distinction is based on my reading of various articles and K&R */ X/* this routine expects comments and strings to be stripped before */ X%% X(\'.\'|\'\\.\'|\'\\[0-9]+\') { X /* character constants go to operand output */ X printf(" %s ", yytext); X } X X(\-\>|\+\+|\-\-|\<\<|\>\>|\<\=|\>\=|\=\=|\!\=|\&\&|\|\||[+*/%\-]\=) { X /* print 2 character symbols to operator output */ X fprintf(stderr,"%s\n", yytext); X putchar(' '); X } X X[\.\(\)\[\]\!\~\&\+\/\%\<\>\&\^\|\?\=\,\-] { X /* print most 1 char symbols to operator output */ X fprintf(stderr,"%s\n", yytext); X putchar(' '); X } X X\*/[^ \t\n0-9] { X /* print indirection operator to operator output */ X fprintf(stderr,"*indirection\n"); X putchar(' '); X } X X\* { X /* multiplication operator */ X fprintf(stderr,"%s\n", yytext); X putchar(' '); X } X X[\:\;\{\}] { X /* delete delimiters */ X /* NOTE - prints to stdout, unlike above */ X putchar(' '); X } X Xsizeof/([ \t\(]|$) { X /* sizeof operator to operator output */ X fprintf(stderr, "sizeof\n" ); X putchar(' '); X } X X^#[a-z]+/[ \t\n] { X /* preprocessor operators to operator output */ X fprintf(stderr, "%s\n", yytext); X putchar(' '); X } X X(if|else|while|do|for|switch|case|default|break|continue|return|goto|case)/[:; \t\(\n] { X /* statements */ X fprintf(stderr, "%s\n", yytext); X putchar(' '); X } X X(auto|static|extern|register|typedef)/[ \t\(\n] { X /* storage class specifiers */ X fprintf(stderr, "%s\n", yytext); X putchar(' '); X } X X(char|short|int|long|unsigned|float|double)/[ \t\(\)\n] { X /* type specifier */ X fprintf(stderr, "%s\n", yytext); X putchar(' '); X } X X(struct|union)/[ \t\(\n] { X /* struct or union specifier */ X fprintf(stderr, "%s\n", yytext); X putchar(' '); X } X X[a-zA-Z_][a-zA-Z0-9_]* { X /* catch operand names */ X printf(" %s ", yytext); X } X X. ECHO; X%% SHAR_EOF chmod 0644 src/halstead/c_halsfilt.l || echo "restore of src/halstead/c_halsfilt.l fails" echo "x - extracting src/halstead/c_halsfilt_c (Text)" sed 's/^X//' << 'SHAR_EOF' > src/halstead/c_halsfilt_c X# include "stdio.h" X# define U(x) x X# define NLSTATE yyprevious=YYNEWLINE X# define BEGIN yybgin = yysvec + 1 + X# define INITIAL 0 X# define YYLERR yysvec X# define YYSTATE (yyestate-yysvec-1) X# define YYOPTIM 1 X# define YYLMAX 200 X# define output(c) putc(c,yyout) X# define input() (((yytchar=yysptr>yysbuf?U(*--yysptr):getc(yyin))==10?(yylineno++,yytchar):yytchar)==EOF?0:yytchar) X# define unput(c) {yytchar= (c);if(yytchar=='\n')yylineno--;*yysptr++=yytchar;} X# define yymore() (yymorfg=1) X# define ECHO fprintf(yyout, "%s",yytext) X# define REJECT { nstr = yyreject(); goto yyfussy;} Xint yyleng; extern char yytext[]; Xint yymorfg; Xextern char *yysptr, yysbuf[]; Xint yytchar; XFILE *yyin ={stdin}, *yyout ={stdout}; Xextern int yylineno; Xstruct yysvf { X struct yywork *yystoff; X struct yysvf *yyother; X int *yystops;}; Xstruct yysvf *yyestate; Xextern struct yysvf yysvec[], *yybgin; X# define YYNEWLINE 10 Xyylex(){ Xint nstr; extern int yyprevious; Xwhile((nstr = yylook()) >= 0) Xyyfussy: switch(nstr){ Xcase 0: Xif(yywrap()) return(0); break; Xcase 1: X{ X /* character constants go to operand output */ X printf(" %s ", yytext); X } Xbreak; Xcase 2: X{ X /* print 2 character symbols to operator output */ X fprintf(stderr,"%s\n", yytext); X putchar(' '); X } Xbreak; Xcase 3: X{ X /* print most 1 char symbols to operator output */ X fprintf(stderr,"%s\n", yytext); X putchar(' '); X } Xbreak; Xcase 4: X { X /* print indirection operator to operator output */ X fprintf(stderr,"*indirection\n"); X putchar(' '); X } Xbreak; Xcase 5: X { X /* multiplication operator */ X fprintf(stderr,"%s\n", yytext); X putchar(' '); X } Xbreak; Xcase 6: X { X /* delete delimiters */ X /* NOTE - prints to stdout, unlike above */ X putchar(' '); X } Xbreak; Xcase 7: X{ X /* sizeof operator to operator output */ X fprintf(stderr, "sizeof\n" ); X putchar(' '); X } Xbreak; Xcase 8: X{ X /* preprocessor operators to operator output */ X fprintf(stderr, "%s\n", yytext); X putchar(' '); X } Xbreak; Xcase 9: X{ X /* statements */ X fprintf(stderr, "%s\n", yytext); X putchar(' '); X } Xbreak; Xcase 10: X{ X /* storage class specifiers */ X fprintf(stderr, "%s\n", yytext); X putchar(' '); X } Xbreak; Xcase 11: X{ X /* type specifier */ X fprintf(stderr, "%s\n", yytext); X putchar(' '); X } Xbreak; Xcase 12: X { X /* struct or union specifier */ X fprintf(stderr, "%s\n", yytext); X putchar(' '); X } Xbreak; Xcase 13: X{ X /* catch operand names */ X printf(" %s ", yytext); X } Xbreak; Xcase 14: X ECHO; Xbreak; Xcase -1: Xbreak; Xdefault: Xfprintf(yyout,"bad switch yylook %d",nstr); X} return(0); } X/* end of yylex */ Xint yyvstop[] ={ X0, X X14, X0, X X3, X14, X0, X X3, X14, X0, X X3, X14, X0, X X14, X0, X X3, X14, X0, X X5, X14, X-4, X0, X X3, X14, X0, X X3, X14, X0, X X6, X14, X0, X X3, X14, X0, X X3, X14, X0, X X3, X14, X0, X X13, X14, X0, X X13, X14, X0, SHAR_EOF echo "End of part 5" echo "File src/halstead/c_halsfilt_c is continued in part 6" echo "6" > 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.