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

  1. Subject:  v20i020:  Tools for generating software metrics, Part13/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 20
  8. Archive-name: metrics/part13
  9.  
  10. ---- Cut Here and unpack ----
  11. #!/bin/sh
  12. # this is part 13 of a multipart archive
  13. # do not concatenate these parts, unpack them in order with /bin/sh
  14. # file src/utils/bdr.h continued
  15. #
  16. CurArch=13
  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/utils/bdr.h"
  27. sed 's/^X//' << 'SHAR_EOF' >> src/utils/bdr.h
  28. X * Local means it should be private to module */
  29. X#define Global    extern
  30. X#define Local    extern
  31. X
  32. X#endif /* BDR_H */
  33. SHAR_EOF
  34. echo "File src/utils/bdr.h is complete"
  35. chmod 0644 src/utils/bdr.h || echo "restore of src/utils/bdr.h fails"
  36. echo "x - extracting src/utils/stripcom.c (Text)"
  37. sed 's/^X//' << 'SHAR_EOF' > src/utils/stripcom.c
  38. X/* strip comments from c program */
  39. X/* read from stdin, write to stdout */
  40. X#include <stdio.h>
  41. X#include "bdr.h"
  42. X#include "argfiles.h"
  43. X
  44. X#define COMMENT 0
  45. X#define CODE 1
  46. X#define STRING 2
  47. X#define CHARSTR 3
  48. X
  49. Xvoid    cstrip();
  50. Xvoid    shstrip();
  51. Xvoid    poundstrip();
  52. Xvoid    vmenustrip();
  53. XFILE    *nextfp();
  54. X
  55. Xmain(argc, argv)
  56. X    int    argc;
  57. X    char    *argv[];
  58. X{
  59. X    FILE    *input;
  60. X    int    filetype;
  61. X
  62. X    while ( (input = nextfp(argc, argv, &filetype)) != FNULL )
  63. X    {
  64. X        switch ( filetype )
  65. X        {
  66. X        case HEADER:
  67. X            cstrip( input );
  68. X            break;
  69. X        case YACC:
  70. X            cstrip( input );
  71. X            break;
  72. X        case C:
  73. X            cstrip( input );
  74. X            break;
  75. X        case PASCAL:
  76. X            fprintf(stderr,
  77. X                "%s: does not support comment stripping for pascal programs\n",
  78. X                argv[0]);
  79. X            break;
  80. X        case SHELL:
  81. X            shstrip( input );
  82. X            break;
  83. X        case ASSEMBLY:
  84. X            fprintf(stderr,
  85. X                "%s: does not support comment stripping for assembly programs\n",
  86. X                argv[0]);
  87. X            break;
  88. X        case AWK:
  89. X            poundstrip( input );
  90. X            break;
  91. X        case VMENU:
  92. X            vmenustrip( input );
  93. X            break;
  94. X        case COBOL:
  95. X            fprintf(stderr,
  96. X                "%s: does not support comment stripping for Cobol programs\n",
  97. X                argv[0]);
  98. X            break;
  99. X        case MAKEFILE:
  100. X            poundstrip( input );
  101. X            break;
  102. X        case STDINP:
  103. X            cstrip( input );
  104. X            break;
  105. X        case OTHER:
  106. X            cstrip( input );
  107. X            break;
  108. X        default:
  109. X            fprintf(stderr,
  110. X                "%s: SYSTEM ERROR, bad filetype (%d)\n",
  111. X                filetype);
  112. X            break;
  113. X        }
  114. X    }
  115. X    exit(0);
  116. X}
  117. X
  118. Xvoid
  119. Xcstrip( fp )
  120. X    register FILE    *fp;
  121. X{
  122. X    register int    c;
  123. X    register int    state=CODE;
  124. X
  125. X    while ( (c = getc( fp )) != EOF )
  126. X    {
  127. X        if ( state != COMMENT && c == '\\' )
  128. X        {
  129. X            if ( (c = getc(fp)) != EOF )
  130. X            {
  131. X                if ( c == '\'' || c == '"' )
  132. X                {
  133. X                    putchar( '\\' );
  134. X                    putchar( c );
  135. X                    continue;
  136. X                }
  137. X                else
  138. X                    putchar( '\\' );
  139. X            }
  140. X            else
  141. X            {
  142. X                putchar( '\\' );
  143. X                break;
  144. X            }
  145. X        }
  146. X        if ( state == CODE )
  147. X        {
  148. X            if ( c == '/' )
  149. X            {
  150. X                if ( (c = getc(fp)) != EOF )
  151. X                {
  152. X                    if ( c == '*' )
  153. X                        state = COMMENT;
  154. X                    else
  155. X                    {
  156. X                        putchar( '/' );
  157. X                        ungetc( c, fp );
  158. X                    }
  159. X                }
  160. X                else
  161. X                {
  162. X                    putchar( '/' );
  163. X                    break;
  164. X                }
  165. X            }
  166. X            else if ( c == '"' )
  167. X            {
  168. X                state = STRING;
  169. X                putchar( c );
  170. X            }
  171. X            else if ( c == '\'' )
  172. X            {
  173. X                state = CHARSTR;
  174. X                putchar( c ) ;
  175. X            }
  176. X            else
  177. X                putchar( c );
  178. X        }
  179. X        else if ( state == STRING )
  180. X        {
  181. X            if ( c == '"' )
  182. X                state = CODE;
  183. X            putchar( c );
  184. X        }
  185. X        else if ( state == CHARSTR )
  186. X        {
  187. X            if ( c == '\'' )
  188. X                state = CODE;
  189. X            putchar( c );
  190. X        }
  191. X        else    /* state is comment */
  192. X        {
  193. X            if ( c == '*' )
  194. X            {
  195. X                if ( (c = getc(fp)) != EOF )
  196. X                {
  197. X                    if ( c == '/' )
  198. X                        state = CODE;
  199. X                    else
  200. X                        ungetc( c, fp );
  201. X                }
  202. X                else
  203. X                    break;
  204. X            }
  205. X        }
  206. X    }
  207. X}
  208. X
  209. Xvoid
  210. Xshstrip( fp )
  211. X    register FILE    *fp;
  212. X{
  213. X    /* strip comments in a shell file */
  214. X    /* ignores continuations on a : comment; to wit:
  215. X     * : this is an example of a\
  216. X     * continuation
  217. X     * also ignores a : not on first char of line
  218. X     */
  219. X
  220. X    register int    c;
  221. X    register int    state = CODE;
  222. X    Bool    first = True;
  223. X
  224. X
  225. X    while ( (c = getc( fp )) != EOF )
  226. X    {
  227. X        switch ( c )
  228. X        {
  229. X        case '#':
  230. X            if ( state == CODE )
  231. X                state = COMMENT;
  232. X            break;
  233. X        case ':':
  234. X            if ( first )
  235. X                state = COMMENT;
  236. X            break;
  237. X        case '\n':
  238. X            if ( (c = getc(fp)) != EOF )
  239. X            {
  240. X                if ( c == ':' )
  241. X                {
  242. X                    state = COMMENT;
  243. X                    putchar('\n');
  244. X                }
  245. X                else
  246. X                {
  247. X                    ungetc( c, fp );
  248. X                    state = CODE;
  249. X                    c = '\n';
  250. X                }
  251. X            }
  252. X            else
  253. X            {
  254. X                if ( state == COMMENT )
  255. X                    putchar( '\n' );
  256. X                else
  257. X                    c = '\n';
  258. X            }
  259. X            break;
  260. X        case '\\':
  261. X            /* things like \# do not start comments */
  262. X            if ( (c = getc(fp)) != EOF )
  263. X            {
  264. X                if ( c != '#' )
  265. X                {
  266. X                    ungetc( c, fp );
  267. X                    c = '\\';
  268. X                }
  269. X                else
  270. X                    putchar( '\\' );
  271. X            }
  272. X            break;
  273. X        case '"':
  274. X            if ( state == STRING )
  275. X                state = CODE;
  276. X            else if ( state == CODE )
  277. X                state = STRING;
  278. X            /* if it is in a comment, just ignore it */
  279. X            break;
  280. X        case '\'':
  281. X            if ( state == CHARSTR )
  282. X                state = CODE;
  283. X            else if ( state == CODE )
  284. X                state = CHARSTR;
  285. X            /* if it is in a comment, just ignore it */
  286. X            break;
  287. X        default:
  288. X            break;
  289. X        }
  290. X        if ( state != COMMENT )
  291. X            putchar( c );
  292. X        first = False;
  293. X    }
  294. X}
  295. X
  296. Xvoid
  297. Xpoundstrip( fp )
  298. X    register FILE    *fp;
  299. X{
  300. X    /* strip of the form # ...comment... <NEWLINE> */
  301. X
  302. X    register int    c;
  303. X    register int    state = CODE;
  304. X    int    old_state;
  305. X
  306. X    while ( (c = getc( fp )) != EOF )
  307. X    {
  308. X        if ( c == '#' && state == CODE )
  309. X            state = COMMENT;
  310. X        else if ( c == '\n' )
  311. X            state = CODE;
  312. X        else if ( c == '\\' )
  313. X        {
  314. X            /* things like \# do not start comments */
  315. X            if ( (c = getc(fp)) != EOF )
  316. X            {
  317. X                if ( c != '#' )
  318. X                    ungetc( c, fp );
  319. X                else
  320. X                    putchar( '\\' );
  321. X            }
  322. X            else
  323. X                break;
  324. X        }
  325. X        else if ( c == '"' )
  326. X        {
  327. X            if ( state == STRING )
  328. X                state = CODE;
  329. X            else if ( state == CODE )
  330. X                state = STRING;
  331. X            /* if it is in a comment, just ignore it */
  332. X        }
  333. X        else if ( c == '\'' )
  334. X        {
  335. X            if ( state == CHARSTR )
  336. X                state = CODE;
  337. X            else if ( state == CODE )
  338. X                state = CHARSTR;
  339. X            /* if it is in a comment, just ignore it */
  340. X        }
  341. X        if ( state != COMMENT )
  342. X            putchar( c );
  343. X    }
  344. X}
  345. X
  346. Xvoid
  347. Xvmenustrip( fp )
  348. X    register FILE    *fp;
  349. X{
  350. X    register int    c;
  351. X    /* this is real easy now, visual has no comments */
  352. X
  353. X    while ( (c = getc( fp )) != EOF )
  354. X        putchar( c );
  355. X}
  356. SHAR_EOF
  357. chmod 0644 src/utils/stripcom.c || echo "restore of src/utils/stripcom.c fails"
  358. echo "x - extracting src/utils/stripstr.c (Text)"
  359. sed 's/^X//' << 'SHAR_EOF' > src/utils/stripstr.c
  360. X/* remove strings from input - where a string is anything 
  361. X * between (and including) two quotes (")
  362. X */
  363. X#include <stdio.h>
  364. X
  365. X
  366. Xtypedef char    Bool;
  367. X#define True    1
  368. X#define False    0
  369. X
  370. Xtypedef int    State;
  371. X#define    Not_String    0
  372. X#define String    1
  373. X#define Escape    2
  374. X#define Prime    3
  375. X
  376. X#define FNULL    ( (FILE *) 0)
  377. X#define CNULL    ( (char *) 0)
  378. X
  379. X#ifdef DEBUG
  380. X#define transstate(X,Y)  printf("[%d to %d]", X, Y)
  381. X#else
  382. X#define transstate(X,Y)
  383. X#endif /* DEBUG */
  384. X
  385. Xint
  386. Xmain(argc, argv)
  387. X    int    argc;
  388. X    char    *argv[];
  389. X{
  390. X    register int    input;
  391. X    register State    statevar;
  392. X    register FILE    *fp;
  393. X    State    laststate;
  394. X    char    *filename;
  395. X    Bool    long_prime=False;    /* where many chars between primes */
  396. X    Bool    inprime=False;    /* true if processing a "prime string" */
  397. X
  398. X    FILE    *nextfp();
  399. X
  400. X    while ( (fp = nextfp(argc, argv, &filename)) != FNULL )
  401. X    {
  402. X
  403. X        statevar = laststate = Not_String;
  404. X        while ( (input = getc(fp)) != EOF )
  405. X        {
  406. X            switch ( statevar )
  407. X            {
  408. X            case Not_String:
  409. X                if ( input == '"' )
  410. X                {
  411. X                    transstate(statevar, String);
  412. X                    statevar = String;
  413. X                }
  414. X                else 
  415. X                {
  416. X                    if ( input == '\\' )
  417. X                    {
  418. X                        laststate = statevar;
  419. X                        statevar = Escape;
  420. X                        transstate(laststate, statevar);
  421. X                    }
  422. X                    else if ( input == '\'' )
  423. X                    {
  424. X                        /* if it is a long prime string
  425. X                         * just dump the prime and
  426. X                         * continue
  427. X                         */
  428. X                        if ( !long_prime )
  429. X                        {
  430. X                            laststate = statevar;
  431. X                            statevar = Prime;
  432. X                            transstate(laststate, statevar);
  433. X                        }
  434. X                        long_prime = False;
  435. X                    }
  436. X                    putchar( input );
  437. X                }
  438. X                break;
  439. X            case String:
  440. X                if ( input == '"' )
  441. X                {
  442. X                    transstate( statevar, Not_String );
  443. X                    statevar = Not_String;
  444. X                }
  445. X                else if ( input == '\\' )
  446. X                {
  447. X                    laststate = statevar;
  448. X                    statevar = Escape;
  449. X                    transstate(laststate, statevar);
  450. X                }
  451. X                break;
  452. X            case Escape:    /* collapses two states, so use */
  453. X                    /* laststate variable */
  454. X                if ( laststate != String )
  455. X                    putchar( input );
  456. X                transstate(statevar, laststate);
  457. X                statevar = laststate;
  458. X                break;
  459. X            case Prime:
  460. X                putchar( input );
  461. X                if ( input == '\\' )
  462. X                {
  463. X                    laststate = statevar;
  464. X                    statevar = Escape;
  465. X                    transstate(Prime, Escape);
  466. X                    inprime = True;
  467. X                }
  468. X                else
  469. X                {
  470. X                    if ( inprime )
  471. X                    {
  472. X                        if ( input == '\'' )
  473. X                            long_prime = False;
  474. X                        else
  475. X                            long_prime = True;
  476. X                        statevar = Not_String;
  477. X                        transstate( Prime, Not_String );
  478. X                        inprime = False;
  479. X                    }
  480. X                    else
  481. X                        inprime = True;
  482. X                }
  483. X                break;
  484. X            default:
  485. X                fprintf(stderr,
  486. X                    "%s: PROGRAM ERROR: state %d used but not defined; (file %s)\n",
  487. X                    argv[0], statevar, filename);
  488. X                exit(1);
  489. X                break;
  490. X            }
  491. X        }
  492. X    }
  493. SHAR_EOF
  494. echo "End of part 13"
  495. echo "File src/utils/stripstr.c is continued in part 14"
  496. echo "14" > s2_seq_.tmp
  497. exit 0
  498.  
  499.  
  500.