home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume20 / metrics / part12 < prev    next >
Text File  |  1989-09-18  |  10KB  |  451 lines

  1. Subject:  v20i019:  Tools for generating software metrics, Part12/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 19
  8. Archive-name: metrics/part12
  9.  
  10. ---- Cut Here and unpack ----
  11. #!/bin/sh
  12. # this is part 12 of a multipart archive
  13. # do not concatenate these parts, unpack them in order with /bin/sh
  14. # file src/testfiles/test3.c continued
  15. #
  16. CurArch=12
  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/testfiles/test3.c"
  27. sed 's/^X//' << 'SHAR_EOF' >> src/testfiles/test3.c
  28. X    Bool    found = False;
  29. X
  30. X    /* find in data dictionary */
  31. X    for ( curr_dd = dd_base;
  32. X          curr_dd != FDNULL && !found;
  33. X          curr_dd = curr_dd->fd_next )
  34. X        if ( strcmp( curr_dd->fd_name, searchstr ) == 0 )
  35. X        {
  36. X            found = True;
  37. X            *p_ddrec = curr_dd;
  38. X        }
  39. X    return found;
  40. X}
  41. X
  42. X
  43. Xstruct fdesc *
  44. Xfirstdd( dd_base )
  45. X    struct fdesc    *dd_base;
  46. X{
  47. X    extern struct fdesc    *dd_current;
  48. X
  49. X    dd_current = dd_base;
  50. X    return dd_current;
  51. X}
  52. X
  53. Xstruct fdesc *
  54. Xnextdd()
  55. X{
  56. X    extern struct fdesc    *dd_current;
  57. X
  58. X    if ( dd_current != FDNULL)
  59. X        dd_current = dd_current->fd_next;
  60. X
  61. X    return dd_current;
  62. X}
  63. X
  64. X
  65. Xstruct fdesc *
  66. Xnewfd( p_next, name, num )
  67. X    struct fdesc    **p_next;
  68. X    char    *name;
  69. X    int    num;
  70. X{
  71. X    *p_next = (struct fdesc *) Malloc( sizeof( struct fdesc ) );
  72. X
  73. X    (*p_next)->fd_name = Malloc( strlen( name ) );
  74. X
  75. X    strcpy( (*p_next)->fd_name, name );
  76. X    (*p_next)->fd_fldno = num;
  77. X    (*p_next)->fd_next = FDNULL;
  78. X
  79. X    return *p_next;
  80. X}
  81. X
  82. X
  83. Xchar *
  84. Xbuildcmd( fl_base, fld_count )
  85. X    struct fdesc    *fl_base;
  86. X    int    fld_count;
  87. X{
  88. X    char    *cmdbuf;
  89. X    char    numbuf[6];
  90. X    struct fdesc    *curr_fl;
  91. X    int    idx;
  92. X
  93. X    cmdbuf = Malloc( 15 + ( 4 * fld_count ) );
  94. X    strcpy( cmdbuf, "awk '{print" );
  95. X    for ( idx = 1, curr_fl = fl_base;
  96. X          curr_fl != FDNULL;
  97. X          idx++, curr_fl = curr_fl->fd_next )
  98. X    {
  99. X
  100. X        if ( idx == fld_count )
  101. X            sprintf(numbuf, " $%d;", curr_fl->fd_fldno );
  102. X        else
  103. X            sprintf(numbuf, " $%d,", curr_fl->fd_fldno );
  104. X        strcat( cmdbuf, numbuf );
  105. X    }
  106. X    strcat( cmdbuf, "}'" );
  107. X
  108. X    return cmdbuf;
  109. X}
  110. X
  111. Xvoid
  112. Xdata_filter( fl_base, fld_count )
  113. X    struct fdesc    *fl_base;
  114. X    int    fld_count;
  115. X{
  116. X    char    *systemcmd;
  117. X    extern char    *Cmdname;
  118. X
  119. X    systemcmd = buildcmd( fl_base, fld_count );
  120. X    if ( system( systemcmd ) == 127 )
  121. X        fprintf( stderr, "%s: couldn't execute: %s\n",
  122. X                Cmdname, systemcmd);
  123. X}
  124. X
  125. X
  126. Xint
  127. Xbuild_outlist( p_fl_base, dd_base, ddname, exclude )
  128. X    struct fdesc    **p_fl_base;
  129. X    struct fdesc    *dd_base;
  130. X    char    *ddname;
  131. X    Bool    exclude;
  132. X{
  133. X    struct fdesc    *curr_fl, *curr_dd, *new_base, *new_fl;
  134. X    int    fld_count = 0;
  135. X    extern char    *Cmdname;
  136. X    Bool    found;
  137. X    
  138. X    if ( exclude )
  139. X    {
  140. X        /* need to rebuild arglist with unnamed dictionary fields */
  141. X        for ( curr_dd = firstdd( dd_base );
  142. X              curr_dd != FDNULL;
  143. X              curr_dd = nextdd() )
  144. X        {
  145. X            /* if current dd entry not in arglist, put in the
  146. X             * new output list
  147. X             */
  148. X            for ( curr_fl = *p_fl_base, found = False;
  149. X                  curr_fl != FDNULL & !found;
  150. X                  curr_fl = curr_fl->fd_next )
  151. X                if ( strcmp( curr_dd->fd_name, curr_fl->fd_name) == 0 )
  152. X                    found = True;
  153. X            if ( !found )
  154. X            {
  155. X                if ( new_base == FDNULL )
  156. X                    new_fl = newfd( &new_base,
  157. X                        curr_dd->fd_name, curr_dd->fd_fldno);
  158. X                else
  159. X                    new_fl = newfd( &(new_fl->fd_next),
  160. X                        curr_dd->fd_name, curr_dd->fd_fldno);
  161. X                fld_count++;
  162. X            }
  163. X        }
  164. X        *p_fl_base = new_base;
  165. X    }
  166. X    else
  167. X    {
  168. X        /* for each specified field, find it's field number in the dict */
  169. X        for ( curr_fl = *p_fl_base;
  170. X              curr_fl != FDNULL;
  171. X              curr_fl = curr_fl->fd_next )
  172. X        {
  173. X            if ( !finddd( &curr_dd, dd_base, curr_fl->fd_name ) )
  174. X            {
  175. X                fprintf(stderr,
  176. X                    "%s: field \"%s\" not found in %s\n",
  177. X                    Cmdname, curr_fl->fd_name, ddname );
  178. X                exit(1);
  179. X            }
  180. X            else
  181. X                curr_fl->fd_fldno = curr_dd->fd_fldno;
  182. X            fld_count++;
  183. X        }
  184. X    }
  185. X
  186. X#ifdef DEBUG
  187. X    for ( curr_fl = *p_fl_base; curr_fl != FDNULL; curr_fl = curr_fl->fd_next )
  188. X    {
  189. X        fprintf(stderr,
  190. X            "arglist entry: %s\t%d\n",
  191. X            curr_fl->fd_name, curr_fl->fd_fldno);
  192. X    }
  193. X#endif /* DEBUG */
  194. X    
  195. X    return fld_count;
  196. X}
  197. X
  198. Xchar *
  199. XMalloc( size )
  200. X    register int    size;
  201. X{
  202. X    register char *vast_tracts ;
  203. X    char    *malloc();
  204. X    extern char *    Cmdname;
  205. X
  206. X    if ( ! ( vast_tracts = malloc( size ) ) )
  207. X    {
  208. X        fprintf(stderr, "%s: unable to allocate more space\n", Cmdname);
  209. X        exit(1);
  210. X    }
  211. X    return( vast_tracts );
  212. X}
  213. SHAR_EOF
  214. echo "File src/testfiles/test3.c is complete"
  215. chmod 0644 src/testfiles/test3.c || echo "restore of src/testfiles/test3.c fails"
  216. echo "x - extracting src/utils/Makefile (Text)"
  217. sed 's/^X//' << 'SHAR_EOF' > src/utils/Makefile
  218. X# makefile for utilities used in halstead, mccabe
  219. X
  220. XBIN=../bin
  221. X
  222. XLDFLAGS=    
  223. X
  224. XCFLAGS=    -O
  225. X
  226. XPROGS=    stripcom stripstr
  227. X
  228. Xall:    $(PROGS)
  229. X
  230. Xstripcom:    stripcom.o argfiles.o
  231. X    $(CC) $(LDFLAGS) stripcom.o argfiles.o -o stripcom
  232. X
  233. Xstripstr:    stripstr.o 
  234. X    $(CC) $(LDFLAGS) stripstr.o -o stripstr
  235. X
  236. Xstripcom.o argfiles.o:    argfiles.h
  237. X
  238. Xstripcom.o: bdr.h
  239. X
  240. X
  241. Xinstall:    all
  242. X    mv stripcom $(BIN)/stripcom
  243. X    chmod 755 $(BIN)/stripcom
  244. X
  245. X    mv stripstr $(BIN)/stripstr
  246. X    chmod 755 $(BIN)/stripstr
  247. X
  248. Xclean:
  249. X    -rm -f $(PROGS) core *.o
  250. SHAR_EOF
  251. chmod 0644 src/utils/Makefile || echo "restore of src/utils/Makefile fails"
  252. echo "x - extracting src/utils/argfiles.c (Text)"
  253. sed 's/^X//' << 'SHAR_EOF' > src/utils/argfiles.c
  254. X/* strip comments from c program */
  255. X/* read from stdin, write to stdout */
  256. X#include <stdio.h>
  257. X#include "argfiles.h"
  258. X
  259. XFILE    *nextfp();
  260. Xint    filetype();
  261. X
  262. XFILE *
  263. Xnextfp( argc, argv, p_filetype)
  264. X    int    argc;
  265. X    char    *argv[];
  266. X    int    *p_filetype;
  267. X{
  268. X    /* looks through parameters trying to return next FILE * to next
  269. X     * specified file
  270. X     * passes back the filetype as a side effect
  271. X     */
  272. X    
  273. X    static Bool    first = True;
  274. X    static int    index = 1;
  275. X    static FILE    *result = FNULL;
  276. X    int    curr_index, temp_type;
  277. X
  278. X    temp_type = SYSERR;    /* default to ensure no accidental execution */
  279. X    
  280. X    if ( result != FNULL )
  281. X    {
  282. X        fclose( result );
  283. X        result = FNULL;
  284. X    }
  285. X    /* skip over any flags to this routine */
  286. X    while ( index < argc && *argv[index] == '-' )
  287. X        index++;
  288. X
  289. X    if ( index < argc )
  290. X    {
  291. X        if ( (result = fopen( argv[index], "r")) == NULL )
  292. X        {
  293. X            fprintf(stderr, "%s: unable to open %s for read\n",
  294. X                argv[0], argv[index]);
  295. X            exit(1);
  296. X        }
  297. X        curr_index = index++;
  298. X    }
  299. X    if ( first )
  300. X    {
  301. X        /* if no files specified, read from stdin */
  302. X        if ( result == FNULL )
  303. X            result = stdin;
  304. X        first = False;
  305. X    }
  306. X    if ( result != FNULL )
  307. X    {
  308. X        if ( result == stdin )
  309. X            temp_type = STDINP;
  310. X        else
  311. X            temp_type = filetype( argv[curr_index] );
  312. X    }
  313. X    *p_filetype = temp_type;
  314. X    return ( result );
  315. X}
  316. X
  317. Xint
  318. Xfiletype( filename )
  319. X    char    *filename;
  320. X{
  321. X    int    type;
  322. X    register int    len;
  323. X    register char    *suffix;
  324. X
  325. X    if ( !filename )
  326. X        type = SYSERR;
  327. X    else
  328. X    {
  329. X        /* find where the suffix starts */
  330. X        len = strlen(filename);
  331. X        suffix = filename + len - 1; /* end of string */
  332. X        while ( *suffix != '.' && suffix != filename )
  333. X            suffix--;
  334. X
  335. X        if ( suffix == filename )
  336. X        {
  337. X            if ( *filename == 'M' || *filename == 'm' )
  338. X            {
  339. X                if (strncmp(filename+1,"akefile",7)==0)
  340. X                    type = MAKEFILE;
  341. X                else
  342. X                    type = OTHER;
  343. X            }
  344. X        }
  345. X        else
  346. X        {
  347. X            /* if suffix is one char long, optimize by doing
  348. X             * switch on char, otherwise, have to do strcmp
  349. X             */
  350. X            if ( strlen(++suffix) == 1 )
  351. X            {
  352. X                switch ( *suffix )
  353. X                {
  354. X                case 'c':    /* a C file */
  355. X                    type = C;
  356. X                    break;
  357. X                case 'h':    /* a header file */
  358. X                    type = HEADER;
  359. X                    break;
  360. X                case 'y':    /* a yacc file */
  361. X                    type = YACC;
  362. X                    break;
  363. X                case 'p':    /* a pascal file */
  364. X                    type = PASCAL;
  365. X                    break;
  366. X                case 's':    /* an assembly file */
  367. X                    type = ASSEMBLY;
  368. X                    break;
  369. X                case 'm':    /* a Visual/Menu file */
  370. X                    type = VMENU;
  371. X                    break;
  372. X                default:
  373. X                    type = OTHER;
  374. X                    break;
  375. X                }
  376. X            }
  377. X            else
  378. X            {
  379. X                if ( strcmp(suffix, "sh") == 0 )
  380. X                    type = SHELL;
  381. X                else if (strcmp(suffix, "cob") == 0)
  382. X                    type = COBOL;
  383. X                else if (strcmp(suffix, "awk") == 0)
  384. X                    type = AWK;
  385. X                else
  386. X                    type = OTHER;
  387. X            }
  388. X        }
  389. X    }
  390. X    return type;
  391. X}
  392. SHAR_EOF
  393. chmod 0644 src/utils/argfiles.c || echo "restore of src/utils/argfiles.c fails"
  394. echo "x - extracting src/utils/argfiles.h (Text)"
  395. sed 's/^X//' << 'SHAR_EOF' > src/utils/argfiles.h
  396. X/* header file for programs using argfiles.o (nextfp) */
  397. X#include "bdr.h"
  398. X
  399. X/* file types */
  400. X#define SYSERR    -1
  401. X#define    OTHER    0
  402. X#define    C    1
  403. X#define PASCAL    2
  404. X#define    SHELL    3
  405. X#define STDINP    4
  406. X#define HEADER    5
  407. X#define YACC    6
  408. X#define ASSEMBLY 7
  409. X#define AWK    8
  410. X#define VMENU    9
  411. X#define COBOL    10
  412. X#define MAKEFILE 11
  413. SHAR_EOF
  414. chmod 0644 src/utils/argfiles.h || echo "restore of src/utils/argfiles.h fails"
  415. echo "x - extracting src/utils/bdr.h (Text)"
  416. sed 's/^X//' << 'SHAR_EOF' > src/utils/bdr.h
  417. X#ifndef BDR_H
  418. X#define BDR_H
  419. X
  420. Xtypedef char    Bool;
  421. X#define True 1
  422. X#define False 0
  423. X
  424. Xtypedef char    Status;
  425. X#define Error    0
  426. X#define Ok    1
  427. X
  428. Xtypedef    char    FileIO;        /* also uses Error and Ok */
  429. X#define End_File    2
  430. X
  431. X/* xxNULL retained for compatibility until some reasonable percentage of
  432. X * code is changed, but xx_NIL is now preferred usage for 'null' pointer
  433. X*/
  434. X#define CNULL    ( (char *) 0)
  435. X#define C_NIL    ( (char *) 0)
  436. X
  437. X#define FNULL    ( (FILE *) 0)
  438. X#define F_NIL    ( (FILE *) 0)
  439. X
  440. X#define CNTRL(X)    ('X' - 64)
  441. X#define Odd(X)    (X & 1)
  442. X
  443. X/* Global means used througout system,
  444. SHAR_EOF
  445. echo "End of part 12"
  446. echo "File src/utils/bdr.h is continued in part 13"
  447. echo "13" > s2_seq_.tmp
  448. exit 0
  449.  
  450.  
  451.