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

  1. Subject:  v20i018:  Tools for generating software metrics, Part11/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 18
  8. Archive-name: metrics/part11
  9.  
  10. ---- Cut Here and unpack ----
  11. #!/bin/sh
  12. # this is part 11 of a multipart archive
  13. # do not concatenate these parts, unpack them in order with /bin/sh
  14. # file src/testfiles/test2.y continued
  15. #
  16. CurArch=11
  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/test2.y"
  27. sed 's/^X//' << 'SHAR_EOF' >> src/testfiles/test2.y
  28. X%token DECLARE CAST INTO AS HELP EXPLAIN
  29. X%token FUNCTION RETURNING POINTER TO ARRAY OF
  30. X%token <dynstr> NAME NUMBER STRUCTUNION UNSIGNED LONG SHORT
  31. X%token <dynstr> INT CHAR FLOAT DOUBLE
  32. X%type <dynstr> mod_list tname type modifier
  33. X%type <dynstr> cdecl cdecl1 cdims adims c_type
  34. X%type <halves> adecl
  35. X
  36. X%start prog
  37. X
  38. X%%
  39. Xprog    : /* empty */
  40. X        | prog stat
  41. X        ;
  42. X
  43. Xstat    : HELP '\n'
  44. X            {
  45. X            help();
  46. X            }
  47. X        | DECLARE NAME AS adecl '\n'
  48. X            {
  49. X            printf("%s %s%s%s",savedtype,$4.left,$2,$4.right);
  50. X#ifdef MKPROGRAM
  51. X            if (prev == 'f')
  52. X                printf("\n{\n}\n");
  53. X            else
  54. X                printf(";\n");
  55. X#else
  56. X            printf("\n");
  57. X#endif
  58. X            free($4.left);
  59. X            free($4.right);
  60. X            free($2);
  61. X            }
  62. X        | CAST NAME INTO adecl '\n'
  63. X            {
  64. X            if (prev == 'f')
  65. X                unsupp("Cast into function");
  66. X            else if (prev=='A' || prev=='a')
  67. X                unsupp("Cast into array");
  68. X            printf("(%s",savedtype);
  69. X            if (strlen($4.left)+strlen($4.right))
  70. X                printf(" %s%s",$4.left,$4.right);
  71. X            printf(")%s\n",$2);
  72. X            free($4.left);
  73. X            free($4.right);
  74. X            free($2);
  75. X            }
  76. X        | EXPLAIN type cdecl '\n'
  77. X            { printf("declare %s as %s%s\n",savedname,$3,$2); }
  78. X        | '\n'
  79. X        | error '\n'
  80. X            {
  81. X            yyerrok;
  82. X            }
  83. X        ;
  84. X
  85. Xcdecl    : cdecl1
  86. X        | '*' cdecl
  87. X            { $$ = cat($2,ds("pointer to "),NULL); }
  88. X        ;
  89. X
  90. Xcdecl1    : cdecl1 '(' ')'
  91. X            { $$ = cat($1,ds("function returning "),NULL); }
  92. X        | cdecl1 cdims
  93. X            { $$ = cat($1,ds("array "),$2); }
  94. X        | '(' cdecl ')'
  95. X            { $$ = $2; }
  96. X        | NAME
  97. X            {
  98. X                savename($1);
  99. X                $$ = ds("");
  100. X            }
  101. X        ;
  102. X
  103. Xcdims    : '[' ']'
  104. X            { $$ = ds("of "); }
  105. X        | '[' NUMBER ']'
  106. X            { $$ = cat($2,ds(" of "),NULL); }
  107. X        ;
  108. X
  109. Xadecl    : FUNCTION RETURNING adecl
  110. X            {
  111. X            if (prev == 'f')
  112. X                unsupp("Function returning function");
  113. X            else if (prev=='A' || prev=='a')
  114. X                unsupp("Function returning array");
  115. X            $$.left = $3.left;
  116. X            $$.right = cat(ds("()"),$3.right,NULL);
  117. X            prev = 'f';
  118. X            }
  119. X        | FUNCTION '(' NAME ')' RETURNING adecl
  120. X            {
  121. X            if (prev == 'f')
  122. X                unsupp("Function returning function");
  123. X            else if (prev=='A' || prev=='a')
  124. X                unsupp("Function returning array");
  125. X            $$.left = $6.left;
  126. X            $$.right = cat(ds("("),$3,ds(")"));
  127. X            $$.right = cat($$.right,$6.right,NULL);
  128. X            prev = 'f';
  129. X            }
  130. X        | ARRAY adims OF adecl
  131. X            {
  132. X            if (prev == 'f')
  133. X                unsupp("Array of function");
  134. X            else if (prev == 'a')
  135. X                unsupp("Inner array of unspecified size");
  136. X            if (arbdims)
  137. X                prev = 'a';
  138. X            else
  139. X                prev = 'A';
  140. X            $$.left = $4.left;
  141. X            $$.right = cat($2,$4.right,NULL);
  142. X            }
  143. X        | POINTER TO adecl
  144. X            {
  145. X            if (prev == 'a')
  146. X                unsupp("Pointer to array of unspecified dimension");
  147. X            if (prev=='a' || prev=='A' || prev=='f') {
  148. X                $$.left = cat($3.left,ds("(*"),NULL);
  149. X                $$.right = cat(ds(")"),$3.right,NULL);
  150. X            } else {
  151. X                $$.left = cat($3.left,ds("*"),NULL);
  152. X                $$.right = $3.right;
  153. X            }
  154. X            prev = 'p';
  155. X            }
  156. X        | type
  157. X            {
  158. X            savetype($1);
  159. X            $$.left = ds("");
  160. X            $$.right = ds("");
  161. X            prev = 't';
  162. X            }
  163. X        ;
  164. X
  165. Xadims    : /* empty */
  166. X            {
  167. X            arbdims = 1;
  168. X            $$ = ds("[]");
  169. X            }
  170. X        | NUMBER
  171. X            {
  172. X            arbdims = 0;
  173. X            $$ = cat(ds("["),$1,ds("]"));
  174. X            }
  175. X        ;
  176. X
  177. Xtype    : tinit c_type
  178. X            { mbcheck(); $$ = $2; }
  179. X        ;
  180. X
  181. Xtinit    : /* empty */
  182. X            { modbits = 0; }
  183. X        ;
  184. X
  185. Xc_type    : mod_list
  186. X            { $$ = $1; }
  187. X        | tname
  188. X            { $$ = $1; }
  189. X        | mod_list tname
  190. X            { $$ = cat($1,ds(" "),$2); }
  191. X        | STRUCTUNION NAME
  192. X            { $$ = cat($1,ds(" "),$2); }
  193. X        ;
  194. X
  195. Xtname    : INT
  196. X            { modbits |= MB_INT; $$ = $1; }
  197. X        | CHAR
  198. X            { modbits |= MB_CHAR; $$ = $1; }
  199. X        | FLOAT
  200. X            { modbits |= MB_FLOAT; $$ = $1; }
  201. X        | DOUBLE
  202. X            { modbits |= MB_DOUBLE; $$ = $1; }
  203. X        ;
  204. X
  205. Xmod_list: modifier
  206. X            { $$ = $1; }
  207. X        | mod_list modifier
  208. X            { $$ = cat($1,ds(" "),$2); }
  209. X        ;
  210. X
  211. Xmodifier: UNSIGNED
  212. X            { modbits |= MB_UNSIGNED; $$ = $1; }
  213. X        | LONG
  214. X            { modbits |= MB_LONG; $$ = $1; }
  215. X        | SHORT
  216. X            { modbits |= MB_SHORT; $$ = $1; }
  217. X        ;
  218. X%%
  219. X#include "cdlex.c"
  220. X
  221. X#define LORS    (MB_LONG|MB_SHORT)
  222. X#define UORL    (MB_UNSIGNED|MB_LONG)
  223. X#define UORS    (MB_UNSIGNED|MB_SHORT)
  224. X#define CORL    (MB_CHAR|MB_LONG)
  225. X#define CORS    (MB_CHAR|MB_SHORT)
  226. X#define CORU    (MB_CHAR|MB_UNSIGNED)
  227. X
  228. Xmbcheck()
  229. X{
  230. X    if ((modbits&LORS) == LORS)
  231. X        unsupp("conflicting 'short' and 'long'");
  232. X    if ((modbits&UORL) == UORL)
  233. X        unport("unsigned with long");
  234. X    if ((modbits&UORS) == UORS)
  235. X        unport("unsigned with short");
  236. X    if ((modbits&CORL) == CORL)
  237. X        unsupp("long char");
  238. X    if ((modbits&CORS) == CORS)
  239. X        unsupp("short char");
  240. X    if ((modbits&CORU) == CORU)
  241. X        unport("unsigned char");
  242. X}
  243. X
  244. Xsavetype(s)
  245. Xchar *s;
  246. X{
  247. X    savedtype = s;
  248. X}
  249. X
  250. Xsavename(s)
  251. Xchar *s;
  252. X{
  253. X    savedname = s;
  254. X}
  255. SHAR_EOF
  256. echo "File src/testfiles/test2.y is complete"
  257. chmod 0644 src/testfiles/test2.y || echo "restore of src/testfiles/test2.y fails"
  258. echo "x - extracting src/testfiles/test3.c (Text)"
  259. sed 's/^X//' << 'SHAR_EOF' > src/testfiles/test3.c
  260. X/* build a new stat data file based on data dictionary entries */
  261. X
  262. X#include <stdio.h>
  263. X
  264. Xstruct fdesc                 /* description of field */
  265. X{
  266. X    char    *fd_name;        /* name of field */
  267. X    int    fd_fldno;        /* field number in source file */
  268. X    struct fdesc    *fd_next;    /* next entry */
  269. X};
  270. X#define FDNULL ((struct fdesc *) 0)
  271. Xstruct fdesc    *newfd();
  272. X
  273. Xtypedef char Bool;
  274. X#define True    1
  275. X#define False    0
  276. X
  277. X#define CNULL ((char *) 0)
  278. X#define FNULL ((FILE *) 0)
  279. X
  280. XBool    argcheck();
  281. Xchar    *buildcmd();
  282. Xvoid    data_filter();
  283. Xint    build_outlist();
  284. XBool    loaddd();
  285. Xchar    *Malloc();
  286. X
  287. Xchar    *Cmdname;
  288. Xstatic char    *def_file = ".datadict";    /* default data dict name */
  289. Xstatic struct fdesc    *dd_current;    /* used by firstdd, nextdd */
  290. X
  291. Xint
  292. Xmain(argc, argv)
  293. X    int    argc;
  294. X    char    *argv[];
  295. X{
  296. X    struct fdesc    *fl_base = FDNULL, *curr_fl;    /* fields in cmd line */
  297. X    struct fdesc    *dd_base = FDNULL, *curr_dd;    /* fields from dict */
  298. X    char    *ddname = CNULL;
  299. X    int    fld_count = 0;
  300. X    Bool    exclude = False;
  301. X    extern char *    Cmdname;
  302. X
  303. X    Cmdname = argv[0];
  304. X    if ( !argcheck( argc, argv, &fl_base, &ddname, &exclude ) )
  305. X        exit(1);
  306. X    if ( ! loaddd( &dd_base, ddname ) )
  307. X        exit(1);
  308. X    fld_count = build_outlist( &fl_base, dd_base, ddname, exclude );
  309. X    data_filter( fl_base, fld_count );
  310. X    exit(0);
  311. X}
  312. X
  313. X
  314. XBool
  315. Xargcheck( argc, argv, p_fl_base, p_ddname, p_exclude )
  316. X    int    argc;
  317. X    char    *argv[];
  318. X    struct fdesc    **p_fl_base;
  319. X    char    **p_ddname;
  320. X    char    *p_exclude;
  321. X{
  322. X    int    idx;
  323. X    char    Usage[256];
  324. X    Bool    gotdd = False;    /* data dictionary specified on cmd line */
  325. X    Bool    result = True;
  326. X    struct fdesc    *curr_fl;
  327. X    extern char    *Cmdname;
  328. X
  329. X    sprintf( Usage,
  330. X        "Usage: %s -x -f <data-dictionary> <field> [<field>]\n",
  331. X        Cmdname);
  332. X    if ( argc <= 1 )
  333. X    {
  334. X        fprintf(stderr, Usage);
  335. X        result = False;
  336. X    }
  337. X
  338. X    for ( idx = 1; idx < argc && result; idx++)
  339. X    {
  340. X        if ( *argv[idx] == '-' )
  341. X        {
  342. X            switch ( argv[idx][1] )
  343. X            {
  344. X            case 'f':        /* next arg is data dictionary*/
  345. X                if ( idx == argc - 1 ) /* -f is last argument */
  346. X                {
  347. X                    fprintf(stderr, Usage );
  348. X                    result = False;
  349. X                }
  350. X                else if ( gotdd ) /* already have a -f */
  351. X                {
  352. X                    fprintf(stderr, Usage);
  353. X                    result = False;
  354. X                }
  355. X                else
  356. X                {
  357. X                    gotdd = True;
  358. X                    *p_ddname = argv[ ++idx ];
  359. X                }
  360. X                break;
  361. X            case 'x':        /* exclude named fields */
  362. X                *p_exclude = True;
  363. X                break;
  364. X            default:        /* unkown flag */
  365. X                fprintf(stderr, Usage);
  366. X                result = False;
  367. X                break;
  368. X            }
  369. X        }
  370. X        else    /* not a flag, must be a field name */
  371. X        {
  372. X            if (*p_fl_base == FDNULL )
  373. X                curr_fl = newfd(p_fl_base, argv[idx], 0) ;
  374. X            else
  375. X                curr_fl = newfd( &(curr_fl->fd_next),
  376. X                    argv[idx],0);
  377. X        }
  378. X    }
  379. X    return result;
  380. X}
  381. X
  382. X
  383. X
  384. XBool
  385. Xloaddd( p_dd_base, ddname )
  386. X    struct fdesc    **p_dd_base;
  387. X    char    *ddname;
  388. X{
  389. X    Bool    result = True;
  390. X    struct fdesc    *curr_dd;
  391. X    FILE    *ddfp;
  392. X    char    namebuf[80];
  393. X    int    fieldno;
  394. X    extern char    *Cmdname;
  395. X    extern char    *def_file;
  396. X
  397. X    if ( ddname == CNULL )
  398. X        ddname = def_file;
  399. X
  400. X    if ( (ddfp = fopen( ddname, "r" )) == FNULL )
  401. X    {
  402. X        fprintf(stderr,
  403. X            "%s: unable to open data dictionary file\n",
  404. X            Cmdname);
  405. X        perror( ddname );
  406. X        result = False;
  407. X    }
  408. X    else
  409. X        /* load up the data dictionary list */
  410. X        while (fscanf(ddfp, "%s %d\n", namebuf, &fieldno ) == 2)
  411. X        {
  412. X            if ( *p_dd_base == FDNULL )
  413. X                curr_dd = newfd( p_dd_base,
  414. X                    namebuf, fieldno );
  415. X            else
  416. X                curr_dd = newfd( &(curr_dd->fd_next),
  417. X                    namebuf, fieldno);
  418. X            if ( curr_dd->fd_fldno < 1 )
  419. X            {
  420. X                fprintf(stderr,
  421. X                    "%s: field \"%s\" has an illegal field number (%d) in %s\n",
  422. X                    Cmdname, curr_dd->fd_name, 
  423. X                    curr_dd->fd_fldno, ddname );
  424. X                result = False;
  425. X                break;
  426. X            }
  427. X        }
  428. X    return result;
  429. X}
  430. X
  431. XBool
  432. Xfinddd( p_ddrec, dd_base, searchstr )
  433. X    struct fdesc    **p_ddrec;
  434. X    struct fdesc    *dd_base;
  435. X    char    *searchstr;
  436. X{
  437. X    struct fdesc    *curr_dd;
  438. SHAR_EOF
  439. echo "End of part 11"
  440. echo "File src/testfiles/test3.c is continued in part 12"
  441. echo "12" > s2_seq_.tmp
  442. exit 0
  443.  
  444.  
  445.