home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume20 / metrics / part05 < prev    next >
Encoding:
Internet Message Format  |  1989-09-18  |  9.3 KB

  1. Subject:  v20i012:  Tools for generating software metrics, Part05/14
  2. Newsgroups: comp.sources.unix
  3. Sender: sources
  4. Approved: rsalz@uunet.UU.NET
  5.  
  6. Submitted-by: Brian Renaud <huron.ann-arbor.mi.us!bdr>
  7. Posting-number: Volume 20, Issue 12
  8. Archive-name: metrics/part05
  9.  
  10. ---- Cut Here and unpack ----
  11. #!/bin/sh
  12. # this is part 5 of a multipart archive
  13. # do not concatenate these parts, unpack them in order with /bin/sh
  14. # file src/control/proj_stats continued
  15. #
  16. CurArch=5
  17. if test ! -r s2_seq_.tmp
  18. then echo "Please unpack part 1 first!"
  19.      exit 1; fi
  20. ( read Scheck
  21.   if test "$Scheck" != $CurArch
  22.   then echo "Please unpack part $Scheck next!"
  23.        exit 1;
  24.   else exit 0; fi
  25. ) < s2_seq_.tmp || exit 1
  26. echo "x - Continuing file src/control/proj_stats"
  27. sed 's/^X//' << 'SHAR_EOF' >> src/control/proj_stats
  28. X#  -files <filename>       - <filename> is name of a file containing a line
  29. X#                            for every directory of code to be analyzed.  Each
  30. X#                            line is of the form:
  31. X#
  32. X#                                 dirname filelist sccsdir sccsfiles
  33. X#
  34. X#                             dirname is the name of a directory containing code
  35. X#                             filelist is a pattern which describes source code
  36. X#                             sccsdir is where this source is sccs'ed
  37. X#                             sccsfiles is a pattern which describes the sccs
  38. X#                               files
  39. X# 
  40. X# an example line from <filename> is:
  41. X# /usr/pascal/src/compiler *.[cy] /usr/pascal/sccs/compiler s.*.[cy]
  42. X
  43. Xsourcebase=`pwd`
  44. Xgottarget=0
  45. Xgotfiles=0
  46. X
  47. Xwhile [ $# -gt 0 ]
  48. Xdo
  49. X    case $1 in
  50. X    -sourcebase)
  51. X        sourcebase=$2
  52. X        shift ;;
  53. X    -target)
  54. X        gottarget=1
  55. X        target=$2
  56. X        shift ;;
  57. X    -files)
  58. X        gotfiles=1
  59. X        filespec=$2
  60. X        shift ;;
  61. X    *)
  62. X        echo "usage: $0 -target <directory> -files <filename> [-sourcebase <directory>]"
  63. X        exit 1
  64. X    esac
  65. X    shift
  66. Xdone
  67. X
  68. Xbase=`pwd`
  69. Xcd $sourcebase
  70. X
  71. X# where we find the directories and file specs
  72. Xif [ $gotfiles -ne 1 ]
  73. Xthen
  74. X    echo "usage: $0 -target <directory> -files <filename> [-sourcebase <directory>]"
  75. X    exit 1
  76. Xfi
  77. Xthen
  78. X
  79. X
  80. X# temporary log for statistics for each directory
  81. Xroutine=$base/@routine_defs
  82. Xfile=$base/@file_defs
  83. X
  84. X# empty out the target statistics fiels
  85. X>$target/@file_defs
  86. X>$target/@routine_defs
  87. X
  88. Xexec < $filespec
  89. X
  90. Xwhile read dirname filelist sccsdir sccsfiles
  91. Xdo
  92. X    echo gathering stats in $dirname file types "$filelist"
  93. X    gather_stats -file $file -routine $routine \
  94. X            -source $dirname "$filelist" -sccs $sccsdir "$sccsfiles"
  95. X    if [ $? != 0 ]
  96. X    then
  97. X        echo "unable to gather statistics on the $dirname directory"
  98. X        exit 1
  99. X    fi
  100. X    sed "s@^@$dirname/@" < $file >> $target/@file_defs
  101. X    sed "s@^@$dirname/@" < $routine >> $target/@routine_defs
  102. Xdone
  103. SHAR_EOF
  104. echo "File src/control/proj_stats is complete"
  105. chmod 0754 src/control/proj_stats || echo "restore of src/control/proj_stats fails"
  106. echo "x - extracting src/halstead/Makefile (Text)"
  107. sed 's/^X//' << 'SHAR_EOF' > src/halstead/Makefile
  108. X# makefile for halstead utilities
  109. X
  110. XBIN=../bin
  111. XTEST=../testfiles
  112. X
  113. X#LDFLAGS=    -i -s
  114. XLDFLAGS=
  115. X
  116. XCFLAGS=    -O
  117. X
  118. XPROGS= halstead c_halsfilt
  119. X
  120. Xall:     $(PROGS)
  121. X    
  122. X
  123. Xhalstead:    halstead.sh
  124. X    cp halstead.sh halstead
  125. X    chmod u+x halstead
  126. X
  127. X# if you have lex problems, "cp c_halsfilt_c c_halsfilt.c"
  128. Xc_halsfilt:    c_halsfilt.l
  129. X    $(LEX) c_halsfilt.l
  130. X    mv lex.yy.c c_halsfilt.c
  131. X    $(CC) $(LDFLAGS) c_halsfilt.c -o c_halsfilt -ll
  132. X
  133. X
  134. Xinstall:    all
  135. X    mv halstead $(BIN)/halstead
  136. X    chmod 755 $(BIN)/halstead
  137. X
  138. X    mv c_halsfilt $(BIN)/c_halsfilt
  139. X    chmod 755 $(BIN)/c_halsfilt
  140. X
  141. Xclean:
  142. X    -rm -f $(PROGS)  core  *.o c_halsfilt.c _test
  143. X    
  144. Xtest:
  145. X    @echo results of this command should be the same as test.result
  146. X    @echo see halstead/README for systems with known differences
  147. X    @cp $(TEST)/test1.c $(TEST)/test2.y $(TEST)/test3.c .
  148. X    halstead test1.c test2.y test3.c > _test
  149. X    diff _test test.result
  150. X    @/bin/rm -f test1.c test2.y test3.c
  151. SHAR_EOF
  152. chmod 0644 src/halstead/Makefile || echo "restore of src/halstead/Makefile fails"
  153. echo "x - extracting src/halstead/c_halsfilt.l (Text)"
  154. sed 's/^X//' << 'SHAR_EOF' > src/halstead/c_halsfilt.l
  155. X/* this lex routine breaks up C programs into operators and operands    */
  156. X/* operands go to stdout, operators go to stderr            */
  157. X/* distinction is based on my reading of various articles and K&R    */
  158. X/* this routine expects comments and strings to be stripped before    */
  159. X%%
  160. X(\'.\'|\'\\.\'|\'\\[0-9]+\') {
  161. X            /* character constants go to operand output */
  162. X            printf(" %s ", yytext);
  163. X            }
  164. X
  165. X(\-\>|\+\+|\-\-|\<\<|\>\>|\<\=|\>\=|\=\=|\!\=|\&\&|\|\||[+*/%\-]\=)    {
  166. X            /* print 2 character symbols to operator output */
  167. X            fprintf(stderr,"%s\n", yytext);
  168. X            putchar(' ');
  169. X             }
  170. X
  171. X[\.\(\)\[\]\!\~\&\+\/\%\<\>\&\^\|\?\=\,\-] {
  172. X            /* print most 1 char symbols to operator output */
  173. X            fprintf(stderr,"%s\n", yytext);
  174. X            putchar(' ');
  175. X            }
  176. X
  177. X\*/[^ \t\n0-9]        {
  178. X            /* print indirection operator to operator output */
  179. X            fprintf(stderr,"*indirection\n");
  180. X            putchar(' ');
  181. X            }
  182. X
  183. X\*            {
  184. X            /* multiplication operator */
  185. X            fprintf(stderr,"%s\n", yytext);
  186. X            putchar(' ');
  187. X            }
  188. X
  189. X[\:\;\{\}]        {
  190. X            /* delete delimiters */
  191. X            /* NOTE - prints to stdout, unlike above */
  192. X            putchar(' ');
  193. X            }
  194. X
  195. Xsizeof/([ \t\(]|$)    {
  196. X            /* sizeof operator to operator output */
  197. X            fprintf(stderr, "sizeof\n" );
  198. X            putchar(' ');
  199. X            }
  200. X
  201. X^#[a-z]+/[ \t\n]    {
  202. X            /* preprocessor operators to operator output */
  203. X            fprintf(stderr, "%s\n", yytext);
  204. X            putchar(' ');
  205. X            }
  206. X
  207. X(if|else|while|do|for|switch|case|default|break|continue|return|goto|case)/[:; \t\(\n] {
  208. X            /* statements */
  209. X            fprintf(stderr, "%s\n", yytext);
  210. X            putchar(' ');
  211. X            }
  212. X
  213. X(auto|static|extern|register|typedef)/[ \t\(\n] {
  214. X            /* storage class specifiers */
  215. X            fprintf(stderr, "%s\n", yytext);
  216. X            putchar(' ');
  217. X            }
  218. X
  219. X(char|short|int|long|unsigned|float|double)/[ \t\(\)\n] {
  220. X            /* type specifier */
  221. X            fprintf(stderr, "%s\n", yytext);
  222. X            putchar(' ');
  223. X            }
  224. X
  225. X(struct|union)/[ \t\(\n]        {
  226. X            /* struct or union specifier */
  227. X            fprintf(stderr, "%s\n", yytext);
  228. X            putchar(' ');
  229. X            }
  230. X
  231. X[a-zA-Z_][a-zA-Z0-9_]*    {
  232. X            /* catch operand names */
  233. X            printf(" %s ", yytext);
  234. X            }
  235. X
  236. X.            ECHO;
  237. X%%
  238. SHAR_EOF
  239. chmod 0644 src/halstead/c_halsfilt.l || echo "restore of src/halstead/c_halsfilt.l fails"
  240. echo "x - extracting src/halstead/c_halsfilt_c (Text)"
  241. sed 's/^X//' << 'SHAR_EOF' > src/halstead/c_halsfilt_c
  242. X# include "stdio.h"
  243. X# define U(x) x
  244. X# define NLSTATE yyprevious=YYNEWLINE
  245. X# define BEGIN yybgin = yysvec + 1 +
  246. X# define INITIAL 0
  247. X# define YYLERR yysvec
  248. X# define YYSTATE (yyestate-yysvec-1)
  249. X# define YYOPTIM 1
  250. X# define YYLMAX 200
  251. X# define output(c) putc(c,yyout)
  252. X# define input() (((yytchar=yysptr>yysbuf?U(*--yysptr):getc(yyin))==10?(yylineno++,yytchar):yytchar)==EOF?0:yytchar)
  253. X# define unput(c) {yytchar= (c);if(yytchar=='\n')yylineno--;*yysptr++=yytchar;}
  254. X# define yymore() (yymorfg=1)
  255. X# define ECHO fprintf(yyout, "%s",yytext)
  256. X# define REJECT { nstr = yyreject(); goto yyfussy;}
  257. Xint yyleng; extern char yytext[];
  258. Xint yymorfg;
  259. Xextern char *yysptr, yysbuf[];
  260. Xint yytchar;
  261. XFILE *yyin ={stdin}, *yyout ={stdout};
  262. Xextern int yylineno;
  263. Xstruct yysvf { 
  264. X    struct yywork *yystoff;
  265. X    struct yysvf *yyother;
  266. X    int *yystops;};
  267. Xstruct yysvf *yyestate;
  268. Xextern struct yysvf yysvec[], *yybgin;
  269. X# define YYNEWLINE 10
  270. Xyylex(){
  271. Xint nstr; extern int yyprevious;
  272. Xwhile((nstr = yylook()) >= 0)
  273. Xyyfussy: switch(nstr){
  274. Xcase 0:
  275. Xif(yywrap()) return(0); break;
  276. Xcase 1:
  277. X{
  278. X            /* character constants go to operand output */
  279. X            printf(" %s ", yytext);
  280. X            }
  281. Xbreak;
  282. Xcase 2:
  283. X{
  284. X            /* print 2 character symbols to operator output */
  285. X            fprintf(stderr,"%s\n", yytext);
  286. X            putchar(' ');
  287. X             }
  288. Xbreak;
  289. Xcase 3:
  290. X{
  291. X            /* print most 1 char symbols to operator output */
  292. X            fprintf(stderr,"%s\n", yytext);
  293. X            putchar(' ');
  294. X            }
  295. Xbreak;
  296. Xcase 4:
  297. X    {
  298. X            /* print indirection operator to operator output */
  299. X            fprintf(stderr,"*indirection\n");
  300. X            putchar(' ');
  301. X            }
  302. Xbreak;
  303. Xcase 5:
  304. X        {
  305. X            /* multiplication operator */
  306. X            fprintf(stderr,"%s\n", yytext);
  307. X            putchar(' ');
  308. X            }
  309. Xbreak;
  310. Xcase 6:
  311. X    {
  312. X            /* delete delimiters */
  313. X            /* NOTE - prints to stdout, unlike above */
  314. X            putchar(' ');
  315. X            }
  316. Xbreak;
  317. Xcase 7:
  318. X{
  319. X            /* sizeof operator to operator output */
  320. X            fprintf(stderr, "sizeof\n" );
  321. X            putchar(' ');
  322. X            }
  323. Xbreak;
  324. Xcase 8:
  325. X{
  326. X            /* preprocessor operators to operator output */
  327. X            fprintf(stderr, "%s\n", yytext);
  328. X            putchar(' ');
  329. X            }
  330. Xbreak;
  331. Xcase 9:
  332. X{
  333. X            /* statements */
  334. X            fprintf(stderr, "%s\n", yytext);
  335. X            putchar(' ');
  336. X            }
  337. Xbreak;
  338. Xcase 10:
  339. X{
  340. X            /* storage class specifiers */
  341. X            fprintf(stderr, "%s\n", yytext);
  342. X            putchar(' ');
  343. X            }
  344. Xbreak;
  345. Xcase 11:
  346. X{
  347. X            /* type specifier */
  348. X            fprintf(stderr, "%s\n", yytext);
  349. X            putchar(' ');
  350. X            }
  351. Xbreak;
  352. Xcase 12:
  353. X    {
  354. X            /* struct or union specifier */
  355. X            fprintf(stderr, "%s\n", yytext);
  356. X            putchar(' ');
  357. X            }
  358. Xbreak;
  359. Xcase 13:
  360. X{
  361. X            /* catch operand names */
  362. X            printf(" %s ", yytext);
  363. X            }
  364. Xbreak;
  365. Xcase 14:
  366. X        ECHO;
  367. Xbreak;
  368. Xcase -1:
  369. Xbreak;
  370. Xdefault:
  371. Xfprintf(yyout,"bad switch yylook %d",nstr);
  372. X} return(0); }
  373. X/* end of yylex */
  374. Xint yyvstop[] ={
  375. X0,
  376. X
  377. X14,
  378. X0,
  379. X
  380. X3,
  381. X14,
  382. X0,
  383. X
  384. X3,
  385. X14,
  386. X0,
  387. X
  388. X3,
  389. X14,
  390. X0,
  391. X
  392. X14,
  393. X0,
  394. X
  395. X3,
  396. X14,
  397. X0,
  398. X
  399. X5,
  400. X14,
  401. X-4,
  402. X0,
  403. X
  404. X3,
  405. X14,
  406. X0,
  407. X
  408. X3,
  409. X14,
  410. X0,
  411. X
  412. X6,
  413. X14,
  414. X0,
  415. X
  416. X3,
  417. X14,
  418. X0,
  419. X
  420. X3,
  421. X14,
  422. X0,
  423. X
  424. X3,
  425. X14,
  426. X0,
  427. X
  428. X13,
  429. X14,
  430. X0,
  431. X
  432. X13,
  433. X14,
  434. X0,
  435. SHAR_EOF
  436. echo "End of part 5"
  437. echo "File src/halstead/c_halsfilt_c is continued in part 6"
  438. echo "6" > s2_seq_.tmp
  439. exit 0
  440.  
  441.  
  442.